EL表达式与JSTL标签库
JSP 页面中经常用到EL表达式和JSTL标签库。
EL表达式主要作用:获取数据,执行运算,获取Web常用隐式对象。
EL表达式以${}结构表示;取值从左到右,如果需要文件${,在前面加转义符\${。
EL表达式
取值规则
EL可以返回任意类型的值,如果表达式结果是带有属性的对象,则可以利用[]或者.运算符来访问其属性,即通过getter方法获取其属性。
访问对象的属性:
${object.propertyName}:简便快捷,最常使用。${object["propertyName"]}:格式规范,但不便捷,如果propertyName不是有效的Java变量名,则只能使用[]运算符。- 取值从左到右,对于
expr-a[expr-b]取值方法如下:- 如果
expr-a为java.util.List,则expr-b为int表示索引位置;否则报错IndexOutBoundsException,返回null。 - 如果expr-a为java.util.Map,则
expr-b应为Map中的一个key,如果不是,返回null。 - 如果
expr-a不是一个集合,则必须是JavaBean。
- 如果
- 访问JavaBean:
${employee.dept.name} - 使用示例如下:
${pageContext["accept-language"]}${pageContext.request.servletPath}${pageContext["request"]["servletPath"]}${pageContext.request["servletPath"]}${pageContext["request"].servletPath}
运算符
- 算术运算符:
+,-,*,/,%取余,mod取模;乘除取余/取模优先级相同,高于加减。 - 逻辑运算符:和
&&/and,或||/or,非!/not。 - 关系运算符:等于
==和eq,不等于!=和ne,大于>和gt,大于或等于>=和ge,小于<和lt,小于或等于<=和le。
关系运算符返回的是boolean类型:true,false。 - 三元表达式:
${statement?A:B},如果statement为true,则返回A,否则B。${sessionScope.user.username==null?"你已登录":"你还没有登录"} 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个隐式对象,例用示例:
- 请求方式:
${pageContext.request.method} - 请求上下文路径:
${pageContext.request.contextPath} - 请求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文件头引入: |
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%><%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%><%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="xml"%><%@ 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" %>
- 多用途核心标签
<c:out>:主用作取值输出。<c:set>:为变量属性赋值。<c:remove>:删除scope中的变量。<c:catch>:用于在JSP页面中捕获异常,只有一个var属性,描述异常的变量,如果没有该属性,只捕获不处理。
- 条件控制标签
<c:if>:对条件进行判断。<c:choose>:没有属性,只作为父标签使用, 可以嵌套多个<c:when>。<c:when>:一个test属性,表示需要判断的条件。<c:otherwise>:没有属性,相当于else。
- 循环控制标签
<c:forEach>:用于循环控是,遍历集合、数组。
属性:begin-起始索引;end-结束索引;step-循环的步长,默认为1;items-遍历的集合对象;var-定义循环集合中的元素的变量名;varStatus-保存循环状态的变量。<c:forTokens>:与c:forEach标签属性相同,多一个指定分隔符的属性-delims; 多一个作用域属性-scope,默认为page。
- URL相关标签
<c:import>:用于包含另一个JSP页面到本页面中。<c:url>,<c:redirect>,<c:param>
fmt标签库
引入标签库:<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
- fmt:formatDate,用于格式化时间日期
示例:<fmt:formatDate value="${dateStr}" pattern="yyyy-MM-dd HH:mm:ss" />
常用标签示例
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> |

