JSTL标签与EL表达式
一、JSP表达式语言EL
1. EL表达式和JSP脚本表达式
简单的EL表达式:
<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">
<html>
<body>
${sampleValue + 1} <br>
</body>
</html>
① EL表达式总是放在大括号里,而且前面有一个美元符号前缀
Eg:${person.name}
② 用JSP脚本表达式设置一个<div>元素的style属性的代码为:
<divstyle=<%=mystyle%>>Hello</div>
用EL表达式的代码为:
<div style=${mystyle}>Hello</div>
区别:
所有的EL表达式以”${”开始,以“}”结尾,而所有的JSP脚本表达式是以”<%”开始,以”%>”结尾
③ 使用JSP脚本表达式在JSP中定义一个变量
Eg:<%!int JSPvariable=100;%>
JSPvariable的值是:<%=JSPvariable%>
EL的主要目标是从JSP页面中消除Java代码,所以EL表达式不能在脚本中定义变量的,不能自己定义变量。
2. 在EL表达式中使用隐式变量
|
类别 隐式变量名 描述 Eg |
JSP pageContext 当前页面的pageContext ${pageContext.request.method} |
作用域 pageScope page作用域 |
requestScope request作用域 |
sessionScope Session作用域 ${ sessionScope .totalPrice} |
applicationScope Application作用域 |
|
请求参数 param Request对象的参数,字符串 ${ param .name}或${param[“name”]} |
paramValues Request对象的参数,字符串集合 |
|
请求头 header HTTP信息头,字符串 ${ header .accpt} |
headerValues HTTP信息头,字符串集合 |
|
Cookie cookie Cookie值 |
用于返回Servlet的getCookies()方法的结果
注:当容器解析EL表达式中的变量时,eg:${x}中的x,容器首先检查隐式变量。若找不到则依次查找page/request/session/application范围的属性。若还未找到就返回null。
1).默认变量pageScope、requestScope、sessionScope、applicationScope
这4个默认变量包含Scope作用范围的参数集合,相当于被保存在java.util.Map中的某个参数。
eg:使用sessionScope变量的EL表达式
<%request.getSession().setAttribute("sampleValue",new Integer(10));%>
${sessionScope.sampleValue}
取得保存在Session中参数的sessionScope变量的EL表达式,“.”是property访问操作符,在这里表示从Session中取得“键”为“sampleValue”的参数,并显示出来。显示结果为“10”。
2).默认变量param、paramValues
这两个默认变量包含请求参数的集合,param表明请求包含的参数为单一控件,paramValues表明请求包含的参数为控件数组。
eg:提交请求的页面和接受的页面
<%@page contentType="text/html; charset=UTF-8"%>
<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<formaction="SampleJsp.jsp">
<inputtype="text" name="sampleValue" value="10">
<inputtype="text" name="sampleValue" value="11">
<inputtype="text" name="sampleValue" value="12">
<inputtype="text" name="sampleSingleValue"value="SingleValue">
<inputtype="submit" value="Submit">
</form>
</body>
</html>
在这个页面中定义了两组控件,控件名为“sampleValue”的是一套控件数组,控件名为“sampleSingleValue”的是单一控件,通过递交将请求参数传送到SampleJsp.jsp。
<%@page contentType="text/html; charset=UTF-8"%>
<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
${paramValues.sampleValue[2]}<br>
${param.sampleSingleValue}<br>
</body>
</html>
这是请求转发到的页面,通过EL表达式的paramValues变量得到控件数组中最后一个控件的递交参数,通过EL表达式的param变量得到单一控件的递交参数。控件数组参数的EL表达式使用“[]”来指定数组下标。本示例将显示控件数组中最后一个控件的值“12”和单一控件的值“SingleValue”。
3. EL运算符
1) 用于访问属性和集合的EL运算符:属性访问运算符使我们可以访问对象的成员,集合访问运算符可以返回Map/List/Array中的元素。
在EL中,这两种运算符的格式为:
① a.b:返回a的属性b的值。
② a[b]:返回a的键或索引为b的值。
Eg:若b是一个字符串,这两个运算符在EL中的操作方式是可以互换的。
${header[“host”]}
${header[‘host’]}
${header.host}
将产生相同的结果。在这种情况下,header是一个Map,所以会调用header.get(“host”)方法来取得并显示这EL表达式的结果。
HeaderValues.host则会返回一个数组,若要取出第0个元素,则:
${headerValuse.host[“0”]}
${headerValuse.host[‘0’]}
${headerValuse.host[0]}
2) EL算术、关系、逻辑运算符
类型 操作 运算符 示例 示例结果 |
算 加 + ${6.80+-12} -5.2 |
术 减 - |
运 乘 * ${2*3.14159} 6.283110. |
算 除 /或div ${-30.0/5} -6.0 |
符 取模 %或mod ${24%5} 4 |
|
关 等于 ==或= |
系 不等于 != |
运 小于 <或it |
算 大于 >或gt |
符 小于等于 <=或le |
大于等于 >=或ge |
|
逻辑 逻辑与 &&或and |
运算符 逻辑或 ||或or |
逻辑非 !或not |
|
其它 是否为空 empty |
条件运算 a?b:c |
操作符 |
功能和作用 |
. |
访问一个bean属性或者Map entry |
[] |
访问一个数组或者链表元素 |
() |
对子表达式分组,用来改变赋值顺序 |
? : |
条件语句,比如:条件?ifTrue:ifFalse 如果条件为真,表达式值为前者,反之为后者 |
+ |
数学运算符,加操作 |
- |
数学运算符,减操作或者对一个值取反 |
* |
数学运算符,乘操作 |
/ 或div |
数学运算符,除操作 |
% 或mod |
数学运算符,模操作(取余) |
== 或eq |
逻辑运算符,判断符号左右两端是否相等,如果相等返回true,否则返回false |
!= 或ne |
逻辑运算符,判断符号左右两端是否不相等,如果不相等返回true,否则返回false |
< 或lt |
逻辑运算符,判断符号左边是否小于右边,如果小于返回true,否则返回false |
> 或gt |
逻辑运算符,判断符号左边是否大于右边,如果大于返回true,否则返回false |
<= 或le |
逻辑运算符,判断符号左边是否小于或者等于右边,如果小于或者等于返回true,否则返回false |
>= 或ge |
逻辑运算符,判断符号左边是否大于或者等于右边,如果大于或者等于返回true,否则返回false |
&& 或and |
逻辑运算符,与操作赋。如果左右两边同为true返回true,否则返回false |
|| 或or |
逻辑运算符,或操作赋。如果左右两边有任何一边为true返回true,否则返回false |
! 或not |
逻辑运算符,非操作赋。如果对true取运算返回false,否则返回true |
empty |
用来对一个空变量值进行判断: null、一个空String、空数组、空Map、没有条目的Collection集合 |
func(args) |
调用方法, func是方法名,args是参数,可以没有,或者有一个、多个参数.参数间用逗号隔开 |
Eg:
${pageScope.sampleValue + 12} <br> //显示12
${(pageScope.sampleValue + 12)/3} <br> //显示4.0
${(pageScope.sampleValue + 12) /3==4} <br> //显示true
${(pageScope.sampleValue + 12) /3>=5} <br> //显示false
<input type="text"name="sample1" value="${pageScope.sampleValue + 10}"> //显示值为10的Text控件
在EL表达式中不能使用Java方法。
二、标准标记库JSTL
Sun发布的标准JSTL1.1标签库有以下几个标签:
1)核心标签库:包含Web应用的常见工作,比如:循环、表达式赋值、基本输入输出等。
2)国际化标签库:用来格式化显示数据的工作,比如:对不同区域的日期格式化等。
3)数据库标签库:可以做访问数据库的工作。
4)XML标签库:用来访问XML文件的工作,这是JSTL标签库的一个特点。
5)函数标签库:用来读取已经定义的某个函数。
1.通用标记
①用于异常捕获的<c:catch>标签
<c:catch var="err">
会抛出异常的代码
</c:catch>
如果标记之间的代码抛出了异常,异常的值会存储在页面范围变量e中。
否则,e会被删除。
<c:catch>标签允许在JSP页面中捕捉异常。它包含一个var属性,是一个描述异常的变量,改变量可选。若没有var属性的定义,那么仅仅捕捉异常而不做任何事情,若定义了var属性,则可以利用var所定义的异常变量进行判断转发到其他页面或提示报错信息。
Eg:
<c:catch var="err">
${param.sampleSingleValue[9] == 3}
</c:catch>
${err}
当“${param.sampleSingleValue[9] == 3}”表达式有异常时,可以从var属性“err”得到异常的内容,通常判断“err”是否为null来决定错误信息的提示。
②用于显示的 <c:out>标签 <c:out>标签是一个最常用的标签,用于在JSP中显示数据。 类似于JSP脚本表达式<%=…%> 有一个必须的属性value,标记的功能就是显示value的值。 Eg:<c:out value=”${color}”/> 第一:如果value属性包括字符<、>、‘、”或者&,标记会显示相关的字符码 eg:”>”显示成”>”…… 第二:如果属性的变量还没有初始化,我们可以指定一个默认的值。通过第二个属性default设置。Eg:<c:out value=”${color}” default=”red” /> |
2.变量支持标记
①用于赋值的<c:set>标签 <c:set>标签属性和说明:在设置JavaBean和Map时
|
||||||||||||
当不存在value的属性时,将以包含在标签内的实体数据作为赋值的内容。 |
Eg1:<c:set var=”num” value=”${4*4}”/>
和
<c:set var=”num”> ${8*2} </c:set>
这两种方式都将num变量的值设置为16。第二种方式允许我们在<c:set>标记内插入标记操作。Eg:<c:set var=”num”>
<c:out value=”${8+8}”/>
</c:set>输出结果相同
Eg2:若要设置JavaBean对象customer1的zipcode属性
<c:set target=”customer1” property=” zipcode”> 55501 </c:set>
或 <c:set target=”customer1” property=” zipcode” value=”55501”>
②用于删除的<c:remove>标签
<c:remove>标签用于删除存在于scope中的变量。
<c:remove>标签属性和说明
属性 |
描述 |
var |
需要被删除的变量名,指定变量的名称 |
scope |
(可选)变量的作用范围。指定其作用域,若不指定则先查找page作用域,然后是request,然后是session,最后是application |
eg:
使用<c:remove>标记从session作用域删除num变量
<c:remove var="num" scope="session"/>
${sessionScope.num} <br>EL表达式显示该变量时,该变量已经不存在了。
<c:remove>标记不能用于JavaBean和Map对象。
3.流程控制
1)JSTL条件处理
标记<c:if>和<c:choose>的功能,与普通Java代码中的if和switch-case语句基本一样。不同:没有else标记,同时这两个标记都需要一个用于设置布尔表达式的test属性。
Eg:只在显示x=9时才显示x的值:
<c:if test=”${x==’9’}”> ${x} </c:if>
注:变量的测试值必须用单引号括起来
标记<c:choose>本身并不包含任何属性,但它可以包含多个<c:when>标记,<c:when>标记中实现比较与测试属性分离。
Eg:基于color变量的值显示不同的文本
<c:choose>
<c:when test=”${color==’white’}”>
Light!
</c:when>
<c:when test=”${color==’black}”>
Dark!
</c:when>
<c:otherwise>
Colors!
</c:otherwise>
</ c:choose>
在JSTL的<c:choose>标记中,当没有满足条件时,我们使用可能的<c:otherwise>标记作为默认选项。
2)循环
①<c:forEach>标签
<c:forEach>为循环控制标签。<c:forEach>标签属性和说明
属性 |
描述 |
items |
进行循环的集合(可选) |
begin |
开始条件(可选) |
end |
结束条件(可选) |
step |
循环的步长,默认为1(可选) |
var |
做循环的对象变量名,若存在items属性,则表示循环集合中对象的变量名(可选) |
varStatus |
显示循环状态的变量(可选) |
Eg1:
<%ArrayList arrayList = new ArrayList();
arrayList.add("aa");
arrayList.add("bb");
arrayList.add("cc");
%>
<%request.getSession().setAttribute("arrayList",arrayList);%>
<c:forEach items="${sessionScope.arrayList}"var="arrayListI">
${arrayListI}
</c:forEach>
该示例将保存在Session中的名为“arrayList”的ArrayList类型集合参数中的对象依次读取出来,items属性指向了ArrayList类型集合参数,var属性定义了一个新的变量来接收集合中的对象。最后直接通过EL表达式显示在页面上。
Eg2:简单循环:
<c:forEach var="i" begin="1" end="10"step="1">
${i}<br />
</c:forEach>
该示例从“1”循环到“10”,并将循环中变量“i”显示在页面上。
②<c:forTokens>标签
<c:forTokens>标签可以根据某个分隔符分隔指定字符串,
相当于java.util.StringTokenizer类。
<c:forTokens>标签属性和说明
属性 |
描述 |
items |
进行分隔的EL表达式或常量 |
delims |
分隔符 |
begin |
开始条件(可选) |
end |
结束条件(可选) |
step |
循环的步长,默认为1(可选) |
var |
做循环的对象变量名(可选) |
varStatus |
显示循环状态的变量(可选) |
语法形式:
<c:forTokens items="..." delims="…" [var="…"] [varStatus=”…”] [begin="…"] [end="…" ] [step="…"] >
内容体
</c:forTokens>
eg:
<c:forTokens items="aa,bb,cc,dd" begin="0"end="2" step="2" delims=","var="aValue">
${aValue}
</c:forTokens>
需要分隔的字符串为“aa,bb,cc,dd”,分隔符为“,”。begin属性指定从第一个“,”开始分隔,end属性指定分隔到第三个“,”,并将做循环的变量名指定为“aValue”。由于步长为“2”,使用EL表达式${aValue}只能显示“aa
4.用JSTL访问URL信息
①<c:url>,重写URL并对其参数编码
<c:url>标签用于得到一个 URL地址。
<c:url>标签属性和说明
属性 |
描述 |
value |
页面的URL地址 |
context |
Web Context该属性用于得到不同Context下的URL地址,当出现context属性时,必须以“/”开头,此时也需要url属性以“/”开头(可选) |
charEncoding |
URL的字符集(可选) |
var |
存储URL的变量名(可选) |
scope |
变量名作用范围(可选)取值包括(page、) |
下面看一个示例:
<c:url value="/MyHtml.html" var="urlPage" />
<a href="${urlPage}">link</a>
得到了一个 URL后,以 EL 表达式放入 <a> 标签的 href属性,达到链接的目的。
②<c:import>:访问web应用程序之外的内容
若想访问Servlet容器外的内容,就必须使用<c:import>标记,通过url属性将URL的内容添加到JSP引用。URL可以是相对的,也可以是绝对的,若以斜线开始就会被当作应用程序内的绝对地址。可使用context属性设置URL的内容。
与<c:url>配合,使用<c:url>的var属性保存输入的内容;使用scope属性设置变量的作用域;或使用charEncoding属性控制其编码格式;可在<c:import>标记的内容中使用<c:param>标记,将参数添加到URL中。
Eg:创建一个变量newstuff,将变量设置等于content.html URL的内容中,在访问URL时添加两个参数:
<c:import url=”/content.html”> var=” newstuff” scope=”session”>
<c:param name=”par1” value=”val1”/>
<c:param name=”par2” value=”val2”/>
</c:import>
③<c:redirect>:重定向到不同的URL
<c:redirect>用于页面的重定向,该标签的作用相当于 response.setRedirect方法的工作。它包含 url和 context 两个属性,属性含义和 <c:url>标签相同。Eg1:
<c:redirect url="/MyHtml.html"/>
该示例若出现在 JSP中,则将重定向到当前 Web Context下的“ MyHtml.html ”页面,一般会与 <c:if>等标签一起使用。
可以在<c:redirect>标记中使用context属性指定URL的上下文,使用<:param>标记添加参数。Eg2:
<c:redirect url=”/content.html”>
<c:param name=”par1” value=”val1”/>
<c:param name=”par2” value=”val2”/>
<c:redirect>