本章目标
理解国际化的主要操作;
可以使用国际化进行文本、日期的格式化操作。

国际化标签库
国际化是程序的重要组成部分,一个程序可以根据所在的区域进行相应信息显示,例如:各个地区的数字、日期显示风格都是不一样的,在JSTL中使用fmt.tld作为格式化标签库的定义文件。

格式化标签库提供的标签

国际化标签库_html


 

<fmt:setLocale>标签 
<fmt:setLocale>标签的主要功能是用来设定用户所在的区域,语法如下:
<fmt:setLocale value="区域编码" [variant="浏览器"] [scope="[page | request | session | application]"]/> 
<fmt:setLocale>标签的属性


国际化标签库_html_02


 

设置Locale显示

<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html" pageEncoding="utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
<head>
<title>设置 Locale 显示</title>
</head>
<body>
<%//设置一个 page 范围的属性
	pageContext.setAttribute("date", new Date());
 %>
 <h3>中文日期显示:
 	<fmt:setLocale value="zh_CN"/>
 	<fmt:formatDate value="${date}"/>
 </h3>
  <h3>英文日期显示:
 	<fmt:setLocale value="en_US"/>
 	<fmt:formatDate value="${date}"/>
 </h3>
</body>
</html>

效果图:

国际化标签库_资源文件_03


  

<fmt:requestEncoding>标签 
<fmt:requestEncoding>标签的主要功能是用于设置所有的请求编码,功能与setCharacterEncoding()一样,语法如下:
<fmt:requestEncoding [value="字符集"]/>


范例:设置统一编码

<fmt:requestEncodingvalue="GBK"/>

 

读取资源文件

在国际化中最重要的组成部分就是资源文件的读取,在JSTL中提供了四个标签用于资源的读取和操作:<fmt:message>、<fmt:param>、<fmt:bundle>、<fmt:setBundle>。
所有的资源文件都是以*.properties为后缀的,所有的内容要按照“key=value”的格式进行编写,在WEB中,资源文件要保存在/WEB-INF/classes文件夹之中。
定义资源文件 —— /WEB-INF/classes/Message.properties
name = chaoyi
# info = 欢迎{0}光临!
info = \u6b22\u8fce{0}\u5149\u4e34\uff01

 

效果图:

国际化标签库_java_04

 

<fmt:bundle>
<fmt:bundle>设置要读取的资源文件名称,语法如下:
<fmt:bundle basename="资源文件名称" [prefix="前置标记"]>
  标签体内容
</fmt:bundle> 
<fmt:message> 
当通过<fmt:bundle>标签指定好了资源文件名称后,就可以使用<fmt:message>标签按照key读取value,语法如下:
<fmt:message key="资源文件的指定key" [bundle="资源文件名称"]  [var="存储内容的属性名称"] [scope="[page | request | session | application]"]/>
<fmt:message key="资源文件的指定key" [bundle="资源文件名称"]  [var="存储内容的属性名称"] [scope="[page | request | session | application]"]>
  <fmt:param value="设置占位符内容"/>
  </fmt:message>

 

读取资源文件

<%@ page language="java" contentType="text/html" pageEncoding="utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
<head>
<title>读取资源文件</title>
</head>
<body>
<fmt:bundle basename="Message">
	<fmt:message key="name" var="nameref"></fmt:message>
</fmt:bundle>
<h3>姓名:${nameref}</h3>
<fmt:bundle basename="Message">
	<fmt:message key="info" var="inforef">
		<fmt:param value="yike"></fmt:param>
	</fmt:message>
</fmt:bundle>
<h3>信息:${inforef}</h3>
</body>
</html>

 效果图:

国际化标签库_java_05


 

<fmt:setBundle> 
在进行资源文件读取的时候也可以通过<fmt:setBundle>标签设置一个默认的读取资源名称,这样每次在使用<fmt:message>进行信息读取的时候,直接通过bundle设置要读取的资源的属性即可,语法如下:
<fmt:setBundle basename="资源文件名称" [var="保存资源文件内容的属性名称"]  [scope="[page | request | session | application]"]/>

 

设置要读取的资源文件

