基于Struts 2的Web应用国际化开发非常简单,其中Struts 2的国际化包括如下几部分:校验提示信息国际化、类型转换提示信息国际化、Action信息国际化以及JSP页面国际化。
第一节 JSP页面国际化
要实现JSP页面国际化,首先需要添加并配置相应的国际化资源文件,然后在JSP页面中通过指定Text标签的name属性为相应的Key值从而实现国际化。JSP页面国际化有两种方式:一种是加载全局资源文件完成国际化,另一种是指定临时资源文件完成国际化;下面将分别介绍这两种方式的国际化操作
1.1 加载全局资源文件完成国际化
在一般情况下,可以将国际化信息放到国际化资源文件中,然后在struts.xml文件中配置该资源文件为全局的,这样就可以在JSP文件中很方便的访问到该资源文件,从而实现JSP页面国际化。
下面首先来添加一份中文资源文件jspInterResource_zh_CN.properties,其代码如下所示:
welcomeMessage=u5927u5BB6u597DuFF01
再添加一份英文资源文件jspInterResource_en_US.properties,其代码如下所示:
welcomeMessage=Hello,everyone!
打开struts.xml配置文件,在struts根节点下添加一个常量节点constant用来配置全局资源文件,其代码如下所示:
<constant name="struts.custom.i18n.resources" value="jspInterResource"></constant>
下面这段代码主要演示如何通过Struts 2标签库中的Text标签输出国际化信息:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <head><title>欢迎信息</title></head> <body> <s:text name="welcomeMessage"></s:text><!--输出国际化资源文件!--> </body> </html>
解说:上述代码中添加了一个<s:text>标签,该标签的name属性为"welcomeMessage",表示用来输出国际化资源文件中Key为"welcomeMessage"的信息。
1.2 指定临时资源文件完成国际化
前面的示例在struts.xml文件中配置全局资源文件,这样的资源文件在每个JSP文件中都可以使用。那如何才能使得资源文件不通过struts.xml文件配置,同样能被JSP页面调用呢?可以在需要调用国际化资源文件的JSP页面中通过<s:i18n >标签来指定临时资源文件,这样就可以通过指定Key值来找到国际化信息了。
下面这段代码主要演示如何通过Struts 2标签库中的Text标签结合i18n标签输出临时资源文件中的国际化信息:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <head><title>欢迎信息</title></head> <body> <s:i18n name="jspInterResource"><!--指定临时资源文件名--> <s:text name="welcomeMessage"></s:text><!--输出国际化资源文件!--> </s:i18n> </body> </html>
解说:上述代码添加了一个i18n标签,通过其name属性来设置资源文件名,该资源文件只在i18n标签内部才有用,离开该标签就无法使用了。
1.3 为资源文件传递参数
可以在Text标签中添加一个<s:param>标签来来传递参数给资源文件。资源文件则可以通过占位符的形式来接受参数值。
首先修改中文资源文件jspInterResource_zh_CN.properties,为资源文件添加占位符,其代码如下所示:
welcomeMessage={0}uFF0Cu4F60u597DuFF01
再修改英文资源文件jspInterResource_en_US.properties,其代码如下所示:
welcomeMessage=Hello,{0}!
下面这段代码主要演示如何通过Struts 2标签库中的param标签来传递参数:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <head><title>欢迎信息</title></head> <body> <s:i18n name="jspInterResource"><!--指定临时资源文件名--> <s:text name="welcomeMessage"><!--输出国际化资源文件!--> <s:param>James</s:param><!-- 传递参数 --> </s:text> </s:i18n> </body> </html>
解说:上述代码通过<s:param>标签传递参数,其参数值为James
1.4 资源文件加载顺序
前面介绍了两种JSP完成国际化的方式,一种是通过全局资源文件,一种是通过临时资源文件。那到底它们之间的加载顺序是如何的呢?
下面来介绍资源文件加载顺序,其规则如下:
(1)如果使用了<s:i18n/>指定了临时资源文件,则先从临时资源文件中查找指定key对应的value值。
(2)如果在临时资源文件中没有找到指定的key对应的value值,则查找全局资源文件中该key对应的value值。
(3)如果在全局资源文件中仍没找到指定的key对应的value值,则直接输出key值。
(4)如果没有使用<s:i18n/>指定了资源文件,则直接查找全局国家化资源文件中该key对应的value值。如果没找到指定的key对应的value值,则直接输出key值。
第二节 Action国际化
Struts 2中的Action可以通过指定全局资源文件、包范围资源文件、Action范围资源文件这三种方式实现国际化。
2.1 加载全局资源文件完成国际化
Action可以通过加载全局资源文件的方式获得国际化信息从而完成国际化,全局文件必须存放地址在项目的WEB-INF/classes目录下。
首先来添加一份中文资源文件GlobalInterResource_zh_ CN.properties,其代码如下所示:
ActionMessage=u5168u5C40u8303u56F4-u6B22u8FCEu4FE1u606F
再添加一份英文资源文件GlobalInterResource_en_US.properties,其代码如下所示:
ActionMessage=Global-WelcomeMessage
打开struts.xml配置文件,在struts根节点下添加一个常量节点constant用来配置全局资源文件,其代码如下所示:
<constant name="struts.custom.i18n.resources" value="GlobalInterResource"></constant>
配置完全局的资源文件,就可以在Action中通过getText方法来取得国际化信息了,getText方法是在ActionSupport中定义的,所以要使用该方法必须首先将Action继承ActionSupport类。
下面这段代码主要演示如何通过ActionSupport类中的getText方法获得全局资源文件中的国际化信息:
package com.sanqing.action; import com.opensymphony.xwork2.ActionSupport; public class ShowActionMessage extends ActionSupport { private String actionMessage; //actionMessage属性 public String getActionMessage() { //设置actionMessage属性值 return actionMessage; } public void setActionMessage(String actionMessage) {//获得actionMessage属性值 this.actionMessage = actionMessage; } public String execute() throws Exception { actionMessage = this.getText("ActionMessage");// 取得国际化信息 return this.SUCCESS; } }
解说:上述代码中添加了一个actionMessage属性,该属性用来保存从资源文件中取得的国际化信息。
添加完Action后,需要在struts.xml中配置该Action,其配置代码如下:
<package name="struts2" extends="struts-default"> <action name="showActionMessage" class="com.sanqing.action.ShowActionMessage"> <result name="success">/ShowActionMessage.jsp</result> </action> </package>
从配置中可以看到成功输出页面为,所以需要添加该页面,其代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <head><title>国际化信息</title></head> <body>${actionMessage}</body> </html>
解说:上述代码使用EL表达式输出Action中的属性
2.2 加载包范围资源文件完成国际化
下面来介绍包范围资源文件,包范围资源文件的好处在于不需要在struts.xml文件中配置。不同包下的Action使用不同的包范围资源文件,能够很好的将资源文件进行归类。包范围资源文件可以也只能被该包下的Action访问。包范围资源文件的命名规则为package_语言_国家.properties,下面在com.sanqing.action包下添加中英文的包范围资源文件。
首先来添加一份中文资源文件package_zh_CN.properties,其代码如下所示:
ActionMessage=u5305u8303u56F4-u6B22u8FCEu4FE1u606F
再添加一份英文资源文件package_en_US.properties,其代码如下所示:
ActionMessage=Package-WelcomeMessage
2.3 加载Action范围资源文件完成国际化
下面来介绍Action范围资源文件,Action范围资源文件同样不需要在struts.xml文件中配置。Action范围资源文件只能被所对应的Action访问,其他Action无法访问。Action范围资源文件的命名规则为ActionNamee_language_ country.properties,文件保存必须保存在Action同目录下。下面将为ShowActionMessage添加Action范围中英文资源文件。
首先来添加一份中文资源文件ShowActionMessage_zh_CN.properties,其代码如下所示:
ActionMessage=Actionu8303u56F4-u6B22u8FCEu4FE1u606F
再添加一份英文资源文件ShowActionMessage_en_US.propertiess,其代码如下所示:
ActionMessage=Action-WelcomeMessage
2.4 资源文件加载顺序
假如在Action范围资源文件、包范围资源文件、全局资源文件中同时定义了相同的key以及value值,那么最终Action中取得的国际化信息为Action范围资源文件中指定key对应的value值。
下面来看资源文件加载顺序示意图,如图所示:
第三节 示例→实现用户自行选择语言环境站点