EL 表达式和 JSTL 标签

发布时间:2024年01月24日

EL和JSTL也支持thymeleaf模板引擎

主要内容

  • EL表达式 重点

  • JSTL标签 重点

章节目标

  • 掌握EL表达式的使用

  • 掌握域对象的取值方式

  • 掌握JSTL标签的使用

第一节 EL 表达式

1. 什么是 EL 表达式

EL 全称为 Expression Language(表达式语言)

2. 为什么要使用 EL 表达式

在 jsp 页面中编写小脚本,会存在以下不足:

  • 代码结构混乱

  • 脚本与HTML混合,容易出错

  • 代码不易于维护

  • 获取JavaBean属性必须要实例化及强制类型转化

为了解决这些不足,JSP提供了 EL 表达式来简化编码,可以使用 EL 表达式来替换 jsp 页面中的小脚本,使得页面和业务逻辑处理相分离,同时还能实现数据类型的自动转型

3. 如何使用 EL 表达式

3.1 EL 获取变量的值

语法:

${变量名}

案例:

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 隐式对象

3.2 EL 隐式对象

可以通过隐式对象来指定 EL 的取值的范围:

<!-- 在session范围内取值 -->
${sessionScope.user} 

如果 EL 未指定隐式对象,则取值默认从 pageScope 取值,如果未找到,则从requestScope取值,如果还是未找到,则从sessionScope取值,如果依然未找到,则从applicationScope取值,如果最终都未找到,那么返回 null值

3.3 EL 获取对象的属性值

语法:

<!-- Java中的访问方式 -->
${ 对象名.属性名 }

<!-- JS中的访问方式 -->
${ 对象名["属性名"] }

3.4 EL 获取 List 集合中的值

语法:

${ 集合名称[下标] }

3.5 EL 获取 Map 集合中的值

语法:

<!-- Java中的访问方式 -->
${ 集合名称.键名 }

<!-- JS中的访问方式 -->
${ 集合名称["键名"] }

3.6 EL 表达式中的操作符

第二节 JSTL 标签

1. 什么是 JSTL

JSTL 全称为 JavaServerPages Standard Tag Library,意味 JSP标准标签库

2. 为什么要使用JSTL

EL 能够简化 jsp 页面编码,但是,却不能进行逻辑判断,也不能进行循环处理,为了弥补 EL 这方面的不足,jsp 提供了 JSTL 标签,JSTL 标签通常都会与 EL 配合使用,解决页面的逻辑问题。

3. JSTL 标签库分类

经常使用的标签就是核心标签库格式化标签库

4. JSTL 标签库的使用步骤

  • 引入JSTL标签库支持的jar包:jstl.jarstandard.jar 需要将这两个包拷贝至tomcat下的lib目录中

  • jsp 页面引入标签库,如

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

5. JSTL 核心标签库

5.1 通用标签

  • <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"/>

5.2 条件标签
  • <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>

6. 格式化标签

  • <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>

文章来源:https://blog.csdn.net/m0_68933188/article/details/135763736
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。