<%@ page language="java" contentType="text/html" pageEncoding="utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
<head>
<title>设置要读取的资源文件</title>
</head>
<body>
<fmt:setBundle basename="Message" var="msg" />
<fmt:message key="name" var="nameref" bundle="${msg}"></fmt:message>
<h3>姓名:${nameref}</h3>
<fmt:message key="info" var="inforef" bundle="${msg}">
	<fmt:param value="yike"></fmt:param>
</fmt:message>
<h3>信息:${inforef}</h3>
</body>
</html>

 效果图:

国际化标签库_java_06


 

数字格式化标签

在JSTL中进行数字格式化的操作可以使用<fmt:formatNumber>和<fmt:parseNumber>两个标签完成。<fmt:formatNumber>标签会根据所设置的区域将一个数字进行格式化,语法如下:
<fmt:formatNumber value="数字" [type="[number | currency | percent]"]  [pattern="格式化格式"] [currencyCode="货币的ISO代码"] [currencySymbol="货币符号"]  [groupingUsed="[true | false]"] [maxIntegerDigits="整数位的最大显示长度"]  [minIntegerDigits="整数位的最小显示长度"]   [maxFractionDigits="小数位的最大显示长度"]  [minFractionDigits="小数位的最小显示长度"] [var="格式化数字的保存属性"]  [scope="[page | request | session | application]"]/>
<fmt:formatNumber [type="[number | currency | percent]"]  [pattern="格式化格式"] [currencyCode="货币的ISO代码"] [currencySymbol="货币符号"]  [groupingUsed="[true | false]"] [maxIntegerDigits="整数位的最大显示长度"]  [minIntegerDigits="整数位的最小显示长度"]   [maxFractionDigits="小数位的最大显示长度"]  [minFractionDigits="小数位的最小显示长度"] [var="格式化数字的保存属性"]  [scope="[page | request | session | application]"]>  要格式化的数字</fmt:formatNumber>

 

<fmt:formatNumber>标签的属性

国际化标签库_资源文件_07


 

格式化数字显示

<%@ page language="java" contentType="text/html" pageEncoding="utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
<head>
<title>格式化数字显示</title>
</head>
<body>
<fmt:formatNumber value="15764865.4484576" maxIntegerDigits="7" maxFractionDigits="3" groupingUsed="true" var="num"></fmt:formatNumber>
<h3>格式化数字:${num}</h3>
<fmt:formatNumber value="15764865.4484576" pattern="##.###E0" var="num"></fmt:formatNumber>
<h3>格式化数字:${num}</h3>
</body>
</html>

 效果图:

国际化标签库_资源文件_08


 

<fmt:formatNumber> 
<fmt:formatNumber>标签的作用是将一个数字进行格式化,而使用<fmt:parseNumber>可以将一个被格式化的数字进行还原,语法如下:
<fmt:parseNumber value="格式化好的数字" [type="[number | currency | percent]"]  [pattern="格式化样式"] [parseLocale="区域编码"] [integerOnly="[true | false]"]  [var="存储结果的属性名称"] [scope="[page | request | session | application]"]/>
<fmt:parseNumber value="格式化好的数字" [type="[number | currency | percent]"]  [pattern="格式化样式"] [parseLocale="区域编码"] [integerOnly="[true | false]"]  [var="存储结果的属性名称"] [scope="[page | request | session | application]"]>
  已格式化好的数字
  </fmt:parseNumber><fmt:parseNumber>标签的属性

国际化标签库_java_09


 

数字的反格式化

<%@ page language="java" contentType="text/html" pageEncoding="utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
<head>
<title>数字的反格式化</title>
</head>
<body>
<fmt:parseNumber value="5,764,865.448" var="num"></fmt:parseNumber>
<h3>反格式化数字:${num}</h3>
<fmt:parseNumber value="15.765E6" pattern="##.###E0" var="num"></fmt:parseNumber>
<h3>反格式化数法:${num}</h3>
<fmt:parseNumber value="3.5%" pattern="00%" var="num"></fmt:parseNumber>
<h3>反百分比:${num}</h3>
</body>
</html>

 效果图:

国际化标签库_java_10


 

日期时间格式化标签 
<fmt:formatDate>标签的主要功能是用于日期时间的格式化显示,语法如下:
<fmt:formatDate value="date" [type="[time | date | both]"] [pattern="格式化样式"]  [dateStyle="[default | short | medium | long | full]"]  [timeStyle="[default | short | medium | long | full]"]  [timeZone="时区"] [var="存储结果的属性名称"]  [scope="[page | request | session | application]"]/> 
<fmt:formatDate>标签的属性


