9.4 资源文件读取顺序
在进入具体示例之前,先来写一个Action,然后配置9.3.2节中的jsp作为这个Action的结果页面,好方便本节知识的示范。
这个Action非常的简单,什么都不做,只是让execute方法返回SUCCESS即可。示例代码如下:
- package cn.javass.i18n;
- import com.opensymphony.xwork2.ActionSupport;
- public class I18NAction extends ActionSupport{
- public String execute() throws Exception {
- return SUCCESS;
- }
- }
在struts.xml中,配置9.3.2节中的jsp为这个Action的后继页面。
- <action name="i18nAction" class="cn.javass.i18n.I18NAction">
- <result>/i18n/result.jsp</result>
- </action>
接下来测试的时候,都直接访问http://localhost:9080/helloworld/i18nAction.action即可。
注意:本节中的访问,都是在浏览器使用中文zh_CN的前提下访问的。
9.4.1全局级资源文件
在9.3节中,使用的就是全局级资源文件。全局级资源文件只需要在struts.xml中或者struts.properties文件中设置常量值struts.custom.i18n.resources即可。
仍以前面在struts.xml中的设置为例,示例如下:
- <constant name="struts.custom.i18n.resources" value="message"/>
这里设置的message就是一组国际化资源文件名的前缀。如果有多组国际化资源文件,则以逗号分隔。如“message,dictionary”,就表示还另有一套以dictionary为前缀名的国际化资源文件,这些文件都放在classpath的根目录上。
9.4.2包级资源文件
包级资源文件指的是,在当前访问的Action的同包下,声明一组package.properties,可能包括package.properties、package_zh_CN.properties、package_en_US.properteis等等。注意文件名称就是叫package.properties,而不是“包的名称.properties”。
要设置包级资源文件,就必须放在Action这个类的同包下,比如可以建立一个package_zh_CN.properties,放在测试使用的Action同包下,示例如下:
- labela = labela in zh_CN with package
这时,再次测试,会发现显示的就是刚刚设置的“labela in zh_CN with package”了。当然,在这个包下所有Action以及Action的后继页面,都可以访问这个文件中的信息。
如果包级资源文件和全局级资源文件同时存在,则包级资源文件覆盖全局级资源文件中的同key的信息。
9.4.3类级资源文件
1:类级资源文件入门
类级资源文件比较复杂,这里先做一个简单的示例。可以在当前访问的Action类的同包下,声明一组以该Action类名为前缀的国际化资源文件,可能包括Action类名.properties、Action类名_en_US.properties、Action类名_zh_CN.properties等等。
比如访问的Action是cn.javass.i18n.I18NAction,那么,要设置的包级资源文件,就必须放在cn.javass.i18n这个包下,比如来建立一个I18NAction_zh_CN.properties文件,示例如下:
- labela = labela in zh_CN with action
这时,再次访问就会发现显示的就是刚刚设置的“labela in zh_CN with action”了。当然,在这个Action以及这个Action的后继页面,都可以访问这个文件中的信息。
如果类级资源文件和包级资源文件同时存在,则类级资源文件覆盖包级资源文件中的同key信息。
2:多种类级资源文件及其覆盖顺序
类级资源文件最为复杂,并不仅是一种,而是分为四种:
- ActionClass:资源文件名称的前缀必须与Action类名一致,在上面的示例中使用的就是这种。
- MyInterface:资源文件名称的前缀必须与Action实现的某一个接口名称一致,这个实现关系也并不一定是直接的实现关系,也有可能是当前类实现的接口的父接口,也有可能是当前类的父类实现的接口。
- MySuperClass:资源文件名称的前缀必须与Action的父类名一致,这个实现关系也并不一定是直接的继承关系,也可能是当前类的父类。
- 如果动作类实现了ModelDriven接口,那么也会查找getModel方法返回类型的资源文件。
如果多种资源文件同时出现,将遵照上述类型出现的顺序进行覆盖,即ActionClass最优先,它会覆盖其他所有的资源文件,最常用的也是ActionClass这种方式。
9.4.4资源文件的覆盖顺序
资源文件很多,它们的覆盖顺序为:类级>包级>全局级。
做个示例来体会一下,比如为前面示例的I18NAction,同时设置类级、包级和全局级的资源文件,然后来访问看看效果。
1:先来准备资源文件
类级资源文件,名称为:I18NAction_zh_CN.properties,放在I18NAction同包下,内容为:
- labela = labela in zh_CN with action
包级资源文件,名称为:package_zh_CN.properties,放在I18NAction同包下,内容为:
- labela = labela in zh_CN with package
全局级的资源文件,名称为:message.properties,放在src下,内容为:
- message.properties
struts.xml的内容如下:
- <struts>
- <constant name="struts.devMode" value="true" />
- <constant name="struts.custom.i18n.resources" value="message"/>
- <package name="helloworld" extends="struts-default">
- <action name="i18nAction" class="cn.javass.i18n.I18NAction">
- <result>/i18n/result.jsp</result>
- </action>
- </package>
- </struts>
2:运行看看效果,此时的输出应该是
- labela = labela in zh_CN with action
3:把I18NAction_zh_CN.properties文件中的labela改个名称,不管改成什么,不是“labela”就行,然后重新启动服务器,再次运行,看看效果此时的输出应该是:
- labela = labela in zh_CN with package
4:把package_zh_CN.properties文件中的labela改个名称,不管改成什么,不是“labela”就行,然后重新启动服务器,再次运行,看看效果此时的输出应该是:
- labela = labela in zh_CN
私塾在线网站原创《研磨struts2》系列
转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4086.html】
欢迎访问http://sishuok.com获取更多内容