(笔记)Spring MVC学习指南_JSTL

本文介绍JSP标准标签库(JSTL)的各种标签及其用途,包括条件判断、循环、URL处理及格式化等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JSP标准标签库(JavaServer Pages Standard Tag Library,JSTL)是一个定制标签库的集合,用来解决像遍历map或集合、条件测试、XML处理,甚至数据库访问和数据库操作等常见的问题。
2.JSTL库

区域URI前缀
核心http://java.sun.com/jsp/jstl/corec
XMLhttp://java.sun.com/jsp/jstl/xmlx
国际化http://java.sun.com/jsp/jstl/fmtfmt
数据库http://java.sun.com/jsp/jstl/sqlsql
函数http://java.sun.com/jsp/jstl/functionsfn

在JSP页面中使用JSTL库,必须通过以下格式使用taglib指令:
<%@ taglib uri=”uri” prefix=”prefix” %>
例如,要使用Core库,必须在JSP页面的开头处做以下声明:
<%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c” %>
注:属性名称后面的星号(*)表示该属性是必需的。加号(+)表示该属性的rtexprvalue值为True,这意味着该属性可以赋静态字符串或者动态值(Java表达式,EL表达式,或者通过<jsp:attribute>设置的值)。rtexprvalue值为False时,表示该属性只能赋静态字符串的值。
3.一般行为
Core库中用来操作有界变量的3个一般行为:out、set、remove
(1)out标签
out标签在运算表达式时,是将结果输出到当前的JspWriter。out的语法有两种形式,即有body content和没有body content。

 <c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] />

 <c:out value="value" [escapeXml="{true|false}"]>
     default value
 </c:out>
属性类型描述
value*+对象要计算的表达式
escapeXml+布尔表示结果中的字符<、>、&、’和”将被转化为相应的实体码&lt;&gt;&#039;&#034;&amp;
default+对象默认值

例如,下列的out标签将输出有界变量x的值:
<c:out value="${x}" />
在JSP2.0版本前,out标签是用于输出有界对象值的最容易的方法。在JSP2.0及其更高的版本中,除非需要对某个值进行XML转义,否则可以放心地使用EL表达式。
${x}
如果包含一个或多个特殊字符的字符串没有进行XML转义,它的值就无法在浏览器中正常显示。此外,没有通过转义的特殊字符,会使网站易于遭受交叉网站的脚本攻击。
out中的default属性可以赋一个默认值,当赋予其value属性的EL表达式返回null时,就会显示默认值。default属性可以赋动态值,如果这个动态值返回null,out就会显示一个空的字符串。
(2)set标签
利用set标签,可以完成以下工作:
1)创建一个字符串和一个引用该字符串的有界变量
2)创建一个引用现存有界对象的有界变量
3)设置有界对象的属性
set标签的语法有4中形式。第一种形式用于创建一个有界变量,并用value属性在其中定义一个要创建的字符串或者现存有界对象。

 <c:set value="value" var="varName" [scope="{page|request|session|application}"] />

这里的scope属性指定了有界变量的范围。
第二种形式与第一种形式相似,只是要创建的字符串或者要引用的有界对象是作为body content赋值的。

 <c:set var="varName" [scope="{page|request|session|application}"]>
     body content
 </c:set>

第三种形式是设置有界对象的属性值。target属性定义有界对象,以及有界对象的property属性。对该属性的赋值是通过value属性进行的。

 <c:set target="target" property="propertyName" value="value" />

例如,下面的set标签是将字符串“Tokyo”赋予有界对象address的city属性。

 <c:set target="${address}" property="city" value="Tokyo">

必须在target属性中用一个EL表达式来引用这个有界对象。
第四种形式与第三种形式相似,只是赋值是作为body content完成的。

 <c:set target="target" property="propertyName">
     body content
 </c:set>

set标签的属性

属性类型描述
value+对象要创建的字符串,或者要引用的有界对象,或者新的属性值
var字符串要创建的有界变量
scope字符串新创建的有界变量的范围
target+对象其属性要被赋新值的有界对象;这必须是一个JavaBeans实例或者java.util.Map对象
property+字符串要被赋新值的属性名称

