5.6.3 timeZone标签
5.6.3 timeZone标签
timeZone
标签用于定义时区,使其body content
中的时间信息按指定时区进行格式化或者解析。其语法如下:
1 | <fmt:timeZone value="timeZone"> |
body content
是JSP
。
timeZone标签的属性
timeZone
只有一个value
属性,value
属性的属性值可以是类型为String
或者java.util.TimeZone
的动态值。
美国和加拿大时区的值
美国和加拿大时区的值如下表所示:
缩写 | 全名 | 时区 |
---|---|---|
NST |
纽芬兰标准时间 | UTC-3:30 |
NDT |
纽芬兰夏时制 | UTC-2:30 |
AST |
大西洋标准时间 | UTC-4 |
ADT |
大西洋夏时制 | UTC-3 |
EST |
东部标准时间 | UTC-5 |
EDT |
东部夏时制 | UTC-4 |
ET |
东部时间,如EST 或EDT |
* |
CST |
中部标准时间 | UTC-6 |
CDT |
中部夏时制 | UTC-5 |
CT |
中部时间,如CST 或CDT |
* |
MST |
山地标准时间 | UTC-7 |
MDT |
山地夏时制 | UTC-6 |
MT |
山地时间,如MST 或MDT |
* |
PST |
太平洋标准时间 | UTC-8 |
PDT |
太平洋夏时制 | UTC-7 |
PT |
太平洋时间,如PST 或PDT |
* |
AKST |
阿拉斯加标准时间 | UTC-9 |
AKDT |
阿拉斯加夏时制 | UTC-8 |
HST |
夏威夷标准时间 | UTC-10 |
如果value
属性为null
或者empty
,则使用GMT
时区。
实例
设置请求对象中设置属性
1 | <%@page import="java.util.Date"%> |
使用timeZone标签设置时区
1 | <fmt:timeZone value="GMT+1:00"> |
运行结果:
1 | 2019年4月6日 星期六 上午07时48分22秒 GMT+01:00 |
小结
在timeZone
标签的标签体
中使用formatDate
标签,可以得到该时区对应的格式化时间。
完整代码
timeZoneTest.jsp
:
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" |
5.6.2 formatDate标签
5.6.2 formatDate标签
引用格式化标签库
首先要在JSP页面中使用taglib
指令引入格式化标签库,如下所示:
1 | <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> |
formatDate标签语法格式
formatDate
标签用于格式化日期,其语法如下:
1 | <fmt:formatDate value="date" |
formatDate标签的属性
属性 | 类型 | 描述 |
---|---|---|
value+ |
java.util.Date |
要格式化的日期或时间 |
type+ |
字符串 | 说明要格式化的是时间、日期,还是时间与日期元件 |
dataStyle+ |
字符串 | 预定义日期的格式化样式,遵循java.text.DateFormat 中定义的语义 |
timeStyle+ |
字符串 | 预定义时间的格式化样式,遵循java.text.DateFormat 中定义的语义 |
pattern+ |
字符串 | 定制格式化样式 |
timezone+ |
字符串或java.util.TimeZone |
定义用于显示时间的时区 |
var |
字符串 | 将输出结果存为字符串的有界变量名称 |
scope |
字符串 | var 的范围 |
timeZone 属性的可能值,请查看5.6.3节。 |
实例
设置日期属性
下面创建一个Date对象.
1 | <%@page import="java.util.Date"%> |
格式化日期
下列代码利用formatDate
标签格式化有界变量now
引用的java.util.Date
对象:
1 | <h2>格式化日期</h2> |
运行结果:
格式化时间
下面的formatDate
标签用于格式化时间:
1 | <h2>格式化时间</h2> |
运行结果:
格式化时间和日期
下面的formatDate
标签用于格式化日期和时间:
1 | <h2>格式化时间和日期</h2> |
显示效果:
格式化带时区的时间
下面的formatDate
标签用于格式化带时区的时间:
1 | <h2>格式化带时区的时间</h2> |
运行效果:
使用自定义格式来格式化时间和日期
下面的formatDate
标签利用定制模式格式化日期和时间:
1 | <h2>使用自定义格式格式化时间和日期</h2> |
显示效果:
5.6 格式化行为 5.6.1 formatNumber标签
5.6 格式化行为
JSTL
提供了格式化和解析数字与日期的标签,它们是formatNumber
、formatDate
、timeZone
、setTimeZone
、parseNumber
和parseDate
。
引用格式化标签库
要使用这些标签,首先要在JSP页面中使用taglib
指令引入格式化标签库,如下所示:
1 | <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> |
如果忘了导入库,则eclipse中会显示如下错误信息:
1 | Unknown tag (fmt:formatNumber). |
5.6.1 formatNumber标签
formatNumber
用于格式化数字。这个标签使你可以根据需要,利用它的各种属性来获得自己想要的格式。formatNumber
的语法有两种形式。
第一种形式没有body content
:
1 | <fmt:formatNumber value="numericValue" |
第二种形式有body content
:
1 | <fmt:formatNumber [type="{number|currency|percent}"] |
body content
是JSP
代码
formatNumber标签的属性
属性 | 类型 | 描述 |
---|---|---|
value+ |
字符串或数字 | 要格式化的数字化值 |
type+ |
字符串 | 说明该值是要被格式化成数字 、货币 ,还是百分比 。对应的属性值分别为number 、currency 、percent |
pattern+ |
字符串 | 定制格式化样式 |
currencyCode+ |
字符串 | ISO 4217 货币码,仅当type="currency" 时使用 |
currencySymbol+ |
字符串 | 货币符号,仅当type="currency" 时使用 |
groupingUsed+ |
布尔 | 说明输出结果中是否包含组分隔符 |
maxIntegerDigits+ |
整数 | 规定输出结果的整数部分最多几位数字 |
minIntegerDigits+ |
整数 | 规定输出结果的整数部分最少几位数字 |
maxFractionDigits+ |
整数 | 规定输出结果的小数部分最多几位数字 |
minFractionDigits+ |
整数 | 规定输出结果的小数部分最少几位数字 |
var |
字符串 | 将输出结果存为字符串的有界变量名称 |
scope |
字符串 | var 的范围。如果有scope 属性,则必须指定var 属性 |
formatNumber
标签的用途之一就是将数字格式化成货币。为此,可以利用currencyCode
属性来定义一个ISO 4217
货币代码。
格式化样式pattern说明
符号 | 描述 |
---|---|
0 |
代表一位数字 |
E |
使用指数格式 |
# |
代表一位数字,若没有则显示0 ,前导0 和末尾0 不显示。 |
. |
小数点 |
, |
数字分组分隔符 |
; |
分隔格式 |
- |
使用默认负数前缀 |
% |
百分数 |
? |
千分数 |
xxxxxxx |
货币符号,使用实际的货币符号代替,如使用$ ,¥ 等等 |
X |
指定可以作为前缀或后缀的字符 |
' |
在前缀或后缀中引用特殊字符 |
formatNumber的用法范例
1 | <!-- 引入格式化标签库 --> |
结果如下:
1 | 12 |
5.5.2 forTokens标签
5.5.2 forTokens标签
forTokens
标签用于遍历以特定分隔符隔开的令牌,其语法如下:
1 | <c:forTokens items="stringOfTokens" delims="delimiters" |
标签体body content
中的代码是JSP
代码。
forTokens标签的属性
属性 | 类型 | 描述 |
---|---|---|
var |
字符串 | 引用遍历的当前项目的有界变量名称 |
items+ |
支持的任意类型 | 要遍历的token 字符串 |
varStatus |
字符串 | 保存遍历状态的有界变量名称。类型值为javax.servlet.jsp.jstl.core.LoopTagStatus. |
begin+ |
整数 | 遍历的起始索引,默认为0。如有指定,begin 的值必须大于或者等于0 |
end+ |
整数 | 遍历的终止索引,默认为0 |
step+ |
整数 | 遍历将只处理间隔指定step 的token ,从第一个token 开始。如有指定,step 的值必须大于或者等于1 |
delims+ |
字符串 | 一组分隔符 |
demo
下面是一个forTokens
范例:
1 | <!-- 要遍历的字符串为:`Argentina,Brazil,Chile`,分割符为`,` --> |
代码详解:
上述标签中,要遍历的字符串为:Argentina,Brazil,Chile
,分割符为,
:
运行结果:
1 | Argentina |
5.5 遍历行为
5.5 遍历行为
当需要无数次地遍历一个对象集合时,遍历行为就很有帮助。JSTL
提供了forEach
和forTokens
两个执行遍历行为的标签:这两个标签将在接下来的小节中讨论。
5.5.1 forEach标签
forEach
标签会无数次地反复遍历body content
或者对象集合。可以被遍历的对象包括java.util.Collection
和java.util.Map
的所有实现类,以及对象数组或者主类型。也可以遍历java.util.Iterator
和java.util.Enumeration
,但不应该在多个行为中使用Iterator
或者Enumeration
,因为无法重置Iterator
或者Enumeration
。
形式1 重复执行标签体
forEach
标签的语法有两种形式。第一种形式是固定次数地重复body content
:
1 | <c:forEach [var="varName"] begin="begin" |
形式2 遍历集合
第二种形式用于遍历对象集合:
1 | <c:forEach items="collection" [var="varName"] |
forEach
标签的标签体body content
之中的代码时JSP
代码.
forEach标签的属性
属性 | 类型 | 描述 |
---|---|---|
var |
字符串 | 引用遍历的当前项目的有界变量名称 |
items+ |
支持的任意类型 | 遍历的对象集合 |
varStatus |
字符串 | 保存遍历状态的有界变量名称。类型值为javax.servlet.jsp.jstl.core.LoopTagStatus |
begin+ |
整数 | 如果指定items ,遍历将从指定索引处的项目开始,例如,集合中第一个项目的索引为0。如果没有指定items ,遍历将从设定的索引值开始。如果指定,begin 的值必须大于或者等于0 |
end+ |
整数 | 如果指定items ,遍历将在(含)指定索引处的项目结束。如果没有指定items ,遍历将在索引到达指定值时结束 |
step+ |
整数 | 遍历将只处理间隔指定step 的项目,从第一个项目开始。在这种情况下,step 的值必须大于或者等于1 |
对于每一次遍历,forEach 标签都将创建一个有界变量,变量名称通过var 属性定义。这个有界变量只存在于开始和关闭的forEach 标签之间,一到关闭的forEach 标签前,它就会被删除。 |
实例
begin end属性
例如,下列的forEach
标签将显示“1 2 3 4 5
”。
1 | <c:forEach var="x" begin="1" end="5"> |
step属性
1 | <c:forEach var="x" begin="1" end="10" step="2"> |
运行结果:1 3 5 7 9
遍历有界变量
下面的forEach
标签将遍历有界变量address
的phones
属性:
1 | <c:forEach var="phone" items="${address.phones}"> |
在本例中,有界变量命名为phone
。forEach
标签中的EL
表达式用于显示phone
的值。
获取遍历的次数
forEach
标签有一个类型为javax.servlet.jsp.jstl.core.LoopTagStatus
的变量varStatus
。LoopTagStatus
接口带有count
属性,它当前遍历的“次数”。第一次遍历时,status.count
值1;第二次遍历时,status.count
值为2,依次类推。测试status.count%2
的余数,可以知道该标签当前遍历到的是偶数编号的元素,还是奇数编号的元素。
forEach标签遍历ArrayList
以app05a
应用程序中的BookController
类和BookList.jsp
页面为例。BookController
类调用了一个service
方法,返回一个Book
对象List
。
Book类
1 | package app05a.model; |
BooksServlet
1 | package app05a.servlet; |
BooksServlet
的doGet
方法中创建了几本书,保存在书籍列表中,然后把书籍列表设置为请求对象的属性.最后再调用book.jsp
进行显示.books.jsp
:
1 | <%@page contentType="text/html; charset=utf-8" |
其中下面的代码
1 | <table> |
使用了forEach
标签来遍历保存在请求对象中的books
属性(ArrayList
),显示效果如下图所示:
测试forEach的状态对象
varStatus="status"
将创建一个名为status
的状态数据对象,使用状态数据对象可以获取本次遍历的一些信息.如status.count
表示当前遍历的次数.
测试状态对象的JSP
代码如下所示:
1 | <table> |
显示效果:
最后一个元素
status.last
表示最后的最后一个元素,测试代码如下所示:
1 | <br /> ISBNs only: |
forEach标签遍历Map
利用forEach
还可以遍历Map
。要分别利用key
和value
属性引用一个Map key
和一个Map
值。遍历Map
的伪代码如下:
1 | <c:forEach var="mapItem" items="map"> |
下一个范例展示了forEach
与Map
的结合使用。CityController
类将两个Map
实例化,并为它们赋予键/值对
。第一个Map
中的每一个元素都是一个String/String
对,第二个Map
中的每一个元素则都是一个String/String[]
对。
BigCitiesServlet
1 | package app05a.servlet; |
bigCities.jsp
1 | <%@page contentType="text/html; charset=UTF-8" |
遍历String/String 类型的Map
设置capitals属性
Servlet
中设的的capitals
请求对象的属性如下所示:
1 | //创建一个Map |
然后在JSP
页面中通过forEach
标签遍历该请求对象中的属性。
1 | Capitals |
显示效果:
遍历String/String[]类型的Map
设置请求对象的bigCities
属性
1 | //创建一个Map |
遍历请求对象的bigCities
属性
1 | <br /> Big Cities |
显示效果如下:
5.4.2 choose、when和otherwise标签
5.4.2 choose、when和otherwise标签
choose
和when
标签的作用与Java
中的关键字switch
和case
类似。choose
标签中必须嵌有一个或者多个when
标签,并且每个when
标签都表示一种可以计算和处理的情况。otherwise
标签则用于默认的条件块,假如没有任何一个when
标签的测试条件结果为true
,它就会得到处理。假如是这种情况,otherwise
就必须放在最后一个when
后。choose
和otherwise
标签没有属性。when
标签必须带有定义测试条件的test
属性,用来决定是否应该处理body content
。
实例
举个例子,以下代码是测试参数status
的值。如果status
的值为full
,将显示You are a full member
。如果这个值为student
,则显示You are a student member
。如果status
参数不存在,或者它的值既不是full
,也不是student
,那么这段代码将不显示任何内容:
1 | <c:choose> |
下面的例子与前面的例子相似,使用了otherwise
标签,如果status
参数不存在,或者它的值不是full
或者student
,则将显示Please register
:
1 | <c:choose> |
总结
choose
类似switch
when
类似case
otherwise
类似default
5.4 条件行为 5.4.1 if标签
5.4 条件行为
条件行为用于处理页面输出取决于特定输入值的情况,这在Java
中是利用if
、if...else
和switch
声明解决的。JSTL
中执行条件行为的有4个标签,即if
、choose
、when
和otherwise
标签。
5.4.1 if标签
if
标签是对某一个条件进行测试,假如结果为true
,就处理它的body content
。测试结果保存在一个Boolean
对象中,并创建有界变量来引用这个Boolean
对象。利用var
属性和scope
属性来定义有界变量的名称和范围。
if标签的属性
属性 | 类型 | 描述 |
---|---|---|
test+ |
布尔 | 决定是否处理任何现有body content 的测试条件 |
var |
字符串 | 引用测试条件值的有界变量名称;var 的类型为Boolean |
scope |
字符串 | var 定义的有界变量的范围 |
if标签 带标签体形式
第二种形式中使用了一个body content
:
1 | <c:if test="testCondition [var="varName"] |
body content
中是JSP
代码,当测试条件的结果为true
时,就会执行标签体例的JSP
代码。
实例
例如,如果找到请求参数user
且值为ken
,并且找到请求参数password
且值为blackcomb
,以下if
标签将显示“You logged in successfully
:
1 | <!-- param为EL隐式对象 --> |
模拟else语句
为了模拟else
,下面使用了两个if
标签,并使用了相反的条件。例如,如果user
和password
参数的值为ken
和blackcomb
,以下代码片断将显示You logged in successfully
,否则,将显示Login failed
:
1 | <c:if test="${param.user=='ken' && |
if标签 没有标签体形式
1 | <c:if test="testCondition" var="varName" |
在这种情况下,var
定义的有界对象一般是通过其他标签在同一个JSP
中的后续阶段再进行测试。
实例
下面的if
标签是测试user
和password
参数值是否分别为ken
和blackcomb
,并将结果保存在页面范围的变量loggedIn
中。之后,利用一个EL
表达式,如果loggedIn
变量值为true
,则显示You logged in successfully
;如果loggedIn
变量值为false
,则显示Login failed
:
1 | <c:if var="loggedIn" |
5.3.3 remove标签
5.3.3 remove标签
remove标签的作用 语法
remove
标签用于删除有界变量,其语法如下:
1 | <c:remove var="varName" |
scope
属性默认为page
。
注意,有界变量所引用的对象不能删除。因此,如果另一个有界对象也引用了同一个对象,仍然可以通过另一个有界变量访问该对象。
remove标签的属性
属性 | 类型 | 描述 |
---|---|---|
var |
字符串 | 要删除的有界变量的名称 |
scope |
字符串 | 要删除的有界变量的范围 |
实例
举个例子,下面的remove
标签就是删除了页面范围的变量job
:
1 | <c:remove var="job" scope="page"/> |
5.3.2 set标签
5.3.2 set标签
set标签的功能
利用set
标签,可以完成以下工作:
- 创建一个字符串和一个引用该字符串的有界变量。
- 创建一个引用已存在的有界对象的有界变量。
- 设置有界对象的属性。
如果用set
创建有界变量,那么,在该标签出现后的整个JSP
页面中都可以使用该变量。
set标签的形式
set
标签的语法有4种形式。
形式1
第一种形式用于创建一个有界变量,并用value
属性在其中定义一个要创建的字符串或者有界对象:
1 | <c:set value="value" var="varName" |
这里的scope
属性指定了有界变量的范围。默认为page
。
例如,下面的set
标签创建了字符串“Hello World
”,并将它赋给新创建的页面范围变量hello
:
1 | <c:set value="Hello World" var="hello"/> |
下面的set
标签则创建了一个名为job
的有界变量,它引用请求范围中position
所引用的对象。变量job
的范围为page
:
1 | <c:set var="job" value="${requestScope.position}" scope="page"/> |
有界对象本身并非保存在HttpServletRequest
之中,requestScope.position
只是该对象的引用,上面的set
标签,将在页面范围创建一个名为job
的有界变量,该有界变量是requestScope.position
的一个副本,这两者都引用同一个对象.
形式2
第二种形式与第一种形式相似,只是把创建的字符串或者要引用的有界对象放在标签体(body content
)中而已.
1 | <c:set var="varName" [scope="{page|request|session|application}"]> |
第二种形式允许在标签体body content
中有JSP
代码。
形式3
第三种形式用于设置有界对象的属性值。使用target
属性定义有界对象,property
属性指定要设置的属性名称。通过value
属性设置有界对象的属性值:
1 | <c:set target="target" property="propertyName" value="value"/> |
例如,下面的set
标签把有界对象address
的city
属性赋值为Tokyo
这个字符串:
1 | <c:set target="${address}" property="city" value="Tokyo"/> |
注意,必须在target
属性中用一个EL
表达式来引用这个有界对象。
形式4
第四种形式与第三种形式相似,只是赋值是通过标签体body content
来完成的:
1 | <c:set target="target" property="propertyName"> |
例如,下面的set
标签是将字符串“Beijing
”赋予有界对象address
的city
属性:
1 | <c:set target="${address}" property="city">Beijing</c:set> |
set标签的属性说明
属性 | 类型 | 描述 |
---|---|---|
value+ |
对象 | 要创建的字符串,或者要引用的有界对象,或者新的属性值 |
var |
字符串 | 要创建的有界变量 |
scope |
字符串 | 新创建的有界变量的范围 |
target+ |
对象 | 其属性要被赋新值的有界对象;这必须是一个JavaBeans 实例或者java.util.Map 对象 |
property+ |
字符串 | 要被赋新值的属性名称 |
表中的加号表示该属性的属性值可以动态生成.