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"%> |