为什么需要EL
在JSP中使用Java脚本的局限
在JSP页面中嵌入大量的Java代码
访问结构比较复杂的数据时代码烦琐,且经常需要强制类型转换
例如:
<%
Employee employee = (Employee) request.getAttribute("employee");
Computer comp = employee.getComputer();
String manufacturer = comp.getManufacturer();
%>
EL表达式使JSP的开发变得更加简单
例如:
${requestScope.employee.computer.manufacturer}
EL表达式简介
什么是EL表达式
Expression Language(表达式语言),它是一种借鉴了JavaScript和XPath的表达式语言
EL的功能
替代JSP页面中数据访问时的复杂编码
EL的特点
自动转换类型
EL得到某个数据时可以自动转换类型
使用简单
EL表达式语法
语法:
${ EL expression }
通过变量名取值
获取对象的属性值
获取集合元素
执行表达式
1、点操作符
EL表达式通常由两部分组成:对象和属性,就像在Java代码中一样,在EL表达式中也可以用点操作符“.”来访问对象的某个属性
2、[ ]操作符
与点操作符类似,“[ ]”操作符也可以访问对象的某个属性
当属性名中包含了特殊字符如“.”或“-”等的情况下,就不能使用点操作符,这时只能使用“[ ]”操作符
访问数据,如果有一个对象名为array的数组,那么可以根据索引值来访问其中的元素
“[ ]”操作符中可以使用变量实现动态访问
例如:
获取集合元素-List
// 在Servlet或JSP中保存数据
List names = new ArrayList();
names.add(0, "LiYang");
names.add(1,"WangHua");
request.setAttribute("names",names);
// 在JSP中访问数据
姓名:${ names[0] }<br/>
姓名:${ names[1] }<br/>
获取集合元素-Map
// 在Servlet或JSP中保存数据
Map names = new HashMap();
names.put("one", "LiYang");
names.put("two", "WangHua");
request.setAttribute("names", names);
// 在JSP中访问数据
姓名:${ names.one }<br/>
姓名:${ names["two"] }<br/>
获取对象的属性值
例如:
<%= ( (User) request.getAttribute("user") ) .getName() %>
点操作符
${user.name}
[ ]操作符
${user["name"]}
指定作用域
属性范围 | EL中的名称 |
page | pageScope,例如${pageScope.username}表示在page作用域查找变量username,找不到返回null |
request | requestScope |
session | sessionScope |
application | applicationScope |
注:按照page → request → session → application的作用域顺序依次查找,找到即返回,最终找不到返回null
执行表达式
关系操作符
关系操作符 | 说明 | 示例 | 结果 |
==(或eq) | 等于 | ${23==5}或${23 eq 5} | FALSE |
${"a" =="a"}或${"a" eq "a"} | TRUE | ||
!=(或ne) | 不等于 | ${23!=5}或${23 ne 5} | TRUE |
<(或lt) | 小于 | ${23<5}或${23 lt 5} | FALSE |
>(或gt) | 大于 | ${23>5}或${23 gt 5} | TRUE |
<=(或le) | 小于等于 | ${23<=5}或${23 le 5} | FALSE |
>=(或ge) | 大于等于 | ${23>=5}或${23 ge 5} | ture |
逻辑操作符
逻辑操作符 | 说明 | 示例 | 结果 |
&&(或and) | 逻辑与 | 如果A为true,B为false,则${ A && B } (或${ A and B } ) | FALSE |
||(或or) | 逻辑或 | 如果A为true,B为false,则${ A || B} (或 ${ A or B } ) | TRUE |
! (或not) | 逻辑非 | 如果A为true,则${ ! A } ( 或${ not A } ) | FALSE |
empty操作符
若变量 a为null,或长度为零的String,或size为零的集合
则${ empty a }返回的结果为true
${ not empty a }或${ ! empty a }返回的结果为false
EL隐式对象
作用域访问对象
pageScope、requestScope、sessionScope、applicationScope
参数访问对象
param、paramValues
JSP隐式对象
pageContext
EL隐式对象介绍
对象名称 | 说 明 |
pageScope | 与page作用域相关联的Map对象 |
requestScope | 与request作用域相关联的Map对象 |
sessionScope | 与session作用域相关联的Map对象 |
applicationScope | 与application作用域相关联的Map对象 |
param | 按照请求参数名称返回单一值的Map对象 |
paramValues | 按照请求参数名称返回String数组的Map对象 |
pageContext | 提供对页面信息和JSP内置对象的访问 |
JSTL
EL表达式封装了数据访问的功能,而JSTL标签库则封装了逻辑控制、循环控制以及数据格式化等功能,二者结合使用才能完整实现动态页面的开发需求
什么是JSTL
JSP标准标签库(JSP Standard Tag Library)
JSTL的优点
1、提供一组标准标签
2、可用于编写各种动态功能
JSTL通常会与EL表达式合作实现JSP页面的编码
使用JSTL的步骤
引入JSTL的jar文件和标签库描述符文件
在JSP页面添加taglib指令
使用JSTL标签
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
JSTL标准标签库中的常用标签
通用标签
set、out、remove
条件标签
if、choose
迭代标签
forEach
通用标签
set:设置指定范围内的变量值
语法:
<c:set var="variable" value="value" scope="scope" />
将value值设置到对象的属性中
语法:
<c:set target="target" property="property" value="value" />
例如:
// 在Servlet或JSP中设置JavaBean
User user = new User();
request.setAttribute("user", user);
// 在JSP中修改JavaBean的属性值
<c:set target="${user}" property="name" value="defaultName" />
out:计算表达式并将结果输出显示
不指定默认值
语法:<c:out value="value" />
指定默认值
语法:
<c:out value="value" default="default" />
例如:
// 在Servlet或JSP中设置JavaBean
User user = new User();
request.setAttribute("user", user);
// 在JSP中输出JavaBean的属性值
<c:out value="${user.name}" default="No UserName" />
out:计算表达式并将结果输出显示
转义特殊字符
例如:
<p>${ "<a href='http://www.baidu.com'>百度</a>" }</p>
<p>
<c:out escapeXml="false"
value="<a href='http://www.baidu.com'>百度</a>" />
</p>
<c:out value="<a href='http://www.baidu.com'>百度</a>" />
remove:删除指定范围内的变量
语法:
<c:remove var="variable" scope="scope" />
例如:
<!-- 设置之前应该是空值 -->
设置变量之前的值是:msg=<c:out value="${msg}" default="null" /><br/>
<!-- 给变量msg设值 -->
<c:set var="msg" value="Hello World!" scope="page"></c:set>//使用set标签设置属性
<!-- 此时msg的值应该是上面设置的“Hello World!” -->
设置新值以后:msg=<c:out value="${msg}"></c:out><br/>//使用out输出属性显示
<!-- 把 msg变量从page范围内移除-->
<c:remove var="msg" scope="page" />//使用remove移除属性
<!-- 此时msg的值应该显示null -->
移除变量msg以后:msg=<c:out value="${msg}" default="null"></c:out>
条件标签
if:实现Java语言中if语句的功能
语法:
<c:if test="codition" var="variable" scope="scope" >
…
</c:if>
test="codition"(判断条件表达式返回true/false)
var="variable"(该变量用于保存返回的true/false)
scope="scope"(指定var变量的作用域)
例如:
<c:set var="isLogin" value="${empty sessionScope.user}"/>
<c:if test="${isLogin}">
…登录表单
</c:if>
<c:if test="${! isLogin}">
…已经登录
</c:if>
choose:实现if - else if - else语句的功能
语法:
<c:choose>
<c:when test="condition1">
内容1
</c:when>
<c:when test="condition2">
内容2
</c:when>
……
<c:otherwise>
内容n
</c:otherwise>
</c:choose >
迭代标签
forEach:实现对集合对象的遍历
<c:forEach items="collection" var="varName" begin="start" end="end" step="stepSize" varStatus="status" >
…循环体代码…
</c:forEach>
items="collection"(items指定要遍历的集合对象)
var="varName"(var指定当前成员的引用)
begin="start"(begin指定从集合的第几位开始)
end="end"(end指定迭代到集合的第几位结束)
step="stepSize" (step指定循环的步长)
varStatus="status"(varStatus属性用于存放var引用的成员的相关信息,如索引等)
例如:
// 在Servlet或JSP中准备集合数据
List products = GoodsDao.getAllProducts();
request.setAttribute("products", products);
// 在JSP中展示数据
<!-- 循环输出商品信息 -->
<c:forEach items="${requestScope.products}" var="product"
varStatus="status">
<!-- 如果是偶数行,为该行换背景颜色 -->
<tr <c:if test="${status.index % 2 == 1 }">
style="background-color:rgb(219,241,212);"</c:if>>
<td>${product.name }</td>
<td>${product.area }</td>
<td>${product.price }</td>
</tr>
</c:forEach>
通过迭代标签变量Map
例如:
// 在Servlet或JSP中准备数据
Map<String, String> map = new HashMap<String, String>();
map.put("tom", "美国");
map.put("lily", "英国");
map.put("jack", "中国");
request.setAttribute("map", map);
// 在JSP中展示数据
<c:forEach items="${requestScope.map}" var="entry">
${ entry.key }
${ entry.value }<p>
</c:forEach>
forEach:指定迭代的次数
语法:
<c:forEach begin="start" end="end" step= "stepSize">
…循环体代码…
</c:forEach>
例如:
<c:forEach begin="1" end="5" step= "2">
<c:out value="*"></c:out>
</c:forEach>