8.3 Action中访问国际化资源文件
Struts 2中的Action可以通过3种方式来加载资源文件,包括指定全局资源文件、包范围资源文件、Action范围资源文件。并且对于不同范围的资源文件,加载顺序也不同。
8.3.1 全局资源文件
Action中访问的资源文件分为3种:全局资源文件、包范围资源文件、Action范围资源文件。
下面使用Action访问全局资源文件,首先新建两个全局资源文件。
❑ 第一个资源文件:message_en_US.properties。
message = hello beijing
❑ 第二个资源文件:message_zh_CN.properties。
message = \u4F60\u597D, \u5317\u4EAC
使用native2ascii命令来处理转换成Unicode编码。
message =你好,北京
新建Action,在该Action中通过getText()方法来取得国际化信息。并将取得的信息设置到request范围中,代码如下所示。
package net.hncu.struts2.action; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class ShowAction extends ActionSupport { public String execute() throws Exception { //取得国际化信息 String message = getText("message"); //将信息设置到request属性中 ServletActionContext.getRequest().setAttribute("message", message); return SUCCESS; } }
在“struts.xml”文件中部署该Action,指定如果Action返回success,页面将跳转到showMessage. jsp消息输出页,代码如下所示。
<! -- struts为配置文件根元素--> <struts> <! -- 定义资源文件baseName --> <constant name="struts.custom.i18n.resources" value="message"></constant> <package name="struts2" extends="struts-default"> <! -- 定义show的Action,其实现类为net.hncu.struts2.action.ShowAction--> <action name="show" class="net.hncu.struts2.action.ShowAction"> <! -- 定义处理结果与视图资源之间的关系--> <result name="success">/showMessage.jsp</result> </action> </package> </struts>
新建消息输出页“showMessage.jsp”,使用EL表达式输出request属性范围中的message值,代码如下所示。
<%@ page language="java" pageEncoding="gb2312"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Action中国际化</title>
</head>
<body>
<center>
${message}
</center>
</body>
</html>
打开浏览器,输入Web项目名加上show.action,页面跳转到消息输出页显示中文的欢迎信息,如图8.8所示。
修改浏览器的语言环境,设置其语言环境为美国英语。刷新该页面,页面输出英文的欢迎信息,如图8.9所示。
图8.8 页面输出中文的欢迎信息
图8.9 页面输出英文的欢迎信息
8.3.2 包范围资源文件
下面来介绍包范围资源文件,包资源文件的好处在于不需要在“struts.xml”文件中配置,而且可以将资源文件归类,不同包下的Action使用不同的包资源文件。包范围资源文件可以被该包下的所有Action访问。
下面使用Action访问全局资源文件,首先新建两个包范围资源文件,包范围资源文件的文件名为package_language_country.properties,保存目录为该包的根目录。
❑ 第一个资源文件:package_en_US.properties。
message = package:hello beijing
❑ 第二个资源文件:package_zh_CN.properties。
message = \u5305\u8303\u56F4\u8D44\u6E90\u6587\u4EF6:\u4F60\u597D, \u5317\u4EAC
使用native2ascii命令来处理转换成Unicode编码。
message = 包范围资源文件:你好,北京
打开浏览器,输入Web项目名加上show.action,页面跳转到消息输出页显示中文的欢迎信息,如图8.10所示。
修改浏览器的语言环境,设置其语言环境为美国英语。刷新该页面,页面输出英文的欢迎信息,如图8.11所示。
图8.10 页面输出中文的欢迎信息
图8.11 页面输出英文的欢迎信息
8.3.3 Action范围资源文件
Struts 2还允许单独为Action指定一份国家化资源文件。Action范围的资源文件只能被该Action访问。下面新建两个Action范围资源文件,其文件名为ActionNamee_language_country.properties,文件保存到Action同目录下。
❑ 第一个资源文件:ShowAction_en_US.properties。
message = Action:hello beijing
❑ 第二个资源文件:ShowAction_zh_CN.properties。
message = Action\u8303\u56F4\u8D44\u6E90\u6587\u4EF6:\u4F60\u597D, \u5317\u4EAC
使用native2ascii命令来处理转换成Unicode编码。
message = Action范围资源文件:你好,北京
打开浏览器,输入Web项目名加上show.action,页面跳转到消息输出页显示中文的欢迎信息,如图8.12所示。
修改浏览器的语言环境,设置其语言环境为美国英语。刷新该页面,页面输出英文的欢迎信息,如图8.13所示。
图8.12 页面输出中文的欢迎信息
图8.13 页面输出英文的欢迎信息
8.3.4 加载资源文件顺序
上面介绍了Action提供3种方式来加载国际化资源文件,从上面这个示例可以看出Action范围资源文件最先加载,然后是包范围资源文件,最后是全局资源文件。但是必须注意一点的是,如果在某一范围找到了指定key对应的信息,它将停止查找然后输出该key对应的信息。
假如在Action范围资源文件、包范围资源文件、全局资源文件中同时定义了相同的key以及value值,那么最终Action中取得的国际化信息为Action范围资源文件中key对应的value值。
下面来看资源文件加载顺序示意图,如图8.14所示。
图8.14 资源文件加载顺序示意图