为什么需要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] }
姓名:${ names[1] }
获取集合元素-Map
// 在Servlet或JSP中保存数据
Map names = new HashMap();
names.put("one", "LiYang");
names.put("two", "WangHua");
request.setAttribute("names", names);
// 在JSP中访问数据
姓名:${ names.one }
姓名:${ names["two"] }
获取对象的属性值
例如:
<%= ( (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:设置指定范围内的变量值
语法:
将value值设置到对象的属性中
语法:
例如:
// 在Servlet或JSP中设置JavaBean
User user = new User();
request.setAttribute("user", user);
// 在JSP中修改JavaBean的属性值
out:计算表达式并将结果输出显示
不指定默认值
语法:
指定默认值
语法:
例如:
// 在Servlet或JSP中设置JavaBean
User user = new User();
request.setAttribute("user", user);
// 在JSP中输出JavaBean的属性值
out:计算表达式并将结果输出显示
转义特殊字符
例如:
${ "百度" }
remove:删除指定范围内的变量
语法:
例如:
设置变量之前的值是:msg=
//使用set标签设置属性
设置新值以后:msg=
//使用out输出属性显示
//使用remove移除属性
移除变量msg以后:msg=
条件标签
if:实现Java语言中if语句的功能
语法:
…
test="codition"(判断条件表达式返回true/false)
var="variable"(该变量用于保存返回的true/false)
scope="scope"(指定var变量的作用域)
例如:
…登录表单
…已经登录
choose:实现if - else if - else语句的功能
语法:
内容1
内容2
……
内容n
迭代标签
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中展示数据
style="background-color:rgb(219,241,212);">
${product.name }
${product.area }
${product.price }
通过迭代标签变量Map
例如:
// 在Servlet或JSP中准备数据
Map map = new HashMap();
map.put("tom", "美国");
map.put("lily", "英国");
map.put("jack", "中国");
request.setAttribute("map", map);
// 在JSP中展示数据
${ entry.key }
${ entry.value }
forEach:指定迭代的次数
语法:
…循环体代码…
例如: