EL表达式:
为什么要使用EL表达式?
JSP脚本有一些不足:
- 代码结构混乱
- 脚本与HTML混合,容易出错
- 代码不易于维护
EL的特点:
- 自动转换类型:EL得到某个数据时可以自动转换类型
- 使用简单
使用EL表达式来优化程序代码,增加程序可读性:
示例:
<table>
<c:forEach var="news" items="${list}">
<tr><td><c:out value="${news.title}" /></td></tr>
</c:forEach>
</table>
EL语法:
EL表达式(Expression Language):
${EL表达式}
例如:${username}
1. 通过变量名取值
${变量名}
// 在Servlet或JSP中保存数据
request.setAttribute("username", "LiYang");
// 在JSP中访问数据
姓名: ${username}
按照page ---> request ---> session ---> application的作用域顺序依次查找,找到即返回,最终找不到返回null
指定作用域
属性范围 | EL中的名称 |
page | pageScope,例如${pageScope.username}表示在page作用域查找变量username,找不到返回null |
request | requestScope |
session | sessionScope |
application | applicationScope |
2. 获取对象的属性值
<%= ( (User) request.getAttribute("user") ) .getName() %>
a. 点操作符
${user.name}
b. [ ]操作符
${user["name"]}
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/>
注:使用[ ]指定元素下标
4. 获取集合元素: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/>
5. 执行表达式
关系操作符:
关系操作符 | 说明 | 示例 | 结果 |
==(或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 |
逻辑操作符:
逻辑操作符 | 说明 | 示例 | 结果 |
&&(或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 | 与page作用域相关联的Map对象 |
requestScope | 与request作用域相关联的Map对象 |
sessionScope | 与session作用域相关联的Map对象 |
applicationScope | 与application作用域相关联的Map对象 |
param | 按照请求参数名称返回单一值的Map对象 |
paramValues | 按照请求参数名称返回String数组的Map对象 |
pageContext | 提供对页面信息和JSP内置对象的访问 |
1. Request.setAttribute("name", "admin") ---> 用request.getAttribute("name")取出来
并用${ requestScope .name } 取出来
2. 表单 ---> 提交:用request.getParameter("name")取出来
并用${param.name}取出来
EL操作符:
1. 操作符"."
获取对象的属性,例如: ${news.title}
2. 操作符“[ ]”
获取对象的属性,例如:${newst["title"]}
获取集合中的对象,例如:newslist[0]
EL严格区分大小写,初学者严格按规范书写,有利于养成好的编码习惯
EL功能:
1. 取得JavaBean对象的属性
${news.title}
2. 取得数组、List、Map类型对象的元素
${list[0]}
3. 使用各类运算符对原始数据进行简单处理
${totalRecordCount/pageSize}
4. 屏蔽一些常见的异常
${username}
5. 能实现简单的自动类型转换
${news)相当于(News)request.getAttribute("news")
EL访问作用域:
request. setAttribute(" news ,news);
两种方式取数据:
Java小脚本:request.getAttribute("news");
使用EL表达式:${ news }或者${ requestScope.news}
当直接写${ news }运行方式是根据大小关系在下方的四个作用域中从小到大依次来取属性,直到找到为止
作用域 | Java代码取值 | EL取值 |
请求作用域 | request.getAttribute("news"); | ${ requestScope.news } |
会话作用域 | session.getAttribute("username"); | ${ sessionScope.username } |
程序作用域 | application.getAttribute("count"); | ${applicationScope.count} |
页面作用域 | pageContext.getAttribute("userNum"); | ${pageScope. userNum} |
JSTL介绍:
JSTL(JavaServerPages Standard Tag Library):
- JSP标准标签库
- 实现JSP页面中的逻辑控制
JSTL使用步骤:
- 下载jstl. jar和standard. jar:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
- 将这两个包复制到WEB-INF\lib目录
在JSP页面中添加指令
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
JSTL标签:
标签库名称 | 资源标示符(uri) |
<c:out /> | 输出文本内容到out对象,常用于显示特殊字符,显示默认值 |
<c:set/> | 在作用域中设置变量或对象属性的值 |
<c:remove/> | 在作用域中移除变量的值 |
<c:if/> | 实现条件判断结构 |
<c:forEach/> | 实现循环结构 |
<c:url/> | 构造url地址 |
<c:param/> | 在url后附加参数 |
<c:import/> | 在页面中嵌入另一个资源内容 |
<fmt:formatDate/> | 格式化时间 |
<fmt:formatNumber/> | 格式化数字 |
1. 通用标签
a. set:设置指定范围内的变量值
将value值存储到范围为scope的变量variable中:
<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" />
b. out:计算表达式并将结果输出显示
不指定默认值:
<c:out value="value" />
指定默认值:
<c:out value="value" default="default" />
转义特殊字符:
<p>${ "<a href='http://www.baidu.com'>百度</a>" }</p>
<p>
<c:out escapeXml="false" value="<a href='http://www.baidu.com'>百度</a>" />
<!—escapeXml属性值为false 输出超链接-->
</p>
<c:out value="<a href='http://www.baidu.com'>百度</a>" />
<!—escapeXml属性值为true 输出标签内容-->
c. remove:删除指定范围内的变量
<c:remove var="variable" scope="scope" />
2. 条件标签
a. if:实现Java语言中if语句的功能
b. 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 >
3. 迭代标签:
a. forEach:实现对集合对象的遍历
示例:
b. 通过迭代标签遍历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>
c. forEach:指定迭代的次数
<c:forEach begin="start" end="end" step= "stepSize">
…循环体代码…
</c:forEach>
d. 格式化时间
<fmt:formatDate value="${news.createdate}" pattern="yyyy-MM-dd"/>
和simpleDataFormate一样格式也一样,使用的各种表示符号也一样
EL表达式与JSTL标签结合使用,可以减少JSP中嵌入的Java代码,有利于程序的维护和扩展