EL与JSTL
EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要替代jsp页面中脚本的编写。
JSTL(JSP Standard Tag Library),JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能。jstl出现的目的同el一样也是要代替jsp页面中的脚本代码。JSTL标准标签库有5个子库,但随着发展,目前常使用的是他的核心库。
1.EL表达式
EL表达式:${EL 表达式}
<%
//在session中设置值
session.setAttribute("username","李明");
//JSP方式获取session中的值
String username = (String) session.getAttribute("username");
//方式一
out.println("JSP方式一获取:"+username);
%>
<br>
<%--方式二--%>
<%= "JSP方式二获取:"+ username%>
<hr>
<%--EL方式获取session中的值--%>
EL方式获取:${username}
EL操作符:
获取对象的属性:操作符“.”
${sessionScope.user.username}
//等价于
${sessionScope.user["username"]}
获取集合中的对象:操作符“[]”
${sessionScope.user[0].username}
EL运算符:
运算符 | 说明 |
---|---|
( ) | 改变执行的优先级,例如${3*(4+5)} |
+,-,*,/,% | 算术运算符,例如${3+2} |
==,!=,>,>=,<,<= | 关系运算符,例如 a = = b 或 {a==b}或 a==b或{a eq b} |
&&,||,! | 逻辑运算符,例如${true&&false} |
?: | 条件运算符,例如${a>b?1:2} |
empty | 用于检测变量名是否为空,是否等于NULL,例如${empty name} |
关系运算符 | 范例 | 结果 |
---|---|---|
== 或 eq | 5 = = 5 或 {5 == 5}或 5==5或{5 eq 5} | true |
!= 或 ne | 5 ! = 5 或 {5 != 5}或 5!=5或{5 ne 5} | false |
< 或 lt | 3 < 5 或 {3 < 5}或 3<5或{3 lt 5} | true |
> 或 gt | ${3 > 5}或{3 gt 5} | false |
<= 或 le | 3 < = 5 或 {3 <= 5}或 3<=5或{3 le 5} | true |
>= 或 ge | 3 > = 5 或 {3 >= 5}或 3>=5或{3 ge 5} | false |
三元表达式格式为:${user!=null?user.username :" "}
。如果?前面结果为true则选择前面的数据,否则选择后面的。
EL功能:
- 取得JavaBean对象的属性
${news.title}
- 取得数组、List、Map类型对象的元素
${list[0]}
- 使用各类运算符对原始数据进行简单处理
${totalRecordCount/pageSize}
- 屏蔽一些常见的异常
${username}
- 能实现简单的自动类型转换
${news}
相当于(News)request.getAttribute("news")
EL访问作用域:
作用域 | Java代码取值 | EL取值 |
---|---|---|
请求作用域 | request.getAttribute(“news”); | ${ requestScope.news } |
会话作用域 | session.getAttribute(“username”); | ${ sessionScope.username } |
程序作用域 | application.getAttribute(“count”); | ${ applicationScope.count } |
页面作用域 | pageContext.getAttribute(“userNum”); | ${ pageScope.userNum } |
注意:
不指定作用域,直接${username}的话,默认会按照作用域的范围从小到大(page->request->session->application)依次查找,直到找到application为止。
如果四个作用域中都没有则返回空字符串(注意:不是null,而是" "),然后什么都不显示。
EL隐含对象总共有11个:
pageScope、requestScope、sessionScope、applicationScope、param 、paramValues、header、headerValues、initParam、cookie、pageContext
2.JSTL表达式
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" %>
JSTL标签库:
Core (核心库) 标签库的URI:http://java.sun.com/jsp/jstl/core 常用前缀:c
I18N(国际化) 标签库的URI:http://java.sun.com/jsp/jstl/fmt 常用前缀:fmt
SQL 标签库的URI:http://java.sun.com/jsp/jstl/sql 常用前缀:sql
XML 标签库的URI:http://java.sun.com/jsp/jstl/xml 常用前缀:x
Functions 标签库的URI:http://java.sun.com/jsp/jstl/functions 常用前缀:fn
核心标签库:
JSTL的核心标签库标签共14个,这些标签能够完成JSP页面的基本功能,减少编码工作。从功能上可以分为4类:表达式控制标签、流程控制标签、循环标签、URL操作标签。
- 表达式控制标签:out标签、set标签、remove标签、catch标签。
- 流程控制标签:if标签、choose标签、when标签、otherwise标签。
- 循环标签:forEach标签、forTokens标签。
- URL操作标签:import标签、url标签、redirect标签、param标签。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
uri:指定引入的标签库的路径
prefix:设置标签库中标签的前缀,解决标签重名的问题
普通标签:
<c:out/>
标签:用于将结果输出。类似于JSP中的<%= %>
表达式,或者是EL表达式${expression}
。
<%--取值--%>
<c:out value="${userName}"></c:out>
<c:out value="value" default="default" escapeXml="true|false" />
value:设置要输出到页面的数据,要使用EL表达式
default:设置一个默认值,当value所设置的EL表达式的值为null时,则将default所对应的值输出到页面
escapeXml:设置输出到页面中的内容是否转义,默认值为true,表示转义,即原样输出;若设置为false,表示不转义,输出到页面中的内容会被浏览器解析
<c:set>
标签:用于把某一个对象存在指定的域范围内,或者将某一个对象存储到Map或者JavaBean对象中。
<%--设值--%>
<%--设置变量--%>
<c:set var="userName" value="liming" scope="session"></c:set>
<%--设置对象属性--%>
<c:set value= "value" target="target" property="propertyName" />
var:设置共享数据的属性名
value:设置共享数据的属性值
scope:设置共享数据的域对象的范围,若不指定域对象的范围,则默认在pageContext域对象中共享数据,scope="page(默认)|request|session|application"
<c:remove>
标签:相较于<c:set>
,作用是移除范围域中的变量。
<%--删除userName变量--%>
<c:remove var="userName"></c:remove>
var:要删除的域对象中共享数据的属性名
scope:要删除共享数据的域对象的范围,
scope="page|request|session|application",若不指定scope,则删除所有域对象中以var的值作为属性名的数据
<c:catch>
标签:用于捕获在嵌套在标签体中的内容抛出的异常,并将异常信息保存到变量中。
<c:catch var="exception">
int i=5/0;
</c:catch>
<c:out value="${exception}"/>
<%--此句相当于exception.getMessage--%>
<c:out value="${exception.message}"/>
条件标签:
<c:if>
标签:和程序中的 if 语句作用相同,用来实现条件控制,但是没else功能。
<c:if test="testCondition" [var="varName"] [scope="page|request|session|application}"]>
...
</c:if>
test属性用于存放判断的条件,一般使用EL表达式来编写。
var属性用来存放判断的结果,类型为true或false。
scopes属性用来指定var属性存放的范围。
<%
//在session中设置值
session.setAttribute("score",70);
%>
<c:if test="${score>60}">
<span>恭喜!及格了</span>
</c:if>
<c:choose>
、<c:when>
和<c:otherwise>
标签:这三个标签通常一起使用,<c:choose>
标签作为<c:when>和<c:otherwise>
标签的父标签来使用。类似于程序中if-else,其中<c:when>
表示if,<c:otherwise>
表else。
<%
//在session中设置值
session.setAttribute("score",50);
%>
<c:choose>
<c:when test="${score>60}">
<span>恭喜!及格了</span>
</c:when>
<c:otherwise>
<span>不好意思!不及格</span>
</c:otherwise>
</c:choose>
循环标签:
<c:forEach>
标签:该标签根据循环条件遍历集合(Collection)中的元素。
<c:forEach
var=”name”
items=”Collection”
[varStatus=”StatusName”]
[begin=”begin”]
[end=”end”]
[step=”step”]>
...
</c:forEach>
var设定变量名用于存储从集合中取出元素。
items指定要遍历的集合。
varStatus设定变量名,该变量用于存放集合中元素的信息。其中varStatus有4个状态:index:当前循环的索引值、count:环的次数、frist:否为第一个位置、last:否为最后一个位置。
begin、end用于指定遍历的起始位置和终止位置(可选),默认下标从0开始。
step指定循环的步长,默认值为1。
<c:forEach var="user" items="${list}" varStatus="yy">
<tr>
<td>${yy.index+1}</td>
<td>${user.id}</td>
<td>${user.userCode}</td>
<td>${user.userName}</td>
<td>${user.userPassword}</td>
<td>
<c:if test="${user.gender==1}">
男
</c:if>
<c:if test="${user.gender==0}">
女
</c:if>
</td>
</tr>
</c:forEach>
<c:forTokens>
标签:该标签用于浏览字符串,并根据指定的字符将字符串截取。
<c:forTokens items=”strigOfTokens”
delims=”delimiters”
[var=”name”]
[begin=”begin”]
[end=”end”]
[step=”len”]
[varStatus=”statusName”] >
...
</c:forTokens>
items指定被迭代的字符串。
delims指定使用的分隔符。
var指定用来存放遍历到的成员。
begin指定遍历的开始位置(int型从取值0开始)。
end指定遍历结束的位置(int型,默认集合中最后一个元素)。
step遍历的步长(大于0的整型)。
varStatus存放遍历到的成员的状态信息。
国际标签库:
<fmt:formatDate/>
标签:实现格式化的日期和时间显示
<fmt:formatDate value="date" pattern="yyyy-MM-dd HH:mm:ss"/>
使用JSTL构建URL:
<c:url/>
超链接标签
<c:param/>
参数标签
<c:import/>
导入标签
<c:url value="url" />
<c:param name="name" value="value"/>
<c:import url="URL" />