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"%>
12 + 15 = ${12+15}
12 * 15 = ${12*15}
12 - 15 = ${12-15}
12 / 15 = ${12/15}
12 % 15 = ${12%15}
图1 EL表达式算术运算结果
在EL表达式中还可以支持关系运算符操作,示例如下:
代码演示:EL表达式关系运算符
12==15 ${12==15}
12<15 ${12<15}
12>15 ${12>15}
12<=15 ${12<=15}
12>=15 ${12>=15}
12!=15 ${12!=15}
EL表达式除了支持普通的关系运算符外,还可以使用字符来表示关系运算符,下面的写法和上面使用普通关系运算符表示的顺序一一对应:
代码演示:EL表达式关系运算符
12==15 ${12 eq 15}
12<15 ${12 lt 15}
12>15 ${12 gt 15}
12<=15 ${12 le 15}
12>=15 ${12 ge 15}
12!=15 ${12 ne 15}
图2 EL表达式关系运算符结果
EL表达式中同样支持逻辑运算:
代码演示:EL表达式逻辑运算
${12 < 15 && 12 < 15 }
${12 < 15 and 12 < 15 }
${12 < 15 || 12 > 15 }
${12 < 15 or 12 >15 }
${!(12 < 15) }
${not (12 < 15) }
从上面的代码中可以看出EL表达式中不仅支持&&、||、!方式的逻辑运算符,同样也支持and、or、not方式的逻辑运算符。在EL表达式中也可以小括号来提升运算符的优先级。
EL表达式中还可以使用empty运算符检测一个值是否为null或者为空。
代码演示:EL表达式empty运算符
<%
List list = new ArrayList();
list.add("tom");
pageContext.setAttribute("str", null);
pageContext.setAttribute("list", list);
%>
${empty str } ①
${empty list} ②
代码解析:
①判断内容是否为null
②判断集合list中是否有元素
图3 EL表达式empty运算符
EL表达式中还支持三元表达式方式的条件选择运算,例如:
代码演示:EL表达式条件选择
${12 < 15 ? 'yes':'no' } ①
代码解析:
①注意在EL表达式中的字符串需要使用单引号引起来。
EL访问对象
EL表达式的方便性不仅仅体现在对这些算术或关系运算的支持,它还可以很方便的访问对象。例如在上面讲empty运算符时,使用EL表达式可以访问pageContext空间中的对象。EL表达式不仅可以访问pageContext中的对象,还可以访问request、session、application 中的对象。
代码演示:EL表达式访问对象
<%
pageContext.setAttribute("name","tom");
request.setAttribute("age","22");
session.setAttribute("address","中国");
application.setAttribute("score","75.5");
%>
${name}
${age}
${address}
${score}
图4 EL表达式访问对象
从上面的例子中,可以看出访问对象只需要在EL表达式中写对象的名称即可。EL表达式默认会从pageContext、reqest、session、application中并按照此顺序寻找名称匹配的对象,如果找不到,则不显示任何内容。还可以指定从哪个空间中获取对象。
代码演示:EL表达式从指定空间内访问对象
<%
pageContext.setAttribute("name","tom");
request.setAttribute("age","22");
session.setAttribute("address","中国");
application.setAttribute("score","75.5");
%>
${https://www.doczj.com/doc/2d9725749.html,}
①
${requestScope.age}
②
${sessionScope.address}
③
${applicationScope.score}
④
代码解析:
①从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) {
https://www.doczj.com/doc/2d9725749.html, = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return name + "来自" + address;
}
}
代码演示:使用EL表达式访问User类对象
<%
User user = new User();
user.setAddress("巴西");
user.setName("小黑");
pageContext.setAttribute("user",user);
%>
${user}
图5 EL表达式访问自定义类对象
通过上面的例子可以看出如果直接输出自定义类的对象,EL表达式将会访问类的toString方法并将返回值进行输出。当然我们还可以很方便的使用EL表达式获得对象的属性值:
代码演示:EL表达式获取对象属性值
<%
User user = new User();
user.setAddress("巴西");
user.setName("小黑");
pageContext.setAttribute("user",user);
%>
${https://www.doczj.com/doc/2d9725749.html,}
①
${user.address }
代码解析:
①通过点“.”运算符来获取对象user中的name属性的值。再次需要注意要访问的属性
名不一定是和对象的属性名相同,而是要和get方法的方法名去掉“get”后的名字相同。
图6 使用EL表达式访问对象属性
在访问属性时不仅可以使用点“.”运算符,还可以使用“[]”将属性包含其中。
代码演示:使用EL表达式访问对象属性
<%
User user = new User();
user.setAddress("巴西");
user.setName("小黑");
pageContext.setAttribute("user",user);
%>
${user["name"]}
${user["address"] }
注意在使用“[]”包含属性时需要将属性使用双引号引起来。
图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 组成,下载的网址为https://www.doczj.com/doc/2d9725749.html,/site/downloads/downloads_taglibs-standard.cgi,将下载好的压缩包内jstl.jar和standard.jar放入的Web工程中的lib目录下,并在使用JSTL 的JSP页面上使用taglib指令导入所需要的标签库即可。
Core标签库中包含了基本标签、条件标签、迭代标签。在使用Core标签时需要在JSP 页面中使用taglib指令导入Core标签库:
<%@ taglib prefix="c" uri="https://www.doczj.com/doc/2d9725749.html,/jsp/jstl/core" %>
Core标签库中的基本标签包括
表1
代码演示:Core 标签库
22
Tom
代码解析:
① 在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 属性赋值。
?
表2
代码演示:Core标签库
22
①
②
还是没有值
③
代码解析:
①输出变量名为name的值。
②输出变量名为address的值,因为变量address未声明,所以获得的值为null。如果
value为null,则会显示default中的值,或显示标签体中的值。
③输出变量名为code的值,变量code中包含有HTML的值。在
属性默认为true,所以HTML代码会被原样输出不会被执行。
④将escapeXml值设置为false,code变量中的HTML值会被浏览器解析,运行结果如
下:
图8 JSTL
?
表3
代码演示:Core标签库
代码解析:
①从session空间中删除name变量。
下面来学习条件标签,条件标签包括
?
表4
代码演示:Core标签库
12 大于10 test的结果为${result }
12 小于10
代码解析:
①如果test条件成立,将条件返回值存储到page空间内的result变量中。注意var属
性和scope属性不是必须的,但是如果使用scope属性,则必须使用var属性。
代码演示:Core标签库
jerry
tom
other name
代码解析:
①如果
②如果
表4
代码演示:将数组和集合存入到request空间内
<%@ page language="java" import=" java.util.*" pageEncoding="UTF-8"%>
<%
Map
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
List
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);
%>
代码演示:使用
对数组的迭代:
${status.count}
${str}
对List集合的迭代:
${listItem}
对Map集合的迭代:
${mapItem.key} : ${mapItem.value}
代码解析:
①迭代数组,将数组中每个元素存储到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="https://www.doczj.com/doc/2d9725749.html,/jsp/jstl/fmt" %>
在JSTL格式化标签中最重要的是
表5
代码演示:格式化标签
格式化货币:
currencySymbol="$" maxFractionDigits="3"/> 格式化数字: minFractionDigits="3"/> 格式化百分比: 0.98 代码解析: ①将value中的值格式为美元货币格式,小数部分最大位数为3位。 ②将value中的值格式化为数字格式,小数部分最小位数为3位,不足3位使用0补 齐。 ③将标签体内的值格式化为百分比格式。 图10 表6 代码演示:格式化标签
①
②
dateStyle="full"/> 图11 使用 4.总结 EL表达式又称为表达式语言(Expression Language),它是JSP中一个很重要的组成部分。 在JSP页面中使用EL表达式,可以简化对变量和对象的访问。 EL表达式的语法非常的简单,所有的EL表达式都是以“${”开始,以“}”结束,比如${name}。EL表达式会将表达式中的结果在页面上输出,就像使用JSP的表达式结构或使用out内置对象进行输出一样。 EL表达式不仅可以访问pageContext中的对象,还可以访问request、session、application 中的对象。 JSTL格式化标签库主要有日期格式化和数字格式化。