学科分类
目录
Java Web

信息显示标签

通过前面的学习可以知道,在设计一个国际化的应用时,应该把程序显示的文本内容放在独立的资源文件中,那么如何读取这些资源文件呢?国际化标签库中提供了一系列用于读取资源文件中信息的标签,具体如下。

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应用。

点击此处
隐藏目录