EL表达式与JSTL
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EL和JSTL
主要内容
✓EL表达式
✓JSTL标签库
1.EL表达式
EL表达式又称为表达式语言(Expression Language),它是JSP中一个很重要的组成部分。
在JSP页面中使用EL表达式,可以简化对变量和对象的访问。
EL表达式的语法非常的简单,所有的EL表达式都是以“${”开始,以“}”结束,比如${name}。
EL表达式会将表达式中的结果在页面上输出,就像使用JSP的表达式结构或使用out内置对象进行输出一样。
EL表达式对运算符支持
使用EL表达式进行算术运算,在EL表达式中支持+、-、*、/、%运算,示例如下:
代码演示:EL表达式算术运算
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>EL表达式算术运算</title>
</head>
<body>
12 + 15 = ${12+15}<br>
12 * 15 = ${12*15}<br>
12 - 15 = ${12-15}<br>
12 / 15 = ${12/15}<br>
12 % 15 = ${12%15}<br>
</body>
</html>
图1 EL表达式算术运算结果
在EL表达式中还可以支持关系运算符操作,示例如下:
代码演示:EL表达式关系运算符
<body>
12==15 ${12==15}<br>
12<15 ${12<15}<br>
12>15 ${12>15}<br>
12<=15 ${12<=15}<br>
12>=15 ${12>=15}<br>
12!=15 ${12!=15}
</body>
EL表达式除了支持普通的关系运算符外,还可以使用字符来表示关系运算符,下面的写法和上面使用普通关系运算符表示的顺序一一对应:
代码演示:EL表达式关系运算符
<body>
12==15 ${12 eq 15}<br>
12<15 ${12 lt 15}<br>
12>15 ${12 gt 15}<br>
12<=15 ${12 le 15}<br>
12>=15 ${12 ge 15}<br>
12!=15 ${12 ne 15}
</body>
图2 EL表达式关系运算符结果
EL表达式中同样支持逻辑运算:
代码演示:EL表达式逻辑运算
<body>
${12 < 15 && 12 < 15 }<br>
${12 < 15 and 12 < 15 }<br>
${12 < 15 || 12 > 15 }<br>
${12 < 15 or 12 >15 }<br>
${!(12 < 15) }<br>
${not (12 < 15) }
</body>
从上面的代码中可以看出EL表达式中不仅支持&&、||、!方式的逻辑运算符,同样也支持and、or、not方式的逻辑运算符。
在EL表达式中也可以小括号来提升运算符的优先级。
EL表达式中还可以使用empty运算符检测一个值是否为null或者为空。
代码演示:EL表达式empty运算符
<body>
<%
List list = new ArrayList();
list.add("tom");
pageContext.setAttribute("str", null);
pageContext.setAttribute("list", list);
%>
${empty str } ①
${empty list} ②
</body>
代码解析:
①判断内容是否为null
②判断集合list中是否有元素
图3 EL表达式empty运算符
EL表达式中还支持三元表达式方式的条件选择运算,例如:
代码演示:EL表达式条件选择
<body>
${12 < 15 ? 'yes':'no' } ①
</body>
代码解析:
①注意在EL表达式中的字符串需要使用单引号引起来。
EL访问对象
EL表达式的方便性不仅仅体现在对这些算术或关系运算的支持,它还可以很方便的访问对象。
例如在上面讲empty运算符时,使用EL表达式可以访问pageContext空间中的对象。
EL表达式不仅可以访问pageContext中的对象,还可以访问request、session、application 中的对象。
代码演示:EL表达式访问对象
<body>
<%
pageContext.setAttribute("name","tom");
request.setAttribute("age","22");
session.setAttribute("address","中国");
application.setAttribute("score","75.5");
%>
${name}<br>
${age}<br>
${address}<br>
${score}<br>
</body>
图4 EL表达式访问对象
从上面的例子中,可以看出访问对象只需要在EL表达式中写对象的名称即可。
EL表达式默认会从pageContext、reqest、session、application中并按照此顺序寻找名称匹配的对象,如果找不到,则不显示任何内容。
还可以指定从哪个空间中获取对象。
代码演示:EL表达式从指定空间内访问对象
<body>
<%
pageContext.setAttribute("name","tom");
request.setAttribute("age","22");
session.setAttribute("address","中国");
application.setAttribute("score","75.5");
%>
${}<br> ①
${requestScope.age}<br> ②
${sessionScope.address}<br> ③
${applicationScope.score}<br> ④
</body>
代码解析:
①从pageContext中获取对象,pageScope代表pageContext空间。
②从request中获取对象,requestScope代表request空间。
③从session中获取对象,sessionScope代表session空间。
④从application中获取对象,applicationScope代表application空间。
如果空间内存放时一个自定义类的对象,会出现什么样的结果呢?
代码演示:User类
package com.zhaolongedu.vo;
public class User {
private String name;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
= name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return name + "来自" + address;
}
}
代码演示:使用EL表达式访问User类对象
<body>
<%
User user = new User();
user.setAddress("巴西");
user.setName("小黑");
pageContext.setAttribute("user",user);
%>
${user}
</body>
图5 EL表达式访问自定义类对象
通过上面的例子可以看出如果直接输出自定义类的对象,EL表达式将会访问类的toString方法并将返回值进行输出。
当然我们还可以很方便的使用EL表达式获得对象的属性值:
代码演示:EL表达式获取对象属性值
<body>
<%
User user = new User();
user.setAddress("巴西");
user.setName("小黑");
pageContext.setAttribute("user",user);
%>
${}<br> ①
${user.address }<br>
</body>
代码解析:
①通过点“.”运算符来获取对象user中的name属性的值。
再次需要注意要访问的属性
名不一定是和对象的属性名相同,而是要和get方法的方法名去掉“get”后的名字相同。
图6 使用EL表达式访问对象属性
在访问属性时不仅可以使用点“.”运算符,还可以使用“[]”将属性包含其中。
代码演示:使用EL表达式访问对象属性
<body>
<%
User user = new User();
user.setAddress("巴西");
user.setName("小黑");
pageContext.setAttribute("user",user);
%>
${user["name"]}<br>
${user["address"] }<br>
</body>
注意在使用“[]”包含属性时需要将属性使用双引号引起来。
图7 使用EL表达式访问对象属性运行结果
2.JSTL核心标签库
JSTL全称为(JavaServer Page Standard Tag Libray 即:Java标准标签库),是由SUN公司提供的简化JSP页面设计的标签。
JSTL是由Core、I18N、SQL、XML、Functions五个核心标签库组成,其中最重要的是Core标签库和I18N标签库中的格式化标签库。
JSTL和EL表达式通常会一起使用。
在使用JSTL之前需要先下载包含JSTL的jar包,JSTL的Jar包油jstl.jar和standard.jar 组成,下载的网址为/site/downloads/downloads_taglibs-standard.cgi,将下载好的压缩包内jstl.jar和standard.jar放入的Web工程中的lib目录下,并在使用JSTL 的JSP页面上使用taglib指令导入所需要的标签库即可。
Core标签库中包含了基本标签、条件标签、迭代标签。
在使用Core标签时需要在JSP 页面中使用taglib指令导入Core标签库:
<%@ taglib prefix="c" uri="/jsp/jstl/core" %>
Core标签库中的基本标签包括<c:out>、<c:set>、和<c:remove>标签。
<c:set>标签
<c:set>标签用于在某空间中(pageContext、request、session、application)声明变量并赋值,它的属性如下表所示。
表1 <c:set>标签属性
代码演示:Core 标签库<c:set>标签
<body>
<c:set var="name" value="小黑" scope="session"/> ① <c:set var="age" scope="page"> ②
22
</c:set>
<c:set target="${user}" property="name" value="小美"/> ③ <c:set target="${map}" property="name"> ④
Tom
</c:set> </body>
代码解析:
① 在session 空间中设置变量name 的值为“小黑”。
② 在page 空间中设置变量age 的值为“22”,使用value 属性可以为var 变量赋值,同
样也可以写在标签体中为var 变量进行赋值。
③ 获得user 对象并给user 对象的name 属性赋值为“小美”,如果target 获得的对象为
null ,JSTL 会抛出异常。
如果target 的对象为JavaBean ,那么property 中的值为JavaBean 的属性,value 为property 属性的值。
④ 获得map 对象并给map 的对象赋值。
当
target 的对象为java.util.Map 的对象时,
property 作为Map
中的key ,varlue 作为Map 的value 。
可以使用value 属性为property 赋值,也可以在标签体中为property 属性赋值。
✧ <c:out>标签
<c:out>标签用于将空间内的变量进行输出。
表2 <c:out>标签属性
代码演示:Core标签库<c:out>标签
<body>
<c:set var="name" value="小黑" scope="session"/>
<c:set var="age" scope="page">
22
</c:set>
<c:set var="code" value="<b>hello</b>"/>
<c:out value="${name}"/> <br/> ①
<c:out value="${age}"/><br/>
<c:out value="${address}" default="没有值"/><br/> ②
<c:out value="${address}">
还是没有值
</c:out> <br/>
<c:out value="${code}"/><br/> ③
<c:out value="${code}" escapeXml="false"/> ④
</body>
代码解析:
①输出变量名为name的值。
②输出变量名为address的值,因为变量address未声明,所以获得的值为null。
如果
value为null,则会显示default中的值,或显示标签体中的值。
③输出变量名为code的值,变量code中包含有HTML的值。
在<c:out>中escapeXml
属性默认为true,所以HTML代码会被原样输出不会被执行。
④将escapeXml值设置为false,code变量中的HTML值会被浏览器解析,运行结果如
下:
图8 JSTL<c:out>标签
✧<c:remove>标签
<c:remove>标签用于将变量从空间内移除。
表3 <c:remove>标签属性
代码演示:Core标签库<c:remove>标签
<body>
<c:set var="name" value="小黑" scope="session"/>
<c:remove var="name" scope="session"/> ①
</body>
代码解析:
①从session空间中删除name变量。
下面来学习条件标签,条件标签包括<c:if>、<c:choose>、<c:when>和<c:otherwise>。
✧<c:if>标签
<c:if>标签的作用和Java语言中的if语句功能是相同的。
表4 <c:if>标签属性
代码演示:Core标签库<c:if>标签
<body>
<c:if test="${12 > 10}" var="result" scope="page"> ①
12 大于10 test的结果为${result }
</c:if>
<c:if test="${12 < 10}">
12 小于10
</c:if>
</body>
代码解析:
①如果test条件成立,将条件返回值存储到page空间内的result变量中。
注意var属
性和scope属性不是必须的,但是如果使用scope属性,则必须使用var属性。
<c:choose>、<c:when>和<c:otherwise>标签
<c:choose>、<c:when>和<c:otherwise>一起实现Java语言中的if/else功能。
<c:choose>标签是<c:when>和<c:otherwise>标签的父标签,在<c:choose>标签中只能出现这两个子标签。
代码演示:Core标签库<c:choose>标签
<body>
<c:set var="name" value="tom"></c:set>
<c:choose>
<c:when test="${name eq 'jerry'}"> ①
jerry
</c:when>
<c:when test="${name eq 'tom'}">
tom
</c:when>
<c:otherwise> ②
other name
</c:otherwise>
</c:choose>
</body>
代码解析:
①如果<c:when>标签test条件返回值true,该<c:when>标签体则会执行。
②如果<c:choose>标签中的<c:when>标签都不成立,则执行<c:otherwise>标签体。
<c:forEach>标签
<c:forEach>标签为Core标签库中的迭代标签,主要属性有:
表4 <c:forEach>标签属性
代码演示:将数组和集合存入到request空间内
<%@ page language="java" import=" java.util.*" pageEncoding="UTF-8"%>
<%
Map<String,String> map = new HashMap<String,String>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
List<String> list = new ArrayList<String>();
list.add("list1");
list.add("list2");
list.add("list3");
String[] strs = {"str1","str2","str3"};
request.setAttribute("list",list);
request.setAttribute("strs",strs);
request.setAttribute("map",map);
request.getRequestDispatcher("jstl1.jsp").forward(request,response);
%>
代码演示:使用<c:forEach>标签迭代数组和集合
<body>
对数组的迭代:<br/>
<c:forEach var="str" items="${strs}" varStatus="status"> ①
${status.count}
${str}<br/>
</c:forEach>
对List集合的迭代:<br/>
<c:forEach var="listItem" items="${list}" begin="0" end="1"> ②
${listItem}<br/>
</c:forEach>
对Map集合的迭代:<br/>
<c:forEach var="mapItem" items="${map}"> ③
${mapItem.key} : ${mapItem.value}<br/>
</c:forEach>
</body>
代码解析:
①迭代数组,将数组中每个元素存储到str变量中并在迭代体中输出。
在varStatus属
性中声明迭代状态对象status,该对象有index、count、frist、last四个属性,分别代表当前元素的索引、当前元素是第几个元素、当前元素是否为第一个元素、当前元素是否为最后一个元素。
②对List集合的迭代,begin属性指定了迭代的开始索引,end属性指定迭代的结束索
引。
③迭代map集合,调用map集合中元素的key和value属性可以获得该元素的key值
及value值。
图9 使用forEach标签迭代数组和集合
3.JSTL格式化标签库
在使用JSTL格式化标签库时,需要在使用的JSP页面中使用taglib指令导入格式化标签:<%@ taglib prefix="fmt" uri="/jsp/jstl/fmt" %>
在JSTL格式化标签中最重要的是<fmt:formatNumber>标签和<fmt:formatDate>标签,分别代表对数字和日期的格式化输出。
<fmt:formatNumber>
表5 <fmt:formatNumber>标签常用属性
代码演示:格式化标签<fmt:formatNumber>
<body>
格式化货币:
<fmt:formatNumber value="7898712.567878" type="currency"
currencySymbol="$" maxFractionDigits="3"/><br/> ①
格式化数字:
<fmt:formatNumber value="123456.1" type="number"
minFractionDigits="3"/><br/> ②
格式化百分比:
<fmt:formatNumber type="percent">
0.98
</fmt:formatNumber> ③
</body>
代码解析:
①将value中的值格式为美元货币格式,小数部分最大位数为3位。
②将value中的值格式化为数字格式,小数部分最小位数为3位,不足3位使用0补
齐。
③将标签体内的值格式化为百分比格式。
图10 <fmt:formatNumber>标签格式化运行结果
<fmt:formatDate>
表6 <fmt:formatDate>标签属性
代码演示:格式化标签<fmt:formatDate>
<body>
<fmt:formatDate value="<%=new java.util.Date() %>" pattern="yyyy年MM 月dd日"/><br/>
<fmt:formatDate value="<%=new java.util.Date() %>"
dateStyle="full"/><br/>
<fmt:formatDate value="<%=new java.util.Date() %>" type="time"/>
</body>
图11 使用<fmt:formatDate>格式化日期
4.总结
EL表达式又称为表达式语言(Expression Language),它是JSP中一个很重要的组成部分。
在JSP页面中使用EL表达式,可以简化对变量和对象的访问。
EL表达式的语法非常的简单,所有的EL表达式都是以“${”开始,以“}”结束,比如${name}。
EL表达式会将表达式中的结果在页面上输出,就像使用JSP的表达式结构或使用out内置对象进行输出一样。
EL表达式不仅可以访问pageContext中的对象,还可以访问request、session、application 中的对象。
JSTL格式化标签库主要有日期格式化和数字格式化。
参考资料EL和JSTL 5.练习
1.EL表达式支持哪些运算符?
2.EL表达式如何从范围中获取对象和对象的属性?
3.JSTL的核心标签库中有哪些常用标签?
4.如何应用<c:if>和<c:forEach>标签?
5.如何格式化一个日期?
6.使用JSTL和EL表达式修改上一章中会员的管理系统。
21
参考资料:EL与JSTL 章节知识结构图
22。