JSTL标签库由标签库和EL表达式两部分组成,JSP2.0最重要的特性之一就是表达式语言EL(Expression Language),EL在JSP2.0及其更高版本,JSP容器已经能够独立的解释EL表达式。
EL表达式
EL表达式主要作用:
- 获取数据:从各种类型的Web作用域中检索JAVA对象,获取数据,包括访问JavaBean的属性、List集合、Map集合、数组等。
- 执行运算:支持关系运算、逻辑运算和算术运算。
- 获取Web开发常用对象:EL表达式定义了一些隐式对象,利用隐式对象可以获取Web常用对象的引用。
EL表达式可以返回任意类型的值,如果EL表达式的结果是一个带有属性的对象,则可以利用 [ ] 或 . 运算符来访问其属性,即通过 getter 方法获取其属性,[ ]是比较规范的形式,且当属性是变量时,只能使用 [] 。
${pageContext.request}
${pageContext["request"]}
取值规则:
对于 ${expr-a[expr-b]} 形式EL表达式,取值方法如下:
(1)先计算 expr-a 得到 value-a。
(2)如果 value-a 为null,则返回null。
(3)然后计算 expr-b 得到 value-b。
(4)如果 value-b 为null,则返回null。
(5)如果 value-a 为 java.util.List,则要进行以下处理:
- 强制 value-b 为 int,如果不是,则抛出异常。
- 如果 value-a.get(value-b) 抛出IndexOutBoundsException,则返回null。
- 返回 value-a.get(value-b) 的值。
(6)如果 value-a 为 java.util.Map,则会查看 value-b 是否为Map中的一个key,如果是,则返回 value-a.get(value-b),如果不是,则返回null。
(7)如果 value-a 不是一个集合,那么,value-a 必须是一个JavaBean,value-b必须强制为String类型,如果 value-b 是 value-a 的一个可读属性,会调用该属性的getter方法返回值。反之,会抛出异常。
El表达式的运算符
算术运算符:+、-、*、/、%(mod)
逻辑运算符:&&(and)、||(or)、!(not)
关系运算符:==(eq)、!=(ne)、>(gt)、>=(ge)、<(lt)、<=(le)
empty运算符:用来检测作用域中是否有该变量存在,然后在判断该变量是否为null或空字符串。${empty name}
EL表达式的隐式对象
在EL中,提供了11个隐式对象用来访问Web开发中常用的JSP对象来获取数据。
pageContext、param、header、headerValues、cookie、initParam、pageScope、requestScope、sessionScope、applicationScope
pageContext:表示当前JSP页面的javax.servlet.jsp.PageContext,它可以访问其它JSP的对象。
对象 | JSP类型 |
---|---|
request | javax.servlet.http.HttpServletRequest |
response | javax.servlet.http.HttpServletResponse |
session | javax.servlet.http.HttpSession |
application | javax.servlet.ServletContext |
config | javax.servlet.ServletConfig |
out | javax.servlet.jsp.JspWriter |
page | javax.servlet.jsp.HttpJspPage |
exception | java.lang.Throwable |
${pageContext.request.method}
${pageContext.request.contextPath}
${pageContext.request.requestURL}
param:用于获取请求参数值,param表示包含所有请求参数的Map
${param.username}
paramValues:用于获取一个请求参数的多个值,paramValues表示包含所有请求参数的Map,每个key的值是一个字符串数组。
${paramValues.hobbys[0]}
header:用于获取请求标题,header表示包含所有请求标题的Map。
//accept-language不是一个有效的Java变量名
header["accept-language"]
header.connection
headerValues:用于获取请求标题的多个值,与header不同的时返回一个字符串数组。
${headerValues["accept-language"][0]}
cookie:用于获取Cookie对象,获取名为JSESSIONID的Cookie对象及值
${cookie.JSESSIONID}
${cookie.JSESSIONID.value}
initParam:用于获取Web应用程序上下文参数的值。
${initParam.contextConfigLoaction}
pageScope、requestScope、sessionScope和application分别从page、request、session、application 4个作用域中获取存储在其中的属性值。
${pageScope.username}
${requestScope.username}
${sessionScope.username}
${application.username}
JSTL标签库
JSTL中的标签分为5大类:
标签库 | 作用 | 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 |
Core 标签库
Core标签库,又被称为核心标签库,该标签库中一共有14个标签,被分为4类,分别是:
多用途核心标签:<c:out>、<c:set>、<c:remove>、<c:catch>
条件控制标签:<c:if>、<c:choose>、<c:when>、<c:otherwise>
循环控制标签:<c:forEache>、<c:forTokens>
URL相关标签:<c:import>、<c:url>、<c:redirect>、<c:param>
<c:out>
属性 | 描述 |
---|---|
value | 输出到页面的数据,可以是EL表达式和常量 |
defalut | 当value为空时显示的数据 |
escapeXml | 当设置为true时会主动更换特殊字符。表示结果中的字符<、>、&等将会转换成lt、gt、amp等 |
<c:out value="{sessionScope.username}" default="游客"/>
<c:set>
属性 | 描述 |
---|---|
value | 要设置的值,可以是EL表达式和常量 |
var | 要创建的变量名 |
scope | 新创建的变量的作用域,默认为page |
target | 要被赋值的JavaBean实例的名称 |
property | JavaBean实例的属性名称 |
<c:set var="username" value="admin" scope="page"/>
<!--设置pageScope中Uesr对象的username属性-->
<c:set target="${pageScope.user}" property="username" value="guest"/>
<c:remove>
属性 | 描述 |
---|---|
var | 要删除的变量名 |
scope | 变量的作用域,默认为page |
<c:remove var="username" scope="page"/>
<c:catche>
属性 | 描述 |
---|---|
var | 存储异常信息的变量 |
<c:catch var="err">
<% int i = 5/0; %>
</c:catch>
${err}
<c:if>
属性 | 描述 |
---|---|
test | 需要判断的条件 |
var | 保存判断结果的变量名,该变量的值为true或false |
scope | 变量的作用域,默认为page |
<c:if test="${param.loginname=='admin' && param.password=='123'}" var="islogin" scope="request">
${requestScope.islogin},登录成功
</c:if>
<c:choose>、<c:when>和<c:otherwise>
<c:choose>
<c:when test="${param.loginname=='admin' && param.password=='123'}">
登录成功
</c:when>
<c:otherwise>
登录失败
</c:otherwise>
</c:choose>
<c:forEach>
属性 | 描述 |
---|---|
begin | 开始条件,如果指定items,循环从begin指定的索引处开始 |
end | 结束条件,如果指定items,循环从end指定的索引处结束 |
step | 循环的步长,默认为1 |
items | 遍历的集合对象 |
var | 循环集合中的元素的变量名 |
varStatus | 保存循环状态的变量,类型为javax.servlet.jsp.core.LoopTagStatus |
<c:forEach begin="1" end="5" step="2" varStatus="vs">
索引:${vs.index}
计数:${vs.count}
是否为第一个元素:${vs.first}
是否为最后一个元素:${vs.last}
</c:forEach>
<!--遍历List集合-->
<c:forEach items="${requestScope.bookList}" var="book">
${book.id}
${book.name}
</c:forEach>
<!--遍历Map集合-->
<c:forEach items="${requestScope.bookMap}" var="entry">
${entry.key}
${entry.value}
</c:forEach>
<c:forTokens>
属性 | 描述 |
---|---|
begin | 开始条件,如果指定items,循环从begin指定的索引处开始 |
end | 结束条件,如果指定items,循环从end指定的索引处结束 |
step | 循环的步长,默认为1 |
items | 分割的EL表达式或常量字符串 |
var | 循环集合中的元素的变量名 |
varStatus | 保存循环状态的变量,类型为javax.servlet.jsp.core.LoopTagStatus |
delims | 分隔符 |
scope | 变量的作用域,默认为page |
<c:forTokens items="a,b,c,d" delims="," var="s">
${s}
</c:forTokens>
<c:import>
<!--包含另一个页面-->
<c:import url="title.jsp"/>
<c:url>
属性 | 描述 |
---|---|
value | 页面的URL地址 |
var | 存储URL的变量名 |
context | 该属性用于得到不同的context下的URL地址。当使用context属性时,必须以”/”开头 |
scope | 变量的作用域,默认为page |
<c:url value="index.jsp" var="myurl" context="/myproject" scope="page"></c:url>
fmt、fn、x、sql标签库并不常用,在此不做详细介绍
fmt标签
requestEncoding
setLocale
timeZone
setTimeZone
bundle
setBundle
message
param
formatNumber
parseNumber
formatDate
parseDate
fn标签
contains
containsIgnreCase
endsWith
escapeXml
indexOf
join
length
replace
split
startsWith
substring
substringAfter
substringBefore
toLowerCase
toUpperCase
trim
x标签
choose
out
if
forEach
otherwise
param
parse
set
transform
when
sql标签
transaction
query
update
param
dateParam
setDataSource