论坛首页 Java企业应用论坛

《研磨struts2》第九章 国际化 之 9.4 资源文件读取顺序

浏览 1144 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-05-13  

9.4  资源文件读取顺序

在进入具体示例之前,先来写一个Action,然后配置9.3.2节中的jsp作为这个Action的结果页面,好方便本节知识的示范。

       这个Action非常的简单,什么都不做,只是让execute方法返回SUCCESS即可。示例代码如下:

 

java代码:
  1. package cn.javass.i18n;  
  2. import com.opensymphony.xwork2.ActionSupport;  
  3. public class I18NAction  extends ActionSupport{  
  4.     public String execute() throws Exception {  
  5.         return SUCCESS;  
  6.     }  
  7. }  

在struts.xml中,配置9.3.2节中的jsp为这个Action的后继页面。

 

java代码:
  1. <action name="i18nAction" class="cn.javass.i18n.I18NAction">  
  2.             <result>/i18n/result.jsp</result>  
  3. </action>  

接下来测试的时候,都直接访问http://localhost:9080/helloworld/i18nAction.action即可。

       注意:本节中的访问,都是在浏览器使用中文zh_CN的前提下访问的。

9.4.1全局级资源文件

在9.3节中,使用的就是全局级资源文件。全局级资源文件只需要在struts.xml中或者struts.properties文件中设置常量值struts.custom.i18n.resources即可。

仍以前面在struts.xml中的设置为例,示例如下:

 

java代码:
  1. <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同包下,示例如下:

 

java代码:
  1. 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文件,示例如下:

 

java代码:
  1. 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同包下,内容为:

 

java代码:
  1. labela = labela in zh_CN with action  

包级资源文件,名称为:package_zh_CN.properties,放在I18NAction同包下,内容为:

 

java代码:
  1. labela = labela in zh_CN with package  

全局级的资源文件,名称为:message.properties,放在src下,内容为:

 

java代码:
  1. message.properties  

struts.xml的内容如下:

 

java代码:
  1. <struts>  
  2.     <constant name="struts.devMode" value="true" />  
  3.     <constant name="struts.custom.i18n.resources" value="message"/>  
  4.   
  5.     <package name="helloworld"  extends="struts-default">  
  6.         <action name="i18nAction" class="cn.javass.i18n.I18NAction">  
  7.             <result>/i18n/result.jsp</result>  
  8.         </action>  
  9.     </package>  
  10. </struts>  

2:运行看看效果,此时的输出应该是

 

java代码:
  1. labela = labela in zh_CN with action  

3:把I18NAction_zh_CN.properties文件中的labela改个名称,不管改成什么,不是“labela”就行,然后重新启动服务器,再次运行,看看效果此时的输出应该是:

 

java代码:
  1. labela = labela in zh_CN with package  

4:把package_zh_CN.properties文件中的labela改个名称,不管改成什么,不是“labela”就行,然后重新启动服务器,再次运行,看看效果此时的输出应该是:

 

java代码:
  1. labela = labela in zh_CN  

 

私塾在线网站原创《研磨struts2》系列

转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4086.html

欢迎访问http://sishuok.com获取更多内容

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics