本章目标
理解国际化的主要操作;
可以使用国际化进行文本、日期的格式化操作。
国际化标签库
国际化是程序的重要组成部分,一个程序可以根据所在的区域进行相应信息显示,例如:各个地区的数字、日期显示风格都是不一样的,在JSTL中使用fmt.tld作为格式化标签库的定义文件。
格式化标签库提供的标签
<fmt:setLocale>标签
<fmt:setLocale>标签的主要功能是用来设定用户所在的区域,语法如下:
<fmt:setLocale value="区域编码" [variant="浏览器"] [scope="[page | request | session | application]"]/>
<fmt:setLocale>标签的属性
设置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>
效果图:
<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
效果图:
<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>
效果图:
<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>
效果图:
数字格式化标签
在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>标签的属性
格式化数字显示
<%@ 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>
效果图:
<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>标签的属性
数字的反格式化
<%@ 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>
效果图:
日期时间格式化标签
<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>标签的属性
格式化日期时间
<%@ 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>
效果图:
<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>标签的属性
日期的反格式化
<%@ 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>
效果图:
设置时区
<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>
效果图:
小结
通过国际化显示标签可以方便的完成资源文件的读取,以及对文字、日期、数字的格式化操作。