EL:Expression Language(表达式语言)
EL的功能:
替代JSP页面中数据访问时的复杂编码
<!--
EL功能体现:替换小脚本
//在JSP中使用Java脚本的局限
//在JSP页面中嵌入大量的Java代码
//访问结构比较复杂的数据时代码烦琐,且经常需要强制类型转换
-->
<%
Employee employee = (Employee) request.getAttribute("employee");
Computer comp = employee.getComputer();
String manufacturer = comp.getManufacturer();
%>
<!-- EL只需要一句,就可以替代java脚本 -->
${requestScope.employee.computer.manufacturer}
EL的特点:
自动转换类型 EL得到某个数据时可以自动转换类型
简单易用
EL的语法:
${ EL expression }
EL的4种取值范围:
pageScope,requestScope,sessionScope,applicationScope
属性范围 | EL中的名称 |
---|---|
page | pageScope |
request | requestScope |
session | sessionScope |
application | applicationScope |
注意:
1、${pageScope.username}表示在page作用域查找变量username,找不到返回null
2、如果在表达式中不标明作用域,则按照page → request → session → application的作用域顺序依次查找,找到即返回,最终找不到返回null
EL取值方式:
1、通过变量名取值:
${变量名} 推荐写为:${作用域.变量名}
2、获取对象的属性值:
<%=((User)request.getAttribute("user")).getName() %>
①、点操作符:${user.name}
②、[]操作符:${user["name"]} //注意中括号里的双引号,如果不写则表示变量名
注意:JavaBean中需要有相应getter方法才能用EL表达式这样取值
3、获取集合元素:
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/>
注意:
1、Map建议使用String做key,如果使用纯数值格式则只能使用长整形
Map names = new HashMap();
names.put(1L, "LiYang");
names.put("two", "WangHua");
request.setAttribute("names", names);
2、Map中key的类型:
//对于String类型的key
${names["two"]}和${names.two}
//对于Long类型的key仅可使用
${names[1]}
执行表达式
关系操作符、逻辑操作符、empty操作符
关系操作符 | 说明 | 示例 | 结果 |
---|---|---|---|
== 或者eq | 等于 | ${23==5} 或${23 eq 5} ${"a" =="a"} 或${"a" eq "a"} | false 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 |
empty操作符
①、若变量 a
为null
,或长度为零的String
,或size为零
的集合
,则${ empty a }
返回的结果为true
②、${ not empty a }
或${ ! empty a }
返回的结果为false
逻辑操作符 | 说明 | 示例 |
---|---|---|
&& 或者and | 逻辑与 | 如果A为true,B为false,则${ A && B } 或者${ A and B } |
| 或者or | 逻辑或 | 如果A为true,B为false,则${ A || B} 或者${ A or B } |
! 或者not | 逻辑非 | 如果A为true,则${ ! A } 或者${ not A } |
EL隐式对象
1、作用域访问对象
对象名称 | 说 明 |
---|---|
pageScope | 与page作用域相关联的Map对象 |
requestScope | 与request作用域相关联的Map对象 |
sessionScope | 与session作用域相关联的Map对象 |
applicationScope | 与application作用域相关联的Map对象 |
2、参数访问对象
对象名称 | 说 明 |
---|---|
param | 按照请求参数名称返回单一值的Map对象 |
paramValues | 按照请求参数名称返回String数组的Map对象 |
3、JSP隐式对象
pageContext 提供对页面信息和JSP内置对象的访问
开启和关闭EL表达式
1、开启方法
servlet2.4之后默认方法为false,即可以不写或写成<%@ page isELIgnored="false" %>
2、关闭方法
<%@ page isELIgnored="true" %>
3、批量禁用EL的方法
在WEB-INF/web.xml中使用jsp-property-group标签批量禁用el,web.xml中进行如下配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"version="2.4">
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
</web-app>
EL总结:
EL表达式:
1、基本格式:${}
2、4种取值范围:pageScope,requestScope,sessionScope,applicationScope
3、基本运算:.
和[]
, .
用于取属性、[]
用于取Array,List,Map,Set
${requestScope.map['apple']}
${requestScope.list[1]}
4.花括号内允许的运算:算术运算,关系运算,逻辑运算,empty/not empty空判断
${1+1}
${user.age<18}
${(user.age>18)&&(user.sex=='男')}
${empty user}判断user对象是否为空
5、EL的11个隐含对象:
隐含对象名称 | 描述 |
---|---|
pageContext | 对应于JSP页面中的pageContext对象(注意:取的是pageContext对象。) |
pageScope | 代表page域中用于保存属性的Map对象 |
requestScope | 代表request域中用于保存属性的Map对象 |
sessionScope | 代表session域中用于保存属性的Map对象 |
applicationScope | 代表application域中用于保存属性的Map对象 |
param | 表示一个保存了所有请求参数的Map对象 |
paramValues | 表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回string[] 数组 |
header | 表示一个保存了所有http请求头字段的Map对象 |
headerValues | 返回string[]数组。如果头里面有- ,则需要用到headerValues例:Accept-Encoding,则要 headerValues[“Accept-Encoding”] |
cookie | 表示一个保存了所有cookie的Map对象 |
initParam | 表示一个保存了所有web应用初始化参数的map对象 |
JSTL:JSP标准标签库(JSP Standard Tag Library)
1、提供一组标准标签
2、可用于编写各种动态 功能
EL表达式封装了数据访问的功能
JSTL标签库则封装了逻辑控制、循环控制以及数据格式化等功能
JSTL通常会与EL表达式合作实现JSP页面的编码
JSTL的环境搭建
1、引入JSTL的jar文件和标签库描述符文件
如果使用MyEclipse,创建web project 时选择 Java EE 5.0或 Java EE 6.0单选按钮,则可集成了JSTL
2、在JSP页面添加taglib指令
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
3、使用JSTL标签
通用标签:
set:设置指定范围内的变量值
1、将value值存储到范围为scope的变量variable中
<c:set var="variable" value="value" scope="scope" />
2、将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:计算表达式并将结果输出显示
1、不指定默认值
语法:<c:out value="value" />
2、指定默认值
语法:<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" />
3、转义特殊字符
<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>" />
//前两个显示百度链接,而第三个则为一串字符串"<a href='http://www.baidu.com'>百度</a>"
注意:
1、<c:out>
标签,类似于JSP中的<%=%>
,<c:out>
标签可以指定默认值,<%=%>
则不能,最好添加默认值
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>
<!-- 此时msg的值应该是上面设置的“Hello World!” -->
设置新值以后:msg=<c:out value="${msg}"></c:out><br/>
<!-- 把 msg变量从page范围内移除-->
<c:remove var="msg" scope="page" />
<!-- 此时msg的值应该显示null -->
移除变量msg以后:msg=<c:out value="${msg}" default="null"></c:out>
if条件标签:
<c:if test="codition" var="variable" scope="scope" >
…
</c:if>
test属性:判断条件表达式返回true/false
var属性:该变量用于保存返回的true/false
scop属性:指定var变量的作用域
表单1:使用if标签判断是否登录
<c:set var="isLogin" value="${empty sessionScope.user}"/>
<c:if test="${isLogin}">
…登录表单
</c:if>
<c:if test="${! isLogin}">
…已经登录
</c:if>
when 、otherwise与choose的使用规则
//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 >
迭代标签:
1、forEach:实现对集合对象的遍历
<c:forEach items="collection" var="varName" begin="start" end="end" step="stepSize" varStatus="status">
…循环体代码…
</c:forEach>
items属性:指定要遍历的集合对象
var属性:指定当前成员的引用
begin属性:指定从集合的第几位开始
end属性:指定迭代到集合的第几位结束
step属性:指定循环的步长
varStatus属性:用于存放var引用的成员的相关信息,如索引等
2、forEach:指定迭代的次数
<c:forEach begin="start" end="end" step= "stepSize">
…循环体代码…
</c:forEach>
3、通过迭代标签显示商品列表,并且隔行变色
// 在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>
<!-- 注意对比varStatus的index和count属性的区别 -->
4、通过迭代标签遍历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>