信息显示标签
通过前面的学习可以知道,在设计一个国际化的应用时,应该把程序显示的文本内容放在独立的资源文件中,那么如何读取这些资源文件呢?国际化标签库中提供了一系列用于读取资源文件中信息的标签,具体如下。
1、标签
<fmt:Bundle>用于根据<fmt:setLocale>标签设置的本地化信息创建一个资源包实例对象,但它创建的ResourceBundle实例对象只在其标签内有效。<fmt:Bundle>标签的语法格式如下:
<fmt:Bundle basename="basename" [prefix="prefix"]>
*body content*
</fmt:Bundle>
在上述语法格式中,basename属性用于指定创建ResourceBundle实例对象的基名。prefix属性用于指定追加到嵌套在<fmt:Bundle>标签内的<fmt:Message>标签的key属性值前面的前缀。
2、标签
<fmt:setBundle>用于创建一个资源包实例对象,并将其绑定到一个Web域的属性上。<fmt:setBundle>标签的语法格式如下:
<fmt:setBundle basename="basename"
[var="varName"]
[scope="{page|request|session|application}"]/>
在上述语法格式中,basename属性用于指定创建ResourceBundle实例对象的基名。var属性用于指定将创建出的ResourceBundle实例对象保存到Web域中的属性名称。scope属性用于指定将创建出的ResourceBundle实例对象保存在哪个Web作用域中。
<fmt:setBundle>标签还有一些特性,具体如下:
● 如果basename属性的值为null、空字符串或找不到basename属性指定的资源,<fmt:setBundle>标签保存到Web域中的属性的值为null。
● 如果没有指定var属性,<fmt:setBundle>标签将把ResourceBundle实例对象以域属性名javax.servlet.jsp.jstl.fmt.localizationContext保存到Web域中。所有没有嵌套在<fmt:Bundle>标签中且未指定bundle属性的<fmt:formatDate>都将使用该标签创建的资源包。
3、标签
<fmt:message>标签用于从一个资源包中读取信息并进行格式化输出,它的使用有几种语法格式,具体如下:
语法1:没有标签体的情况
<fmt:message key="messageKey"
[bundle="resourceBundle"]
[var="varName"]
scope="{page|request|session|application}"/>
语法2:在标签体中指定格式化文本串中的占位符参数的情况
<fmt:message key="messageKey"
[bundle="resourceBundle"]
[var="varName"]
scope="{page|request|session|application}">
<fmt:param>subtags
</fmt:message>
语法3:在标签体中指定消息关键字和可选择的占位符参数
<fmt:message key="messageKey"
[bundle="resourceBundle"]
[var="varName"]
scope="{page|request|session|application}">
*key*
*optional* <fmt:param>subtags
</fmt:message>
关于<fmt:message>标签还有几点说明,具体如下:
● 如果指定的资源不存在,则输出“???<key>???”形式的错误信息。
● 如果ResourceBundle中不存在key属性指定的信息,则输出“???<key>???”形式的错误信息。
●如果key属性的值为null或空字符串,则输出“?????”的错误信息。
● 如果<fmt:message>标签处理的格式化字符串中包含参数,但其中没有嵌套与该参数对应的<fmt:param>标签,则直接输出改参数在格式化文本串中的原始形式。
4、标签
<fmt:param>标签用于为格式化文本串中的占位符设置参数值,它只能嵌套在<fmt:message>标签内使用。<fmt:param>标签的语法格式有两种,具体如下:
语法1:用value属性指定参数值
<fmt:param value="messageParameter"/>
语法2:在标签体中指定参数的值的情况:
<fmt:param>
*Body content*
</fmt:param>
在上述语法结构中,<fmt:param>标签的value属性类型是java.lang.Object,它支持动态属性值。
讲解完这几个用于信息显示的标签,接下来用标签的形式重新实现“获取Web应用中的本地信息”小节中的例1的国际化页面效果,如例1所示。
例1 fmt_message.jsp
1 <%@ page language="java" contentType="text/html; charset=gb2312"
2 pageEncoding="gb2312" import="java.util.*,java.text.*"%>
3 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
4 <html>
5 <fmt:setBundle basename="applicationRes" var="applicationRes" />
6 <head>
7 <title><fmt:message bundle="${applicationRes}" key="title" /></title>
8 </head>
9 <body>
10 <fmt:message bundle="${applicationRes}" key="heading" />
11 <br>
12 <jsp:useBean id="now" class="java.util.Date" />
13 <%
14 session.setAttribute("nm", new Integer(10));
15 session.setAttribute("number", new Double(550.8));
16 %>
17 <fmt:message bundle="${applicationRes}" key="message">
18 <fmt:param value="${now}" />
19 <fmt:param value="${nm}" />
20 <fmt:param value="${number}" />
21 </fmt:message>
22 <br>
23 </body>
24 </html>
打开IE浏览器,在地址栏中输入http://localhost:8080/chapter10/ fmt_message.jsp
访问fmt_message.jsp页面,此时,浏览器显示的结果如图1所示。
图1 运行结果
修改IE浏览器所支持的中文(中国)和英文(美国)语言的顺序,将客户端首选的本地信息变为“英文(美国)”,然后点击浏览器窗口的刷新按钮,结果如图2所示。
图2 运行结果
在例1中,用国际化标签实现了国际化的Web应用。可见,使用标签可以更加简单的的实现国际化的Web应用。