
4.5 Struts 2的国际化与应用案例
国际化是指应用程序运行时,可根据客户端请求来自的国家/地区、语言的不同而显示不同的界面。常用i18n作为“国际化”的简称,Struts 2框架通过资源文件的方式来实现国际化。使用国际化,首先需要建立不同语言的资源文件,并把中文符转化为Unicode代码,然后在struts.xml配置文件中配置资源文件。
4.5.1 资源文件
语言资源文件内容是由一组key-value对组成的。其格式如下。
loginName=用户名称 loginPassword=用户密码
针对不同的语言环境,需要定义不同的资源文件。资源文件放在“源包”(src)下,全局资源文件的命名可以有以下3种形式。
● 资源文件名_语言种类编码_国家编码.properties。
● 资源文件名_语言种类编码.properties。
● 资源文件名.properties。
资源文件如果使用第3种命名方式,即缺省语言代码,若系统找不到与客户端请求的语言环境相匹配的资源文件,则系统使用该默认的属性文件。
【例4-7】假设对登录系统进行国际化处理,根据不同的语言环境显示英文和中文用户界面。创建英文和中文版本的资源文件,分别取名为globalMessages_zh_CN.properties和globalMessages_en_US.properties。
提示:对于中文资源文件内容,需要将中文字符转化为Unicode编码。在Eclipse开发环境中,自动进行转换。若使用其他开发工具,根据其特点,选取相应的方法。
1)建立中文版资源文件:globalMessages_zh_CN.properties,代码如下。
title=登录页面 username=姓名 password=密码 submit=登录 reset=重置 message.success=你已成功登录。现进入了主页。 message.failure=你登录失败。现进入注册页面,请注册你的信息。
2)建立英文版资源文件:globalMessages_en_US.properties,代码如下。
title = Login Page username = Input your username password = Input your password submit = Submit reset = Reset message.success = you're successful to login in. Now you've entered the main page. message.failure = you fail to login in. You need register your information.
4.5.2 资源文件的访问
编写完国际化资源文件后,需要在struts.xml文件中配置国际化资源文件的名称(或者在struts.properties属性文件内直接设置资源文件),从而使Struts 2的i18n拦截器在加载国际化资源文件时能找到这些国际化资源文件。
1.资源文件的配置
在struts.xml中,需要使用Struts 2的i18n拦截器,通过constant元素配置常量,指定国际资源文件名称,value的值就是常量值,即国际化资源文件的名称,配置格式如下。

