(笔记)Spring MVC学习指南_JSTL

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

区域 URI 前缀
核心 http://java.sun.com/jsp/jstl/core c
XML http://java.sun.com/jsp/jstl/xml x
国际化 http://java.sun.com/jsp/jstl/fmt fmt
数据库 http://java.sun.com/jsp/jstl/sql sql
函数 http://java.sun.com/jsp/jstl/functions fn

在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表达式,或者通过设置的值)。rtexprvalue值为False时,表示该属性只能赋静态字符串的值。
3.一般行为
Core库中用来操作有界变量的3个一般行为:out、set、remove
(1)out标签
out标签在运算表达式时,是将结果输出到当前的JspWriter。out的语法有两种形式,即有body content和没有body content。

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

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

例如,下列的out标签将输出有界变量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属性在其中定义一个要创建的字符串或者现存有界对象。

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

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

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

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

 set target="target" property="propertyName" value="value" />

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

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

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

 set target="target" property="propertyName">
     body content
 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。

 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时,就会得到处理。

 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”。

 forEach var="x" begin="1" end="5">
     "${x}" />,
 forEach>

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

 forEach var="phone" items="${address.phone}">
     ${phone}
 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值。

 forEach var="mapItem" items="map">
     ${mapItem.key} : ${mapItem.value}
 forEach>
 forEach items="${requestScope.bigCities}" var="mapItem">
     forEach items="${mapItem.value}" var="city" varStatus="status">
         ${city}if test="${!status.last}">,if>
     forEach>
 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(""/>");
style>

如果它是默认的上下文,那么这个URL就会被翻译成如下形式:

如果它不是默认的上下文,那么这个URL就会被翻译成如下形式:

使用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的用法范例

行为 结果
012
12.00
123456.780
GBP 12.00
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
to change lines")}
将被渲染成Use <br/> 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)

你可能感兴趣的:(SpringMVC)