1.3 I18N格式标签库
JSTL标签提供了对国际化(I18N)的支持,它可以根据发出请求的客户端地域的不同来显示不同的语言。同时还提供了格式化数据和日期的方法。实现这些功能需要I18N格式标签库(I18N-capable formation tags liberary)。引入该标签库的方法为:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
I18N格式标签库提供了11个标签,这些标签从功能上可以划分为3类如下:
(1)数字日期格式化。formatNumber标签、formatData标签、parseNumber标签、parseDate标签、timeZone标签、setTimeZone标签。
(2)读取消息资源。bundle标签、message标签、setBundle标签。
(3)国际化。setlocale标签、requestEncoding标签。
接下将详细介绍这些标签的功能和使用方式。
1.3.1 数字日期格式化
数字日期格式化标签共有6个,分别为formatNumber标签、formatData标签、parseNumber标签、parseDate标签、timeZone标签、setTimeZone标签。用来将数字或日期转换成设定的格式。
1.<frm:formatNumber/>标签
该标签依据特定的区域将数字改变为不同的格式来显示。
【语法1】:
<frm:formatNumber value=”被格式化的数据”[type=”number|currency|percent”]
[pattern=”pattern”]
[currencyCode=”code”]
[currencySymbol=”symbol”]
[groupingUsed=”true|false”]
[maxIntergerDigits=”maxDigits”]
[minIntergerDigits=”minDigits”]
[maxFractionDigits=”maxDigits”]
[minFractionDigits=”minDigits”]
[var=”name”]
[scope=page|request|session|application]
/>
【语法2】:
<frm:formatNumber [type=”number|currency|percent”]
[pattern=”pattern”]
[currencyCode=”code”]
[currencySymbol=”symbol”]
[groupingUsed=”true|false”]
[maxIntergerDigits=”maxDigits”]
[minIntergerDigits=”minDigits”]
[maxFractionDigits=”maxDigits”]
[minFractionDigits=”minDigits”]
[var=”name”]
[scope=page|request|session|application]
>被格式化的数据</frm:formatNumber>
属性说明如下表:<fmt:formatNumber>标签参数说明
名称 |
说明 |
EL |
类型 |
必须 |
默认值 |
value |
要格式化的数据 |
是 |
String |
是 |
无 |
type |
指定类型(单位、货币、百分比等)见表 |
是 |
String |
否 |
number |
pattern |
格式化的数据样式 |
是 |
String |
否 |
无 |
currencyCode |
货币单位代码 |
是 |
String |
否 |
无 |
cuttencySymbol |
货币符号($、¥) |
是 |
String |
否 |
无 |
groupingUsed |
是否对整数部分进行分组如(9,999) |
是 |
boolean |
是 |
true |
maxIntergerDigits |
整数部分最对显示多少位数 |
是 |
int |
否 |
无 |
minIntergerDigits |
整数部分最少显示多少位 |
是 |
int |
否 |
无 |
maxFractionDigits |
小数部分最多显示多少位 |
是 |
int |
否 |
无 |
minFractionDigits |
小数部分最少显示多少位 |
是 |
int |
否 |
无 |
var |
存储格式化后的数据 |
否 |
String |
否 |
无 |
scope |
var的JSP范围 |
否 |
String |
否 |
page |
Type属性的类型应用见下表:
类型 |
说明 |
示例 |
number |
数字格式 |
0.8 |
currency |
当地货币 |
¥0.80 |
percent |
百分比格式 |
80% |
【示例代码】:实现对数字的格式化、货币的格式、货币的格式化。使用<frm:formatNumber>的各种属性的设定。
<td>数字格式化</td><td>108.75</td>
<td><fmt:formatNumber type="number" pattern="###.#">108.75</fmt:formatNumber></td>
<td>使用pattern可以定义显示的样式。本例设定为###.#小数部分将使用四舍五入法。</td>
<td>数字格式化</td><td>9557</td>
<td><fmt:formatNumber type="number" pattern="#.####E0">9557</fmt:formatNumber></td>
<td>使用科学计数法。</td>
<td>数字格式化</td><td>9557</td>
<td><fmt:formatNumber type="number" >9557</fmt:formatNumber></td>
<td>使用默认分组。</td><td>数字格式化</td><td>9557</td>
<td><fmt:formatNumber type="number" groupingUsed="false" >9557</fmt:formatNumber></td>
<td>不使用分组。</td>
<td>数字格式化</td><td>9557</td>
<td><fmt:formatNumber type="number" maxIntegerDigits="3">9557</fmt:formatNumber></td>
<td>使用位数限定,根据指定的位数显示,其他数字忽略。例如:9不被显示。</td>
<td>百分比格式化</td><td>0.98</td>
<td><fmt:formatNumber type="percent">0.98</fmt:formatNumber></td>
<td>用百分比形式显示一个数据。</td>
<td>货币格式化</td><td>188.88</td>
<td><fmt:formatNumber type="currency" >188.8</fmt:formatNumber></td>
<td>将一个数据转化为货币形式输出。</td>
<td>存储数据</td><td>188.88</td>
<td><fmt:formatNumber type="currency" var="money">188.8</fmt:formatNumber>
<c:out value="${money}"></c:out>
</td>
<td>存储的money的值为${money} </td>
2.<frm:parseNumber>标签
将格式化后的数字、货币、百分比都转化为数字类型。
【语法1】:<fmt:parseNumber value="number" [type=”number|currency|percent”]
[pattern=”pattern”]
[parseLocale=”locale”]
[intergerOnly=”true|false”]
[scope=”page|request|session|application”]
/>
【语法2】:<fmt:parseNumber [type=”number|currency|percent”]
[pattern=”pattern”]
[parseLocale=”locale”]
[intergerOnly=”true|false”]
[scope=”page|request|session|application”]
>Number</fmt:parseNumber>
属性说明见下表:<fmt:parseNumber>标签参数说明
名称 |
说明 |
EL |
类型 |
是否必须 |
默认值 |
value |
被解析的字符串 |
是 |
String |
是 |
无 |
type |
指定单位(数字、货币、百分比) |
是 |
String |
是 |
number |
pattern |
格式样式 |
是 |
String |
否 |
无 |
parseLocale |
用来替代默认区域的设定 |
是 |
String, Java.util. Locale |
是 |
默认本地样式 |
var |
存储已经格式化的数据 |
否 |
String |
否 |
无 |
scope |
var变量的作用域 |
否 |
String |
是 |
page |
<fmt:parseNumber>可以看作是<fmt:formatNumber>的逆运算。相应的参数和类型的配置和使用<fmt:formatNumber>格式化时相同。
【示例代码】:实现从字符串中提取数据,并用合适的数据类型进行存储(浮点性、整型等)。可以对转换后的数据进行加法运算。
<fmt:formatNumber type="currency" var="money">188.8</fmt:formatNumber>
<li>格式化前的数据为:<c:out value="${money}"></c:out>
<fmt:parseNumber var="money" type="currency">${money}</fmt:parseNumber>
<li>格式化后的数据为:<c:out value="${money}"></c:out>
<li>可以对格式化的后的数据进行运算:
<c:out value="${money+200}"></c:out>
<li>对百分比进行格式化98%为:
<fmt:parseNumber type="percent">98%</fmt:parseNumber>
【代码解析】:
(1)首先使用<fmt:formatNumber>将188.8转换为字符串¥188.8并在page范围内存储一个String类型的变量,变量名为money。
(2)使用<fmt:parseNumber>将¥188.8转化为浮点型的数据188.8并赋值为变量money,
则变量money转变为一个浮点型的值188.8,对188.8进行加运算。
(3)直接对一个百分比数98%进行转化。
提示:<fmt:parseNumber>属性参数的配置和使用同<fmt:formatNumber>标签使用的方式一样。同时,在进行类型转换时如果给出的类型不正确将会出现异常。例如在进行百分比转化时如果没有给type类型或者给出type类型但提供的数据中没有%都会产生异常。因此在实际应用中用<c:catch/>捕获异常。
3.<fmt:formatDate>标签
该标签主要用来格式化日期和时间。
【语法】:<fmt: formatDate value=”date” [type=”time|date|both”]
[pattern=”pattern”]
[dateStyle=”default|short|medium|long|full”]
[timeStyle=”default|short|medium|long|full”]
[timeZone=”timeZone”]
[var=”name”]
[scope=”page|request|session|application”]
/>
参数说明见下表:<fmt:formatDate>标签属性说明
属性名 |
说明 |
EL |
类型 |
必须 |
默认值 |
value |
将要格式化的日期对象。 |
是 |
Java.util.Date |
是 |
无 |
type |
显示的部分(日期、时间或者两者)。 |
是 |
String |
否 |
date |
partten |
格式化的样式。 |
是 |
String |
否 |
无 |
dateStyle |
设定日期的显示方式。 |
是 |
String |
否 |
default |
timeStyle |
设定时间的显示方式。 |
是 |
String |
否 |
default |
timeZone |
设定使用的时区。 |
是 |
String |
否 |
当地所用时区 |
var |
存储已格式化的日期或时间。 |
否 |
String |
否 |
无 |
scope |
指定var存储的JSP范围。 |
否 |
String |
否 |
无 |
其中type属性参数说明见下表:
参数名 |
说明 |
time |
只显示时间 |
date |
只显示时期 |
both |
显示日期和时间 |
【示例程序】:实现对日期的格式化,使用了type、dateStyle、timeStyle等属性。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<jsp:useBean id="date" class="java.util.Date"></jsp:useBean>
<fmt:formatDate value="${date}"></fmt:formatDate><br>
<fmt:formatDate value="${date}" type="both"></fmt:formatDate><br>
<fmt:formatDate value="${date}" type="both" dateStyle="default"
timeStyle="default"></fmt:formatDate><br>
<fmt:formatDate value="${date}" type="both" dateStyle="short"
timeStyle="short"></fmt:formatDate><br>
<fmt:formatDate value="${date}" type="both" dateStyle="long"
timeStyle="long"></fmt:formatDate><br>
<fmt:formatDate value="${date}" type="both" dateStyle="full"
timeStyle="full"></fmt:formatDate><br>
<fmt:formatDate value="${date}" type="both" dateStyle="full"
timeStyle="full"></fmt:formatDate><br>
【代码解析】:
(1)首先通过配置JavaBean在页面上实例化java.util.Date对象。实现代码如下:
<jsp:useBean id="date" class="java.util.Date"></jsp:useBean>
(2)对日期对象进行格式化时${date}是一个日期对象,如果给value设的值为String时程序会报错。
(3)设置type为both时,将显示日期和时间,同时示例中依次改变dateStyle和timeStyle的值作为比较。
4.<fmt:parseDate>标签
<fmt:parseDate>标签主要将字符串类型的时间或日期转化为时间或日期对象。
【语法1】:<fmt:parseDate value=”date” [type=”time|date|both”]
[pattern=”pattern”]
[parseLocale=”locale”]
[dateStyle=”default|short|medium|long|full”]
[timeStyle=”default|short|medium|long|full”]
[timeZone=”timezone”]
[var=”name”]
[scope=”page|request|session|application”]
/>
【语法2】:<fmt:parseDate [type=”time|date|both”]
[pattern=”pattern”]
[parseLocale=”locale”]
[dateStyle=”default|short|medium|long|full”]
[timeStyle=”default|short|medium|long|full”]
[timeZone=”timezone”]
[var=”name”]
[scope=”page|request|session|application”]
>Date</fmt:parseDate>
【参数说明】参数说明见表9-9.
表9-9 <fmt:parseData>标签属性说明
属性名 |
说明 |
EL |
类型 |
必须 |
默认值 |
value |
将要格式化的日期时间 |
是 |
String |
是 |
无 |
type |
字符串的类型(日期、时间或全部) |
EL |
String |
是 |
date |
pattern |
字符串使用的时间样式 |
是 |
String |
是 |
无 |
parseLocale |
取代默认地区设定 |
是 |
String |
是 |
默认地区 |
dateStyle |
字符串使用的日期显示方式 |
是 |
String |
否 |
default |
timeStyle |
字符串使用的时间显示格式 |
是 |
String |
否 |
default |
timeZone |
使用的时区 |
是 |
String |
否 |
当地区时 |
var |
使用var定义的名字保存对象 |
否 |
String |
否 |
无 |
scope |
var的JSP范围 |
否 |
String |
否 |
page |
【示例代码】:实现以下功能:首先,使用了<fmt:formatDate>把一个日期对象格式化成一个日期的字符串,并把该字符串以参数名为a存储page范围内。其次,使用<fmt:parseDate>方法把a的值(字符串)格式化成一个Date并以参数名为b存储在page范围内。最后,使用Java脚本证明生成的b为对象。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<jsp:useBean id="date" class="java.util.Date"></jsp:useBean>
<fmt:formatDate value="${date}" var="a" type="both"
dateStyle="full" timeStyle="full"></fmt:formatDate>
<fmt:parseDate var="b" type="both" dateStyle="full" timeStyle="full">
${a}
</fmt:parseDate>
<%
out.println(pageContext.getAttribute("b").toString());
out.println("<br>");
out.println(pageContext.getAttribute("b").hashCode());
%>
【代码解析】:
(1)使用<fmt:formatDate>把日期对象格式化成字符串。
(2)使用<fmt:parseDate>把字符串对象转化为日期对象,注意同(1)中的参数对比,可以发现两者是一个互逆的过程。
(3)使用Java脚本进行测试Date对象的toString()方法可以输出时间字符串。hashCode()可以得到一个对象的hashCode。该方法只能应用于对象,因此可以证明得到的是一个日期对象。
提示:<fmt:formatDate>和<fmt:parseDate>是相反的运算过程,可以对照学习。本例中的Java脚本的作用是为了证明生成的的确是一个对象。
5.<fmt:setTimeZone>标签
该标签用于设定默认时区或者将时区存储在指定的JSP范围内。
【语法】:<fmt:setTimeZone value=”value” [var=”name”][scope=”page|request|session|application”]/>
【参数说明】: <fmt:setTimeZone>标签属性说明
参数名 |
说明 |
EL |
类型 |
必须 |
默认值 |
value |
使用的时区 |
是 |
String Java.util.TimeZone |
是 |
无 |
var |
使用var定义的参数名保存值 |
否 |
String |
否 |
无 |
scope |
存储var的JSP范围 |
否 |
String |
否 |
page |
value用来设定使用的时区,例如中国使用的时区为CST,其他的还有EST、PST等。可以把时区存储在指定的JSP范围内,例如存储在session中,用户访问的所有页面都可以显示使用的设定的时区下对应的时间。
【示例代码】
<fmt:setTimeZone value=”EST” scope=”session”/>
提示:有关TimeZone的说明见JDK帮助文档的java.util.TimeZone类。
6.<fmt:timeZone>标签
该标签主要用于设置标签体内使用的时区。
【语法】:<fmt:timeZone value=”timeZone”>…..</fmt:timeZone>
使用<fmt:timeZone></fmt:timeZone>只会应用到标签体内使用的时区,对标签外部将不产生影响。
1.3.2 读取消息资源
读取消息资源用到的标签主要有4个:<fmt:message>标签、<fmt:param>标签、<fmt:bundle>标签和<fmt:setBundle>标签。主要用于从资源文件中读取信息。
1.<fmt:bundle>标签
该标签主要用于将资源文件绑定于它的标签体中的显示。
【语法】:<fmt:bundle basename=”name”[prefix=”prefix”]>….标签主题</fmt:bundle>
【参数说明】: <fmt:bundle>标签属性说明
参数名 |
说明 |
EL |
类型 |
必须 |
默认值 |
basename |
指定使用的资源文件的名称 |
是 |
String |
是 |
无 |
prefix |
前置关键字 |
是 |
String |
否 |
无 |
2.<fmt:setBundle>标签
该标签主要用于绑定资源文件或者把资源文件保存在指定的JSP范围内。
【语法】:
<fmt:setBundle basename=”name” [var=”name”][scope=”page|request|session|application”]/>
【参数说明】:<fmt:setBundle>标签属性说明
参数名 |
说明 |
EL |
类型 |
必须 |
默认值 |
basename |
指定使用的资源文件的名称 |
是 |
String |
是 |
无 |
var |
指定将资源文件保存的名称 |
否 |
String |
否 |
无 |
scope |
设定将资源文件保存的JSP范围 |
否 |
String |
否 |
page |
3.<fmt:message>标签
该标签主要负责读取本地资源文件,从指定的消息文本资源文件中读取键值,并且可以将键值保存在指定的JSP范围内。
【语法1】:<fmt:message key=”keyName”[bundle=”bundle”][scope=”page|request|session|application”]/>
【语法2】:<fmt:message key=”keyName”[bundle=”bundle”][scope=”page|request|session|application”]><fmt:param/></fmt:message>
【语法3】:<fmt:message key=”keyName”[bundle=”bundle”][scope=”page|request|session|application”]>key<fmt:param/>…</fmt:message>
【参数说明】:<fmt:message>标签属性说明
参数名 |
说明 |
EL |
类型 |
必须 |
默认值 |
key |
指定键值的名称(索引) |
是 |
String |
是 |
无 |
bundle |
指定消息文本的来源 |
是 |
LocalizationContext |
否 |
无 |
var |
指定存储键值的变量名 |
否 |
String |
否 |
无 |
scope |
指定var的作用域 |
否 |
String |
否 |
page |
提示:建议此处的bundle使用EL表达式,因为属性bundle的类型为LocalizationContext,而不是一个String类型的URL。
【示例代码】:实现从指定的资源文件中读取对应key的值。
首先编写一个资源文件内容下
name=olive
password=01234
使用标签从资源文件中读取相应的值。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<jsp:useBean id="date" class="java.util.Date"></jsp:useBean>
<fmt:bundle basename="message">
<c:out value="从message资源文件中得到的key为name的值为:"></c:out>
<fmt:message key="name" ></fmt:message>
</fmt:bundle>
<hr>
<fmt:setBundle basename="message" var="m"/>
<fmt:message key="password" bundle="${m}"></fmt:message>${m}
【代码解析】:
(1)使用<fmt:bundle>标签指定从message.properties文件中读取值。
(2)使用<fmt:message>标签读取资源文件中key为name的值。<fmt:message>标签放在<fmt:bundle>标签体内使用。
(3)使用<fmt:setBundle>标签在page范围绑定一个配置文件,以m为参数名存储。
(4)使用<fmt:message>标签得到key为password的值,此处指定资源文件的方式为使用<fmt:message>标签的bundle属性来设定。
(5)输出参数m的值,加深对bundle的理解。
<fmt:bundle>标签中有一个prefix属性,该标签用来指明前缀。例如配置文件内容如下:
org.person.name=olive
org.personpassword=01234
如果不使用prefix标签,在取值是要指明前缀。例如:
<fmt:bundle basename=”message”>
<fmt:message key=”org.person.name”></fmt:message>
<fmt:message key=”org.person.password”></fmt:message>
</fmt:bundle>
使用prefix属性可以简化取值时的代码。
<fmt:bundle basename=”message” prefix=”org.person”>
<fmt:message key=”name”></fmt:message>
<fmt:message key=”password”></fmt:message>
</fmt:bundle>
4.<fmt:param>标签
该标签主要用于当<fmt:message>中资源文件中获得键值时,动态的为资源文件中的变量赋值。
【语法1】:<fmt:param value=”value”/>
【语法2】:<fmt:param >…标签主体</fmt:param>
【示例代码】:
(1)创建资源文件。在message.properties文件中增加一个key和value。
news={0} welcome to out website!<br>today is :{1,date}
表达的含义是键news对应的是一个字符串,字符串中还有动态变量{0}表示第一个动态变量,{1,date}表示第二个动态变量并且该变量是一个日期类型的对象。
(2)通过标签从资源文件中取出键值,并给动态变量赋值显示在页面。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<jsp:useBean id="date" class="java.util.Date"></jsp:useBean>
<fmt:bundle basename="message">
<fmt:message key="news">
<fmt:param value="olive" />
<fmt:param value="${date}"/>
</fmt:message>
</fmt:bundle>
【代码解析】:
(1)使用<fmt:bundle>标签把资源文件绑定在标签体内。
(2)在<fmt:bundle>标签体内使用<fmt:message>得到键值。
(3)使用<fmt:param>为资源文件中的动态变量赋值。
提示:资源文件经过修改后,应用程序需要重载才能生效。