国际化标签库_html_11


 

 

 格式化日期时间

<%@ page language="java" contentType="text/html" pageEncoding="utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
<head>
<title>格式化日期时间</title>
</head>
<body>
<%
	//在 page 属性范围中保存一个日期
	pageContext.setAttribute("dateref", new java.util.Date());
 %>
 <fmt:formatDate value="${dateref}" type="both" dateStyle="default" timeStyle="default" var="date"/>
 <h3>default 显示日期时间:${date}</h3>
  <fmt:formatDate value="${dateref}" type="both" dateStyle="short" timeStyle="short" var="date"/>
 <h3>short 显示日期时间:${date}</h3>
  <fmt:formatDate value="${dateref}" type="both" dateStyle="medium" timeStyle="medium" var="date"/>
 <h3>medium 显示日期时间:${date}</h3>
  <fmt:formatDate value="${dateref}" type="both" dateStyle="long" timeStyle="long" var="date"/>
 <h3>long 显示日期时间:${date}</h3>
  <fmt:formatDate value="${dateref}" type="both" dateStyle="full" timeStyle="full" var="date"/>
 <h3>full 显示日期时间:${date}</h3>
  <fmt:formatDate value="${dateref}" type="both" pattern="yyyy 年 MM 月 dd 日 mm分 ss秒 SSS 毫秒" var="date"/>
 <h3>自定义格式显示日期时间:${date}</h3>
</body>
</html>

 效果图:

国际化标签库_资源文件_12


 

<fmt:parseDate> 
<fmt:formatDate>标签的功能是将一个日期型的对象变为了字符串,而<fmt:parseDate>是将一个字符串的数据变回日期型数据,语法如下:
<fmt:parseDate value="date" [type="[time | date | both]"] [pattern="格式化样式"]  [dateStyle="[default | short | medium | long | full]"]  [timeStyle="[default | short | medium | long | full]"]  [timeZone="时区"] [var="存储结果的属性名称"]  [scope="[page | request | session | application]"]/> 
<fmt:parseDate>标签的属性


国际化标签库_资源文件_13


 

日期的反格式化

<%@ page language="java" contentType="text/html" pageEncoding="utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
<head>
<title>日期的反格式化</title>
</head>
<body>
 <fmt:parseDate value="2014年6月1日 星期日 下午04时41分04秒 CST" type="both" dateStyle="full" timeStyle="full" var="date"></fmt:parseDate>
 <h3>字符串变为日期:${date}</h3>
  <fmt:parseDate value="2014 年 06 月 01 日 41分 04秒 477 毫秒" pattern="yyyy 年 MM 月 dd 日 mm分 ss秒 SSS 毫秒"  var="date"></fmt:parseDate>
 <h3>字符串变为日期:${date}</h3>
</body>
</html>

 效果图:

国际化标签库_html_14


  

 

设置时区 
<fmt:setTimeZone>标签可以设置显示的时区或者将设置的时区储存到一个属性范围中,语法如下:
<fmt:setTimeZone value="设置的时区" [var="存储时区的属性名称"]  [scope="[page | request | session | application]"]/>设置CCT时区 —— timezone_set.jsp
设置成CCT(中国沿海时间)、HST(夏威夷标准时间)
  <fmt:setTimeZone value="CCT" var="tz"/> 
<fmt:timeZone> 
<fmt:timeZone>可以设置时区,语法如下:
<fmt:timeZone value="设置的时区">
  标签体内容
  </fmt:timeZone>

 

设置时区显示

<%@ page language="java" contentType="text/html" pageEncoding="utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
<head>
<title>设置时区显示</title>
</head>
<body>
<%
	//在 page 属性范围中保存一个日期
	pageContext.setAttribute("dateref", new java.util.Date());
 %>
 <fmt:timeZone value="HST">
 	<fmt:formatDate value="${dateref}" type="both" dateStyle="full" timeStyle="full" var="date"/>
 </fmt:timeZone>
 <h3>full 显示日期时间是:${date}</h3>
</body>
</html>

 效果图:

国际化标签库_java_15



小结

通过国际化显示标签可以方便的完成资源文件的读取,以及对文字、日期、数字的格式化操作。