EL表达式与JSTL标签库

JSP 页面中经常用到EL表达式和JSTL标签库。

EL表达式主要作用:获取数据执行运算获取Web常用隐式对象

EL表达式以${}结构表示;取值从左到右,如果需要文件${,在前面加转义符\${

EL表达式

取值规则

  EL可以返回任意类型的值,如果表达式结果是带有属性的对象,则可以利用[]或者.运算符来访问其属性,即通过getter方法获取其属性。

访问对象的属性:

  1. ${object.propertyName}:简便快捷,最常使用。
  2. ${object["propertyName"]}:格式规范,但不便捷,如果propertyName不是有效的Java变量名,则只能使用[]运算符。
  3. 取值从左到右,对于expr-a[expr-b]取值方法如下:
    • 如果expr-ajava.util.List,则expr-bint表示索引位置;否则报错IndexOutBoundsException,返回null
    • 如果expr-ajava.util.Map,则expr-b应为Map中的一个key,如果不是,返回null
    • 如果expr-a不是一个集合,则必须是JavaBean
  4. 访问JavaBean${employee.dept.name}
  5. 使用示例如下:
    • ${pageContext["accept-language"]}
    • ${pageContext.request.servletPath}
    • ${pageContext["request"]["servletPath"]}
    • ${pageContext.request["servletPath"]}
    • ${pageContext["request"].servletPath}

运算符

  1. 算术运算符:+,-,*,/,%取余,mod取模;乘除取余/取模优先级相同,高于加减
  2. 逻辑运算符:和&&/and,或||/or,非!/not
  3. 关系运算符:等于==和eq,不等于!=和ne,大于>和gt,大于或等于>=和ge,小于<和lt,小于或等于<=和le
    关系运算符返回的是boolean类型:true,false
  4. 三元表达式:${statement?A:B},如果statementtrue,则返回A,否则B
    ${sessionScope.user.username==null?"你已登录":"你还没有登录"}
  5. empty运算符${empty username},检查作用域中是否有该变量存在,判断变量是否为null或者一个长度为0的空字符串,如果空返回true,否则返回false

隐式对象

EL中,提供了 11 个隐式对象用来访问Web开发中常用的JSP对象并获取数据。

EL表达式的隐式对象 描述
pageContext JSP页面的上下文对象,可以访问JSP对隐式对象,如请求、响应、会话、输出、servletContext等
param 包含所有请求参数,参数名作为 Key 的 Map,${param.name}
paramValues 包含所有请求参数,参数名作为 Key 的 Map,每个 Key 的值是个字符串数组, ${paramValues.name}, ${paramValues.name[0]}
header 包含请求标题,并用标题名作为 Key 的 Map,${header.name}
headerValues 包含请求标题,并用标题名作为 Key 的 Map,每个 Key 的值是个字符串数组, ${header.name[0]}
cookie 包含当前请求对象中所有 Cookie 对象的 Map, Cookie名称是 Key名称,每个 Key 映射到一个 Cookie对象, ${cookie.name.value}${cookie.JSESSIONID.value}
initParam 包含所有的环境初始化参数,用参数名作为 Key 的 Map, ${initParam.name}
pageScope 包含页面域内的所有属性(Attribute)的 Map,属性名称是 Map 的 key,${pageScope.name}
requestScope 包含请求域内的所有属性(Attribute)的 Map,属性名称是 Map 的 key,${requestScope.name}
sessionScope 包含会话域内的所有属性(Attribute)的 Map,属性名称是 Map 的 key,${sessionScope.name}
applicationScope 包含应用程序上下域内的所有属性(Attribute)的 Map,属性名称是 Map 的 key,${applicationScope.name}

EL表达式也可以支持默认访问,即省略 scope对象,直接访问name变量,默认范围从小到大取值,即首先取pageScope中的name,如果为null,则取requestScope中的name,依次类推。

pageContext

JSP中有包含9个内置对象,划分为四大域(request,session,page,application),
pageContext页面上下文对象表示当前JSP页面的javax.servlet.jsp.PageContext,可以访问所有其他JSP对象,如下:

对象 JSP类型 作用域 生命周期
1 request javax.servlet.http.HttpServletRequest Request 本次请求有效
2 response javax.servlet.http.HttpServletResponse Page 当前页面有效
3 session javax.servlet.http.HttpSession Session 本次会话有效,和服务器断开后失效
4 application javax.servlet.ServletContext Application 整个WEB应用中都有效,直到服务器停止才失效
5 config javax.servlet.ServletConfig Page 当前页面有效
6 out javax.servlet.jsp.JspWrite Page 当前页面有效
7 page javax.servlet.jsp.HttpJspPage Page 当前页面有效
8 pageContext javax.servlet.jsp.PageContext Page 当前页面有效
9 exception javax.lang.Throwable Page 当前页面有效

pageContext对象可以访问JSP的9个隐式对象,例用示例:

  1. 请求方式:${pageContext.request.method}
  2. 请求上下文路径:${pageContext.request.contextPath}
  3. 请求URL:${pageContext.request.requestURL}

JSTL标签库

标签库 作用 URI 前辍
核心 包含 Web 应用常见工作,输入,输出等 http://java.sun.com/jsp/jstl/core c
国际化 语言区域,消息,数字和日期格式化 http://java.sun.com/jsp/jstl/fmt fmt
XML 访问XML文件 http://java.sun.com/jsp/jstl/xml x
数据库 访问数据库 http://java.sun.com/jsp/jstl/sql sql
函数 集合长度,字符串操作 http://java.sun.com/jsp/jstl/functions fn
JSP文件头引入:
  1. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
  2. <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
  3. <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
  4. <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="xml"%>
  5. <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

core标签库

引入标签库:

  • 2.3版本及更早版本引入:<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
  • 2.4版本及更新版本引入:<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
  1. 多用途核心标签
    • <c:out>:主用作取值输出。
    • <c:set>:为变量属性赋值。
    • <c:remove>:删除scope中的变量。
    • <c:catch>:用于在JSP页面中捕获异常,只有一个var属性,描述异常的变量,如果没有该属性,只捕获不处理。
  2. 条件控制标签
    • <c:if>:对条件进行判断。
    • <c:choose>:没有属性,只作为父标签使用, 可以嵌套多个<c:when>
    • <c:when> :一个test属性,表示需要判断的条件。
    • <c:otherwise> :没有属性,相当于else
  3. 循环控制标签
    • <c:forEach>:用于循环控是,遍历集合、数组。
      属性begin-起始索引; end-结束索引; step-循环的步长,默认为1; items-遍历的集合对象; var-定义循环集合中的元素的变量名; varStatus-保存循环状态的变量。
    • <c:forTokens>:与c:forEach标签属性相同,多一个指定分隔符的属性-delims; 多一个作用域属性-scope,默认为page
  4. URL相关标签
    • <c:import>:用于包含另一个JSP页面到本页面中。
    • <c:url><c:redirect><c:param>

fmt标签库

引入标签库:<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

  1. fmt:formatDate,用于格式化时间日期
    示例:<fmt:formatDate value="${dateStr}" pattern="yyyy-MM-dd HH:mm:ss" />

常用标签示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>c:if 标签实例</title>
</head>
<body>
<!-- c:out -->
<c:out value=${username} default="游客" />

<!-- c:set -->
创建属性并赋值,指定作用域。
<c:set var="username" value="游客" scope="page" />
给 page 域中的 User 对象的 username 属性赋值。
<c:set target="${pageScope.user}" property="username" value="游客" />

<!-- c:remove -->
<c:remove var="username" scope="page">

<!-- c:catch -->
<c:catch var="jspError">
<% int i = 5/0; %>
</c:catch>
<p>${jspError}</p>

<!-- c:if -->
<c:if test="${score>=90"> 优秀 </c:if>

<!-- c:choose,c:when/c:otherwise -->
<c:choose>
<c:when test="${score>= 90}">
<p>及格</p>
</c:when>
<c:otherwise>
<p>不及格</p>
</c:otherwise>
</c:choose>

<!-- c:forEach -->
<c:forEach var="i" begin="1" end="5">
Item <c:out value="${i}"/><p>
</c:forEach>
courseList是个普通的List集合。
<c:forEach items="${requestScope.courseList}" var="course">
<p>${course}</p>
</c:forEach>
bookList是个集合,里面的元素是对象。
<c:forEach items="${requestScope.bookList}" var="book">
<p>${book.id}</p><p>${book.name}</p><p>${book.price}</p>
</c:forEach>
bookMap是个Map集合。
<c:forEach items="${requestScope.bookList}" var="entry">
<p>${entry.key}</p><p>${entry.value.id}</p><p>${entry.value.name}</p><p>${entry.value.price}</p>
</c:forEach>


<!-- c:forTokens -->
<c:forTokens items="google,runoob,taobao" delims="," var="name">
<c:out value="${name}"/><p>
</c:forTokens>
</body>
</html>

参考:JSP 标准标签库(JSTL)
参考:JSP EL表达式语言
参考:JSTL标签大全详解

作者

光星

发布于

2018-03-09

更新于

2022-06-17

许可协议

评论