5. 示例 04 – 国际化
本示例回顾了第一个示例中探讨的国际化内容。
5.1. NetBeans 项目


其中包含:
- 一个视图 [Page1.jsp]
- 两个消息文件 [messages*.properties]
- 无操作
5.2. 项目配置
文件 [struts.xml] 内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 国际化 -->
<constant name="struts.custom.i18n.resources" value="messages" />
<!-- 默认包 -->
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="index">
<result type="redirectAction">
<param name="actionName">Action1</param>
<param name="namespace">/actions</param>
</result>
</action>
</package>
<!-- 操作包 -->
<package name="actions" namespace="/actions" extends="struts-default">
<action name="Action1">
<result name="success">/vues/Page1.jsp</result>
</action>
</package>
</struts>
- 第 8 行定义了一个 Struts 常量,该常量确定了国际化消息文件的名称,此处为 messages。 系统将在项目中的 ClassPath 目录下查找 [messages_xx.properties] 文件。因此,这些文件被放置在 [Source Packages] 和 [1] 的根目录下。
- 第21-23行:定义了一个没有关联类的[Action1]操作。此时将使用Struts的默认类,其execute方法返回success键。 随后,视图 [/vues/Page1.jsp] 将被返回给客户端。需要明确的是,这与直接调用视图 [/vues/Page1.jsp] 并不相同。 实际上,调用操作会触发拦截器的执行,而直接调用视图则不会。其中一个拦截器负责管理国际化。
5.3. 消息文件
messages.properties
page.texte=Ici, on met un texte fran\u00e7ais...
page.titre1=Fran\u00e7ais
page.titre2=Fran\u00e7ais
messages_en.properties
page.texte=Here, we put some english text...
page.titre1=English
page.titre2=English
它们定义了三个键:page.texte、page.titre1、page.titre2。如果页面语言为英语(en),则使用文件 [messages_en.properties]。 对于所有其他语言,将使用文件 [messages.properties]。这是默认的消息文件。使用的语言为:
- 客户端浏览器在发送给服务器的首选项中指定的语言
- 客户端通过 request_locale=xx 参数发出的请求中指定的语言。
5.4. 视图 [Page1.jsp]
视图如下:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><s:text name="page.titre1"/></title>
</head>
<body>
<h1><s:text name="page.titre2"/></h1>
<s:text name="page.texte"/>
</body>
</html>
- 第 7 行:显示密钥消息 page.titre1
- 第 10 行:显示键消息 page.titre2
- 第 11 行:显示密钥消息 page.texte
5.5. 测试
运行项目:
![]() |
- 在 [1] 中,页面以法语显示。这是因为所使用的浏览器将法语设为首选语言,因此调用了文件 [messages.properties]。
- 在 [3] 中,页面以英语显示。这是因为 [2] 的 URL 使用了参数 request_locale=en,因此调用了文件 [messages_en.properties]。
![]() |
在 [4] 中,请求的是德语 (de) 页面。 由于不存在 [messages_de.properties] 文件,因此使用了默认文件 [messages.properties] [5]。
在 [6] 中,将英语设为浏览器的首选语言。
![]() |
在 [7] 中,调用 [Action1] 操作时未指定语言参数。 该请求来自首选语言为英语(en)的浏览器。因此,使用的是文件 [messages_en.properties] 而不是 [8]。
从现在起,所有项目都将拥有一个唯一的 [messages.properties] 文件,该文件将适用于所有语言。这将要求我们编写使用该文件中键值的视图。将项目国际化为英语,只需创建包含英语消息的 [messages_en.properties] 文件即可。无需进行其他修改。