2.访问资源文件
当建立资源文件并配置后,就可以在Web应用程序中引用这些资源文件。但不同的Web技术(JSP、Struts 2中的Action、XML)其引用方法不同。
1)JSP页面上使用国际化资源。
JSP页面上使用国际化资源,一般使用<s:text>标签,直接显示资源文件内的属性值。另外,在表单中要注意以下两种情况。
● 表单不使用theme主题,即表单的theme属性不能设置为simple,此时使用表单标签的key属性。例如,【例4-7】给出登录页面的设计,其代码如下。
<s:form action=""> <s:textfield name="username" key="username"></s:textfield> <s:password name="password" key="password"></s:password> <s:submit key="submit"></s:submit> </s:form>
● 表单使用theme主题,即表单的theme属性若设置为simple,则表单标签的key属性不起作用,此时,需要使用<s:text>标签添加提示信息。例如,【例4-7】登录页面也可以给出如下的等价设计,其代码如下。
<s:form action="" theme="simple"> <s:text name="username"/>:<s:textfield name="username"></s:textfield><br> <s:text name="password"/>:<s:password name="password"> </s:password><br> <s:submit key="submit"></s:submit> </s:form>
2)Action访问国际化资源文件,通过getText(String key)方法获取资源信息。注意:采用该方式,Action必须继承ActionSupport。
例如,在【例4-7】中给出如下Action的定义,并配置Action。
package com.edu.i18n.action; import com.opensymphony.xwork2.ActionSupport; public class TestI18nAction extends ActionSupport { public String execute() throws Exception { //在Action中访问国际化资源文件的value值,这里是"username" String username = getText("username"); System.out.println(username); return SUCCESS; } }
配置Action和资源文件,代码如下。
<struts> <constant name="struts.custom.i18n.resources" value="globalMessages"></constant> <package name="default" namespace="/" extends="struts-default"> <action name="testI18n" class="com.edu.i18n.action.TestI18nAction"> <result>/i18n.jsp</result> </action> </package> </struts>
当运行该Action时,在控制台上输出username对应的“国际化信息”。
3)利用超链接实现动态加载国际化资源文件——直接进入所需要的语言页面。
在超链接的后面附着request_locale的请求参数,其参数值为“语言国家代码”。注意:超链接必须是一个Struts 2的Action请求。例如,对于前面给出的Action:testI18n,利用超链接直接加载国际化资源,从而按规定的语言显示页面。
<a href="testI18n.action? request_locale=en_US">按英文显示页面</a> <a href="testI18n.action? request_locale=zh_CN">按中文显示页面</a>
4.5.3 Struts 2的国际化应用案例
【例4-8】在【例4-7】已经给出的资源文件基础上,设计具有“中英文”的登录系统。
【分析】对于登录系统的业务流程,在前面的一些案例中已经介绍过,请参考。
【设计】该系统需要设计的组件有以下几个。
1)两个页面:登录页面login.jsp和成功登录页面loginsuccess.jsp。
2)两个资源文件:支持英文登录和支持中文登录的资源文件。
3)登录验证的控制器LoginAction类。该控制器的业务逻辑是:如果验证成功,则跳转到loginsuccess.jsp页面;如果验证不成功,则重新返回到登录页面(login.jsp)。
【实现过程】
1)建立工程c4_i18n,并在web.xml中配置核心控制器。
2)编写国际化资源文件。见【例4-7】给出的资源文件。
3)编写视图组件输出国际化消息。
● 中英文登录页面(login.jsp)的代码如下。
<html> <head><title><s:text name="title" /></title></head> <body> <s:form action="checkLogin" method="post"> <s:textfield name="name" key="username" size="20" /> <s:password name="password" key="password" size="22" /> <s:submit key="submit" /> </s:form> </body> </html>
● 登录成功页面(loginSuccess.jsp)的代码如下。
<html> <head> <title> <s:text name="message.success"/></title> </head> <body> <s:text name="username"/>:<s:property value="name"/><br> <s:text name="password"/>:<s:property value="password"/> </body> <br><a href="login.jsp"> <s:property value="tip"/></a> </html>
4)编写控制器Action, login.jsp对应的业务控制器LoginAction类,代码如下。
package com.edu.i18n.action; //省略了import; public class LoginAction extends ActionSupport { private String name; private String password; private String tip; //用于存放标题信息 //省略了属性的setter/getter方法 public String execute() throws Exception{ if(getName().equals("QQ")&&getPassword().equals("123") ){ ActionContext.getContext().getSession().put("name", getName()); tip=getText("title"); return "success"; }else{ return "error"; } } }
5)在struts.xml中配置Action与国际资源文件,配置内容如下。
<struts> <constant name="struts.custom.i18n.resources" value="globalMessages" /> <constant name="struts.i18n.encoding" value="UTF-8" /> <package name="I18N" extends="struts-default"> <action name="checkLogin" class="loginAction.LoginAction"> <result name="success">/loginSuccess.jsp</result> <result name="error">/login.jsp</result> </action> </package> </struts>
6)项目部署和运行。
项目部署后运行,如果操作系统是在中文系统下,运行login.jsp页面,将出现中文提示信息的运行页面;如果使用的是英文操作系统或者通过设置浏览器语言,运行时将出现英文登录页面。在中文情况下的运行界面如图4-7所示。

图4-7 【例4-8】的运行界面
a) 登录页面b) 显示登录成功页面