(3)remove标签
remove标签用于删除有界变量,其语法如下:

 <c:remove var="varName" [scope="{page|request|session|application}"] />

注意:有界变量引用的对象不能删除。因此,如果另一个有界对象也引用了同一个对象,仍然可以通过另一个有界变量访问该对象。
remove标签的属性

属性类型描述
var字符串要删除的有界变量的名称
scope字符串要删除的有界变量的范围

4.条件行为
条件行为用于处理页面输出取决于特定输入值的情况,这在Java中是利用if、if…else和switch声明解决的。
(1)if标签
if的语法有两种形式。第一种形式没有body content。

 <c:if test="testCondition" var="varName" [scope="{page|request|session|application}"] />

在这种情况下,var定义的有界对象一般是通过其他标签在同一个JSP的后续阶段再进行测试。
第二种形式中使用了一个body content。

 <c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]>
     body content
 </c:if>

body content是JSP,当测试条件的结果为True时,就会得到处理。

 <c:if var="loggedIn" test="${param.user=='ken' && param.password=='blackcomb'}" />
 ...
 ${loggedIn ? "You logged in successfully" : "Login failed"}

(2)choose、when和otherwise标签
choose和when标签的作用与Java中的关键字switch和case类似。otherwise标签则用于默认的条件块,假如没有任何一个when标签的测试条件结果为True,它就会得到处理。假如是这种情况,otherwise就必须放在最后一个when后。
choose和otherwise标签没有属性。when标签必须带有定义测试条件的test属性,用来决定是否应该处理body content。

 <c:choose>
     <c:when test="${param.status=='full'}">
         You are a full member
     </c:when>
     <c:when test="${param.status=='student'}">
         You are a student member
     </c:when>
     <c:otherwise>
         Please register
     </c:otherwise>
 </c:choose>

5.遍历行为
当需要无数次地遍历一个对象集合时,遍历行为就很有帮助。JSTL提供了forEach和forTokens两个执行遍历行为的标签。
(1)forEach标签
forEach标签会无数次地反复遍历body content或者对象集合。可以被遍历的对象包括java.util.Collection和java.util.Map的所有实现,以及对象数组或者主类型。也可以遍历java.util.Enumeration,但不应该在多个行为中使用Iterator或者Enumeration,因为无法重置Iterator或者Enumeration。
forEach标签的语法有两种形式。第一种形式是固定次数地重复body content。

 <c:forEach [var="varName"] begin="begin" end="end" step="step">
     body content
 </c:forEach>

