EL和JSTL也支持thymeleaf模板引擎
EL表达式 重点
JSTL标签 重点
掌握EL表达式的使用
掌握域对象的取值方式
掌握JSTL标签的使用
EL 全称为 Expression Language(表达式语言)
在 jsp 页面中编写小脚本,会存在以下不足:
代码结构混乱
脚本与HTML混合,容易出错
代码不易于维护
获取JavaBean属性必须要实例化及强制类型转化
为了解决这些不足,JSP提供了 EL 表达式来简化编码,可以使用 EL 表达式来替换 jsp 页面中的小脚本,使得页面和业务逻辑处理相分离,同时还能实现数据类型的自动转型
语法:
${变量名}
案例:
HttpSession session = request.getSession();
//存入session
session.setAttribute("user", "admin");
request.getDispatcher("main.jsp").forward(request,resp);
当前用户名:${user}
测试:
查看页面中显示内容
修改代码:
//存入request
request.setAttribute("user", "admin");
request.getDispatcher("main.jsp").forward(request,resp);
再次测试:
查看页面中显示内容
结论:
不论变量是存储在 request 中,还是存储在 session 中,都可以使用 EL 表达式进行取值。
思考:
如果 request 和 session 中都存有相同的属性值,那么使用 EL 取值的时候,是从哪个对象中取值呢?
//存入request
request.setAttribute("user", "test");
HttpSession session = request.getSession();
//存入session
session.setAttribute("user", "admin");
request.getDispatcher("main.jsp").forward(request,resp);
测试:
查看页面中显示内容
结论:
如果 reqeust 和 session 中都存有相同属性的变量,那么 EL 表达式会从 reqeust 中进行取值。如果需要从 session 中取值,怎么取呢?需要使用 EL 隐式对象
可以通过隐式对象来指定 EL 的取值的范围:
<!-- 在session范围内取值 -->
${sessionScope.user}
如果 EL 未指定隐式对象,则取值默认从 pageScope 取值,如果未找到,则从requestScope取值,如果还是未找到,则从sessionScope取值,如果依然未找到,则从applicationScope取值,如果最终都未找到,那么返回 null值
语法:
<!-- Java中的访问方式 -->
${ 对象名.属性名 }<!-- JS中的访问方式 -->
${ 对象名["属性名"] }
语法:
${ 集合名称[下标] }
语法:
<!-- Java中的访问方式 -->
${ 集合名称.键名 }<!-- JS中的访问方式 -->
${ 集合名称["键名"] }
JSTL 全称为 JavaServerPages Standard Tag Library,意味 JSP标准标签库
EL 能够简化 jsp 页面编码,但是,却不能进行逻辑判断,也不能进行循环处理,为了弥补 EL 这方面的不足,jsp 提供了 JSTL 标签,JSTL 标签通常都会与 EL 配合使用,解决页面的逻辑问题。
经常使用的标签就是核心标签库和格式化标签库
引入JSTL标签库支持的jar包:jstl.jar
和 standard.jar
需要将这两个包拷贝至tomcat下的lib目录中
jsp 页面引入标签库,如
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set>
标签
语法:
<!-- 将value值存储到范围为scope的变量variable中 -->
<c:set var="变量名" value="变量值" scope="变量的作用范围" />
<!-- 将value值设置到对象的属性中 -->
<c:set target="目标对象" property="对象属性" value="对象属性值" />
案例:
<%
?? ?request.setAttribute("user", new User());
%>
<c:set var="user" value="<%=new User()%>" scope="page" />
<c:set target="${pageScope.user}" property="username" value="admin" />
<div>
??? 页面中的${pageScope.user.username}
??? 请求中的${requestScope.user.username}
</div>
<c:remove>
标签
语法:
<font color="blue">语法:</font>
案例:
<!-- 删除页面范围内的变量user -->
<c:remove var="user" scope="page"/>
<c:if>
标签
语法:
<c:if test="条件表达式" var="存储表达式的结果的变量" scope="变量的作用范围">
</c:if>
案例:
<c:if test="${empty pageScope.user}" var="result" scope="request">
??? 页面中的user变量不存在
</c:if>
请求中存储的检测结果是${requestScope.result}
<c:choose>
标签
语法:
<c:choose>
??? <c:when test="条件表达式"></c:when>
??? <c:when test="条件表达式"></c:when>
??? <c:otherwise></c:otherwise>
</c:choose>
案例:
<c:choose>
??? <c:when test="${requestScope.user.password == null}">
??????? 请求中的user对象的password属性为空
??? </c:when>
??? <c:when test="${requestScope.user.password == ''}">
??????? 请求中的user对象的password属性为空字符串
??? </c:when>
??? <c:otherwise>
??????? 请求中的user对象的password属性为${requestScope.user.password}
??? </c:otherwise>
</c:choose>
<c:forEach>
标签
语法:
<c:forEach items="遍历的集合" var="每次遍历的对象" begin="遍历开始的位置" end="遍历结束的位置" step="遍历的步长">
</c:forEach>
案例:
<%
?? ?List<Integer> numbers = new ArrayList<Integer>();
?? ?for(int i=0; i<10; i++){
?? ??? ?numbers.add(i);
??? }
?? ?request.setAttribute("nums", numbers);
%>
<c:forEach items="${nums}" var="number" begin="2" end="8" step="3">
??? <div>${number}</div>
</c:forEach>
<%
?? ?Map<String,Integer> scores = new HashMap<String,Integer>();
?? ?for(int i=0; i<10; i++){
??????? scores.put("test"+i ,i*10);
??? }
?? ?session.setAttribute("scores", scores);
%>
<c:forEach items="${scores}" var="map">
??? <div>${map.key}=>${map.value}</div>
</c:forEach>
<fmt:formatDate>
标签
语法:
<fmt:formatDate value="日期对象" pattern="日期格式" />
案例:
<%
?? ?request.setAttribute("time", new Date());
%>
<div>
??? 当前时间为<fmt:formatNumber value="${time}" pattern="yyyy-MM-dd"/>
</div>
<fmt:formatNumber>
标签
语法:
<!-- 货币格式的数字 -->
<fmt:formatNumber value="数字" type="currency" /><!-- 数字格式化 -->
<fmt:formatNumber value="数字" type="number" maxIntegerDigits="整数部分位数" />
<fmt:formatNumber value="数字" type="number" maxFractionDigits="小数部分位数" />
<fmt:formatNumber value="数字" type="number" pattern="数字格式" /><!-- 数字百分比 -->
<fmt:formatNumber value="数字" type="percent" maxIntegerDigits="整数部分位数" />
<fmt:formatNumber value="数字" type="percent" maxFractionDigits="小数部分位数" />
案例:
<%
?? ?request.setAttribute("number", 12000.3456);
%>
<div>
?货币格式:<fmt:formatNumber type="currency" value="${number}" />
</div>
<div>
?数字格式化:<fmt:formatNumber type="number" maxIntegerDigits="3" value="${number}" />
?数字格式化:<fmt:formatNumber type="number" maxFractionDigits="3" value="${number}" />
?数字格式化:<fmt:formatNumber type="number" value="${number}" pattern="####.##"/>
</div>
<div>
?数字百分比:<fmt:formatNumber type="percent" maxIntegerDigits="3" value="${number}" />
?数字百分比:<fmt:formatNumber type="percent" maxFractionDigits="3" value="${number}" />
</div>