主要内容

一、JSP
1.1 JSP的基础语法
1.1.1 注释
JSP中支持两种注释语法操作:
一种是显示注释,这种注释允许客户端看见;另一种是隐式注释,这种注释客户端无法看见。
①显示注释:从HTML风格继承而来
②隐式注释:从JAVA风格继承;jsp自己的注释
JSP的三种方式:
- //单行注释
/* 多行注释*/<!--HTML风格的注释-->
<%-- JSP注释--%>
1.1.2 Scriptlet
JSP中的脚本小程序,所有嵌入HTML代码中的java程序,但是不建议使用,因为使用时会导致耦合过高。
JSP中的三种Scriptlet代码:
第一种:
<% %>
: java脚本段,可以定义局部变量、编写语句
第二种:<%! %>
::声明,可以定义全局(成员)变量、方法、类
第三种:<%= %>
:表达式,数据一个变量或具体类容
第一种和第三种生成的代码是在servlet的方法中,第二种生成的代码在servlet的类体中。
1.2 JSP的指令标签
使用包含操作,可以将一些重复的代码包含进来继续使用,从正常的页面组成来看,有时可能分为几个区域。而其中的一些区域可能是一直不需要改变的,改变的就其中的一个具体内容区域。现在有两种方法可以实现上述功能。
方法一:在每个JSP页面(HTML)都包含工具栏、头部信息、尾部信息、具体内容
方法二:将工具栏、头部信息、尾部信息都分成各个独立的文件,使用的时候直接导入
很明显,第二种方法比第一种更好,第一种会存在很多重复的代码,并且修改很不方便,在JSP中如果要想实现包含的操作,有两种做法:静态包含、动态包含,静态包含使用include 指令即可,动态包含则需要使用include动作标签。
1.2.1 include 静态包含
<%@ include file="要包含的文件路径"%> <!-- 相对路径 -->
静态包含就是将内容进行了直接的替换,就好比程序中定义的变量一样是在servlet引擎转译时,就把此文件内容包含了进去(两个文件的源代码整合到一起,全部放到_jspService方法中),所以只生成了一个servlet,所以两个页面不能有同名的变量。运行效率高一点点。耦合性较高,不够灵活。
特点:
- 将内容进行了直接的替换
- 静态包含只生成一个源码文件,最终的内容在一个jspservice方法体中,
- 不能出现同名变量
- 运行效率高一点点,耦合性较高,不够灵活。
1.2.2 include 动态包含
<jsp:include page="要包含的页面路径"></jsp:include>
特点:
- 动态包含相当于方法的调用
- 动态包含生成多个源码文件
- 可以定义同名变量
- 效率高,耦合度低
注意:当动态包含不需要传递参数时,include双标签之间不要有任何内容
使用动态包含传递参数:
<jsp:include page="要包含的页面路径">
<jsp:param name="参数名" value="参数值"/>
</jsp:include>
注意:name属性不支持表达式,value属性支持表达式
获取动态包含传递的数(被包含的j页面中):
<%
request.getParameter("参数名");
%>
1.3 JSP的四大域对象
1.3.1 四种属性范围
在JSP中提供了四种属性的保存范围,所谓的属性保存范围,指的就是一个设置的对象,可以再多少个页面中保存并可以继续使用
- page范围
pageContext :只在一个页面中保存属性,跳转之后无效 - request范围
request:只在一次请求中睐存,服务器跳转后依然有效 - session范围
session :在一次会话范围中,无论何种跳转都可以使用 - application范围
application :在整个服务器上保存
方法 | 类型 | 描述 |
---|---|---|
public void setAttribute(String name, Object o) | 普通 | 设置属性的名称及内容 |
public Object getAttribute(String name) | 普通 | 根据属性名称取属性 |
public void removeAttribute(String name) | 普通 | 删除指定的属性 |
1.3.2 属性范围的特点
- page
本页面取得服务器端跳转()(请求转发)后无效 - request
服务器跳转(请求转发)有效,客户端跳转无效
如果是客户端跳转,则相当于发出了两次请求,那么第一次的请求将不存在了;如果希望不管是客户端还是服务器跳转,都能保存的话,就需要继续扩大范围。 - session
无论客户端还是服务器端都可以取得,但是现在重新开启一个新的浏览器,则无法取得之前设置的session了,因为每一个session只保存在当前的浏览器当中,并在相关的页面取得。
对于服务器而言,每一个连接到它的客户端都是一个session
如果想要让属性设置一次之后,不管是否是新的浏览器打开都能取得则可以使用application - application
所有的application属性直接保存在服务器上,所有的用户(每一个session)都可以直接访问取得
只要是通过application设置的属性,则所有的session都可以取得,表示公共的内容,但是如果此时服务器重启了,则无法取得了,因为关闭服务器后,所有的属性都消失了,所以需要重新设置。
JSP中跳转方式:
-
服务器跳转(请求转发)
<jsp: forward page=“跳转的页面地址”></jsp:forward> -
客户端跳转
超链接
1.4 EL表达式的使用
1.4.1 EL表达式的语法
EL (Expression Language)是为了使JSP写起来更加简单。表达式语言的灵感来自于ECMAScript和XPath表达式语言,它提供了在JSP中简化表达式的方法,让Jsp的代码更加简化。
语法结构非常简单:
${expression}
EL表达式一般操作的都是域对象中的数据,操作不了局部变量。
域对象的概念在JSP中一共有四个: pageContext, request, session, application;范围依次是,本页面,一次请求,一次会话,整个应用程序。
当需要指定从某个特定的域对象中查找数据时可以使用四个域对象对应的空间对象,分别是: pageScope,requestScope, sessionScope, applicationScope。
EL默认的查找方式为从小到大查找,找到即可。当域对象全找完了还未找到则返回空字符串""。
1.4.2 EL表达式的使用
1.获取List
获取List的size ${list.size()}
获取List的指定卞标的值 ${list[下标]}
注意:list代表的是限域变量名
2.获取Map
获取Map中指定key的value ${map.key}
或 ${map["key"]}
注意:map代表的是限域变量名
3.获取JavaBean对象
获取JavaBean对象:${user}
获取JavaBean中的属性:${javaBean.属性名}
或${javaBean对象.get属性名()}
注:JavaBean中的属性字段必须提供get方法
4.empty
判断域对象是否为空
用法:${empty 域变量名}
为空,返回true;
不为空,返回false;
如果域对象是字符串:
不存在的域对象:true;
空字符串(""):true;
null:true;
如果域对象是List:
null:true;
没有长度的List(size==0):true;
如果域对象是Map:
null:true;
map为空,没有key和value:true;
如果域对象是JavaBean对象:
null:true;
空对象(刚new出来):false;
5.判断域对象不为空
与empty相反
用法:${!empty 限域变量名}
6.等值判断
比较两个值是否相等,返回true或false
==
或 eq
${限域变量1 ==
限域变量2}
${限域变量1 eq 限域变量2}
${限域变量 ==
数字}
${限域变量 ==
‘abcdefg’}
另{}中还可以大小比较和数值运算
二、JSTL
2.1 标签的使用
Java Server Pages Standard Tag Libray(JSTL): JSP标准标签库,是一个定制标签类库的集合,用于解决一些常见的问题,例如迭代一个映射或者集合、条件测试、XML处理,甚至数据库和访问数据库操作等。
核心标签库:
http://java.sun.com/jsp/jstl/core
包含Web应用的常见工作,比如:循环、表达式赋值、基本输入输出等。
格式化标签库:
http://java.sun.com/jspljstl/fmt
用来格式化显示数据的工作,比如:对不同区域的日期格式化等。
为了在JSP页面使用JSTL类库,必须以下列格式使用taglib指令:
<%@taglib uri="" prefix=""%>
例如:
<%@taglib uri="http://java.sun.com/jsp/jst1/core" prefix="c”%>
前缀可以是任意内容,遵循规范可以使团队中由不同人员编写的代码更加相似;所以,建议使用事先设计好的前缀。
使用前需要导入两个包(可在apache官网下载)
2.2 条件动作标签
条件动作指令用于处理页面的输出结果依赖于某些输入值的情况,在Java中是利用if、if…else和switch语句来进行处理的。
在JSTL中也有4个标签可以执行条件式动作指令: if、 choose、when和otherwise。
2.2.1 if标签
if标签先对某个条件进行测试,如果该条件运算结果为true,则处理它的主体内容,测试结果保存在一个Boolean对象中,并创建一个限域变量来引用Boolean对象。可以利用var属性设置限域变量名,利用scope属性来指定其作用范围。
语法格式:
<c:if test="<boolean>" var="<string>" scope="<string>">
</c:if>
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
test | 条件 | 是 | 无 |
var | 用于存储条件结果的变量(限域变量名) | 否 | 无 |
scope | var的作用域,可取值: page request session application | 否 | page |
注意:
1.标签操作的一般都是域对象
2.if标签没有else,如果想要else的效果,就需要两个相反的条件
例:
<c:if test="${num > 100}" var="flag" scope="session">
数值大于100,${sessionScope.flag}或${flag}
</c:if>
2.2.2 choose、when和otherwise标签
choose和when标签的作用与Java中的switch和case关键字相似,用于在众多选项中做出选择。也就是说:他们为相互排斥的条件式执行提供相关内容。
switch语句中有case,而choose标签中对应有when,switch语句中有default,而choose标签中有otherwise。
JAVA | JSTL |
---|---|
switch | choose |
case | when |
default | otherwise |
语法格式:
<c:choose>
<c:when test="<boolean>">
...
</c:when>
<c:when test="<boolean>">
...
</c:when>
<c:otherwise>
...
</c:otherwise>
</c:choose>
属性:
- choose标签没有属性
- when标签只有一个test属性
- otherwise标签没有属性
注意:
- choose标签和otherwise标签没有属性
- choose标签中必须包含至少一个when标签,可以没有otherwise标签
- otherwise标签必须设置在最后一个when标签之后
- choose标签中只能设置when标签或者otherwise标签
- when标签和otherwise标签中可以嵌套其他标签
- otherwise标签会在所有的when标签不执行时才会执行
2.3 迭代标签
forEach是将一个主体内容迭代多次,或者迭代一个对象集合。可以迭代的对象包括所有的java.util.Collection和java.util.Map接口的实现,以及对象或者基本类型的数组。他还可以迭代
java.util.lterator和java.util.Enumeration,但不能在多个动作指令中使用lterator或者Enumeration,因为lterator或者Enumeration都不能重置(reset)。
2.3.1 forEach标签
相当于java中的foreach
语法格式:
<c:forEach
items="<object>"
begin="<int>"
end="<int>"
step="<int>"
var="<string>"
varstatus="<string>">
</c:forEach>
属性:
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
items | 要被循环的数据 | 否 | 无 |
begin | 开始的元素(0=第一个元素,1=第二个元素) | 否 | 0 |
end | 最后一个元素(0=第一个元素,1=第二个元素) | 否 | Last element |
step | 每一次迭代的步长 | 否 | 1 |
var | 代表当前条目的变量名称(限域变量名) | 否 | 无 |
varStatus | 代表循环状态的变量名称 | 否 | 无 |
forEach varstatus 属性
- index:当前这次迭代从О开始的迭代索引.
- count:当前这次迭代从1开始的迭代计数
- first:用来表明当前这轮迭代是否为第一次迭代的标志
- last:用来表明当前这轮迭代是否为最后一次迭代的标志
2.4格式化动作标签
JSTL提供了格式化和解析数字和日期的标签,我们讨论里面有: formatNumber、formatDate,parseNumber及parseDate。
引入格式化标签库
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
2.4.1 formatNumber标签
formatNumber标签用于格式化数字,百分比,货币。该标签用指定的格式或精度来格式化数字。(将数值型数据转换成指定格式的字符串类型。)
数值——>指定格式字符串
语法格式:
<fmt:fromatNumber
value="<string>"
type="<string>"
var="<string>"
scope="<string>"/>
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要显示的数字 | 是 | 无 |
type | NUMBER,CURRENCY,或PERCENT类型 | 否 | Number |
var | 存储格式化数字的变量 | 否 | Print to page |
scope | var属性的作用域 | 否 | page |
注意:
- 如果设置了var属性,则格式化后的结果不会输出,需要通过el表达式获取var对应的限域变量名
- 默认的类型(type)的取值为number。可取值: number数值型、percent百分比类型、currency货币型
设置时区:
<fmt:setLocale value="en_US"/>
<--设置时区转换成对应的符号,如:en_US时区对应的是$符号-->
2.4.2 formatDate标签
formatDate标签用于使用不同的方式格式化日期。(将Date型数据转换成指定格式的字符串类型。
语法格式:
<fmt:formatDate
value="<string>"
type="<string>"
dateStyle="<string>"
timeStyle="<string>"
pattern="<string>"
timeZone="<string>"
var="<string>"
scope="<string>"/>
属性:
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要显示的日期 | 是 | 无 |
type | DATE,TIME,或BOTH | 否 | date |
dateStyle | FULL,LONG, MEDIUM,SHORT,或 DEFAULT | 否 | default |
timeStyle | FULL,LONG,MEDIUM, SHORT,或 DEFAULT | 否 | default |
pattern | 自定义格式模式 | 否 | 无 |
timeZone | 显示日期的时区 | 否 | 默认时区 |
var | 存储格式化日期的变量名 | 否 | 显示在页面 |
scope | 存储格式化日志变量的范围 | 否\页面 |
自定义类型格式
代码 | 描述 | 实例 |
---|---|---|
y | 不包含纪元的年份。如果不包含纪元的年份小于10,则显示不具有前导零的年份。 | 2002 |
M | 月份数字。一位数的月份没有前导零。 | April &04 |
d | 月中的某一天。一位数的日期没有前导零。 | 20 |
h | 12小时制的小时。一位数的小时数没有前导零。 | 12 |
H | 24小时制的小时。一位数的小时数没有前导零。 | 0 |
m | 分钟。一位数的分钟数没有前导零。 | 45 |
s | 秒。一位数的秒数没有前导零。 | 52 |
2.4.3 parseNumber标签
parseNumber标签用来解析数字,百分数,货币。(parseNumber标签可以将数字、货币或百分比类型的字符串转换成数值型。)
指定格式字符串 ——> 数值
语法格式:
<fmt:parseNumber
value="<string>"
type="<string>"
var="<string>"
scope="<string>"/>
属性:
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要解析的数字 | 否 | Body |
type | NUMBER,CURRENCY,或PERCENT | 否 | number |
var | 存储待解析数字的变量 | 否 | Print to page |
scope | var属性的作用域 | 否 | page |
2.4.4 parseDate标签
parseDate标签用于解析日期。(将指定格式的字符串转换成Date类型。)
语法格式:
<fmt:parseDate
value="<string>"
type="<string>"
dateStyle="<string>"
timeStyle="<string>"
pattern="<string>"
timeZone="<string>"
var="<string>"
scope="<string>"/>