第二种形式用于遍历对象集合。

 <c:forEach items="collection" [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
     body content
 </c:forEach>

forEach标签的属性

属性类型描述
var字符串引用遍历的当前项目的有界变量名称
items+支持的任意类型遍历的对象集合
varStatus字符串保存遍历状态的有界变量名称。类型值为javax.servlet.jsp.jstl.core.LoopTagStauts
begin+整数如果指定items,遍历将从指定索引处的项目开始,例如,集合中第一个项目的索引为0。如果没有指定items,遍历将从设定的索引值开始。如果指定,begin的值必须大于或者等于0
end+整数如果指定items,遍历将在(含)指定索引处的项目结束。如果没有指定items,遍历将在索引到达指定值时结束
step+整数遍历将只处理间隔指定step的项目,从第一个项目开始。在这种情况下,step的值必须大于或者等于1

例如,下列的forEach标签将显示“1,2,3,4,5”。

 <c:forEach var="x" begin="1" end="5">
     <c:out value="${x}" />,
 </c:forEach>

下面的forEach标签将遍历有界变量address的phones属性

 <c:forEach var="phone" items="${address.phone}">
     ${phone}
 </c:forEach>

对于每一次遍历,forEach标签都将创建一个有界变量,变量名称通过var属性定义。这个有界变量只存在于开始和关闭的forEach标签之间,一到关闭的forEach标签前,它就会被删除。
forEach标签有一个类型为javax.servlet.jsp.jstl.core.LoopTagStatus的变量varStatus。LoopTagStatus接口带有count属性,它返回当前遍历的“次数”。通过测试status.count%2的余数,可以知道该标签正在处理的是偶数编号的元素,还是奇数编号的元素。

 <c:forEach items="${books}" var="book" varStatus="status">
     <c:if test="${status.count%2 == 0}">
         <tr style="background:#eeeeff">
     </c:if>
     <c:if test="${status.count%2 != 0}">
         <tr style="background:#dedeff">
     </c:if>
     <td>${book.category.name}</td>
     <td>${book.title}</td>
     <td>${book.isbn}</td>
     <td>${book.author}</td>
 </tr>
 </c:forEach>

利用forEach还可以遍历Map。要分别利用key和value属性引用一个Map key和一个Map值。

 <c:forEach var="mapItem" items="map">
     ${mapItem.key} : ${mapItem.value}
 </c:forEach>
 <c:forEach items="${requestScope.bigCities}" var="mapItem">
     <c:forEach items="${mapItem.value}" var="city" varStatus="status">
         ${city}<c:if test="${!status.last}">,</c:if>
     </c:forEach>
 </c:forEach>

(2)forTokens标签
forTokens标签用于遍历以特定分隔符隔开的令牌,其语法如下:

 <c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
     body content
 </c:forTokens>

forTokens标签的属性

属性类型描述
var字符串引用遍历的当前项目的有界变量名称
items+支持的任意类型要遍历的token字符串
varStatus字符串保存遍历状态的有界变量名称。类型值为javax.servlet.jsp.jstl.core.LoopTagStauts
begin+整数遍历的起始索引,此处索引是从0开始的。如有指定,begin的值必须大于或者等于0
end+整数遍历的终止索引,此处索引是从0开始的
step+整数遍历将只处理间隔指定step的token,从第一个token开始。如有指定,step的值必须大于或者等于1
delims+字符串一组分隔符
 <c:forTokens var="item" items="Argentina,Brazil,Chile" delims=",">
     <c:out value="${item}" /><br />
 </c:forTokens>

6.与URL相关的行为
(1)url标签
url标签用于组合一个资源的正确URL。它必须考虑应用程序上下文是否为默认上下文。
像下面这样使用url标签:

<style type="text/css">
    @import url("<c:url value="/css/main.css"/>");
</style>

如果它是默认的上下文,那么这个URL就会被翻译成如下形式:
<style type="text/css">@import url("/css/main.css");</style>
如果它不是默认的上下文,那么这个URL就会被翻译成如下形式:
<style type="text/css">@import url("/myapp/css/main.css");</style>
使用url标签时可以没有body content,其语法如下:

 <c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"] />

有body content的语法如下:

 <c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"]>
     <c:param>
 </c:url>

url标签的属性

属性类型描述
value字符串要处理的URL
context字符串在指定属于外部上下文的相对URL资源时的上下文名称
var字符串所处理URL要创建的有界变量
scope字符串新创建有界变量的范围

(2)redirect标签
redirect标签会发出跳转到客户端的HTTP。
redirect标签的属性

属性类型描述
url字符串要跳转的URL
context字符串在跳转到属于外部上下文的相对URL资源时的上下文名称

7.格式化行为
(1)formatNumber标签
formatNumber用于格式化数字。formatNumber的语法有两种形式。第一种形式没有body content:

 <fmt:formatNumber value="numericValue" [type="{number|currency|percent}"] [pattern="customPattern"] [currencyCode="currencyCode"] [currencySymbol="currencySymbol"] [groupingUsed="{true|false}"] [maxIntegerDigits="maxIntegerDigits"] [minIntegerDigits="minIntegerDigits"] [maxFractionDigits="maxFractionDigits"] [minFractionDigits="minFractionDigits"] [var="varName"] [scope="{page|request|session|application}"] />

第二种形式有body content:

 <fmt:formatNumber [type="{number|currency|percent}"] [pattern="customPattern"] [currencyCode="currencyCode"] [currencySymbol="currencySymbol"] [groupingUsed="{true|false}"] [maxIntegerDigits="maxIntegerDigits"] [minIntegerDigits="minIntegerDigits"] [maxFractionDigits="maxFractionDigits"] [minFractionDigits="minFractionDigits"] [var="varName"] [scope="{page|request|session|application}"]>
     numeric value to be formatted
 </fmt:formatNumber>

formatNumber标签的属性

属性类型描述
value+字符串或数字要格式化的数字化值
type+字符串说明该值是要被格式化成数字、货币,还是百分比。这个属性的值如下:number,currency,percent
pattern+字符串定制格式化样式
currencyCode+字符串ISO 4217货币代码
currencySymbol+字符串货币符号
groupingUsed+布尔说明输出结果中是否包含组分隔符
maxIntegerDigits+整数规定输出结果的整数部分最多几位数字
minIntegerDigits+整数规定输出结果的整数部分最少几位数字
maxFractionDigits+整数规定输出结果的小数部分最多几位数字
minFractionDigits+整数规定输出结果的小数部分最少几位数字
var字符串将输出结果存为字符串的有界变量名称
scope字符串var的范围。如果有scope属性,则必须指定var属性

formatNumber的用法范例

行为结果
<fmt:formatNumber value="12" type="number" minIntegerDigits="3" />012
<fmt:formatNumber value="12" type="number" minFractionDigits="2" />12.00
<fmt:formatNumber value="123456.78" pattern=".000" />123456.780
<fmt:formatNumber value="12" type="currency" currencyCode="GBP" />GBP 12.00
<fmt:formatNumber value="0.125" type="percent" minFractionDigits="2" />12.50%

注意,在格式化货币时,如果没有定义currencyCode属性,就无法使用浏览器的locale。
(2)formatDate标签
formatDate标签用于格式化日期,其语法如下:

 <fmt:formatDate value="date" [type="{time|date|both}"] [dateStyle="{default|short|medium|long|full}"] [timeStyle="{default|short|medium|long|full}"] [pattern="customPattern"] [timeZone="timeZone"] [var="varName"] [scope="{page|request|session|application}"] />

formatDate标签的属性

属性类型描述
value+java.util.Date要格式化的日期和/或时间
type+字符串说明要格式化的是时间、日期,还是时间与日期元件
dataStyle+字符串预定义日期的格式化样式,遵循java.text.DateFormat中定义的语义
timeStyle+字符串预定义时间的格式化样式,遵循java.text.DateFormat中定义的语义
pattern+字符串定制格式化样式
timezone+字符串或java.util.TimeZone定义用于显示时间的时区
var字符串将输出结果存为字符串的有界变量名称
scope字符串var的范围

(3)timeZone标签
timeZone标签用于定义时区,使其body content中的时间信息按指定时区进行格式化或者解析

<fmt:timeZone value="timeZone">
    body content
</fmt:timeZone>

如果value值为null或者empty,则使用GMT时区。
(4)setTimeZone标签
setTimeZone标签用于将指定时区保存在一个有界变量或者时间配置变量中。

 <fmt:setTimeZone value="timeZone" [var="varName"] [scope="{page|request|session|application}"] />

(5)parseNumber标签
parseNumber标签用于将以字符串标识的数字、货币或者百分比解析成数字。其语法有两种形式。第一种形式没有body content:

 <fmt:parseNumber value="numericValue" [type="{number|currency|percent}"] [pattern="customPattern"] [parseLocale="parseLocale"] [integerOnly="{true|false}"] [var="varName"] [scope="{page|request|session|application}"] />

第二种形式有body content:

 <fmt:parseNumber [type="{number|currency|percent}"] [pattern="customPattern"] [parseLocale="parseLocale"] [integerOnly="{true|false}"] [var="varName"] [scope="{page|request|session|application}"]>
     numeric value to be parsed
 </fmt:parseNumber>

parseNumber标签的属性

属性类型描述
value+字符串或数字要解析的字符串
type+字符串说明该字符串是要被解析成数字、货币,还是百分比
pattern+字符串定制格式化样式,决定value属性中的字符串要如何解析
parseLocale+字符串或者java.util.Locale定义locale,在解析操作期间将其默认格式化样式,或将pattern属性定义的样式应用其中
integerOnly布尔说明是否只解析指定值的整数部分
var字符串保存输出结果的有界变量名称
scope字符串var的范围

(6)parseDate标签
parseDate标签以区分地域的格式解析以字符串表示的日期和时间。其语法有两种形式。第一种形式没有body content:

 <fmt:parseDate value="dateString" [type="{time|date|both}"] [dateStyle="{default|short|medium|long|full}"] [timeStyle="{default|short|medium|long|full}"] [pattern="customPattern"] [timeZone="timeZone"] [parseLocale="parseLocale"] [var="varName"] [scope="{page|request|session|application}"] />

第二种形式有body content:

 <fmt:parseDate [type="{time|date|both}"] [dateStyle="{default|short|medium|long|full}"] [timeStyle="{default|short|medium|long|full}"] [pattern="customPattern"] [timeZone="timeZone"] [parseLocale="parseLocale"] [var="varName"] [scope="{page|request|session|application}"]>
     date value to be parsed
 </fmt:praseDate>

parseDate标签的属性

属性类型描述
value+字符串要解析的字符串
type+字符串说明要解析的字符串中是否包含日期、时间或二者均有
dateStyle+字符串日期的格式化样式
timeStyle+字符串时间的格式化样式
pattern+字符串定制格式化样式,决定要如何解析该字符串
timeZone+字符串或者java.util.TimeZone定义时区,使日期字符串中的时间信息均根据它来解析
parseLocale+字符串或者java.util.Locale定义Locale,在解析操作期间用其默认格式化样式,或将pattern属性定义的样式应用其中
var字符串保存输出结果的有界变量名称
scope字符串var的范围

8.函数
除了定制行为外,JSTL 1.1和JSTL 1.2还定义了一套可以在EL表达式中使用的标准函数。这些函数都集中在function标签库中。为了使用这些函数,必须在JSP的最前面使用以下taglib指令:

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

调用函数时,要以下列格式使用一个EL:${fn:functionName}
(1)contains函数
contains函数用于测试一个字符串中是否包含指定的字符串。其语法如下:contains(string, substring)
例如${fn:contains("Stella Cadente", "Cadente")}返回True
(2)containsIgnoreCase函数
containsIgnoreCase函数与contains函数相似,但测试是区分大小写的。
(3)endsWith函数
endsWith函数用于测试一个字符串是否以指定的后缀结尾。语法如下:endsWith(string, suffix)
例如{fn:endsWith("Hello World", "World")}返回True
(4)escapeXml函数
escapeXml函数用于给String编码。这种转换与out标签将其escapeXml属性设为True一样。escapeXml的语法如下:escapeXml(string)
例如,下面的EL表达式:${fn:escapeXml("Use <br/> to change lines")}将被渲染成Use &lt;br/&gt; to change lines
(5)indexOf函数
indexOf函数返回指定子字符串在某个字符串中第一次出现时的索引。如果没有找到指定的子字符串,则返回-1。其语法如下:indexOf(string, substring)
(6)join函数
join函数将一个String数组中的所有元素都合并成一个字符串,并用指定的分隔符分开,其语法如下:join(array, separator)
如果这个数组为null,就会返回一个空字符串。
(7)length函数
length函数用于返回集合中的项目数,或者字符串中的字符数,其语法如下:length(input)
(8)replace函数
replace函数将字符串中出现的所有beforeString用afterString替换,并返回结果,其语法如下:replace(string, beforeSubString, afterSubString)
(9)split函数
split函数用于将一个字符串分离成一个子字符串数组。它的作用与join相反。
(10)startsWith函数
startsWith函数用于测试一个字符串是否以指定的前缀开头,其语法如下:startsWith(string, prefix)
(11)substring函数
substring函数用于返回一个从 指定基于0的起始索引(含)到指定基于0的终止索引的子字符串,其语法如下:substring(string, beginIndex, endIndex)
(12)substringAfter函数
substringAfter函数用于返回指定子字符串第一次出现后的字符串部分,其语法如下:substringAfter(string, substring)
(13)substringBefore函数
substringBefore函数用于返回指定子字符串第一次出现前的字符串部分,其语法如下:substringBefore(string, substring)
(14)toLowerCase函数
toLowerCase函数将一个字符串转换成它的小写版本,其语法如下:toLowerCase(string)
(15)toUpperCase函数
toUpperCase函数将一个字符串转换成它的大写版本,其语法如下:
toUpperCase(string)
(16)trim函数
trim函数用于删除一个字符串开头和结尾的空白,其语法如下:trim(string)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值