【原创】Struts2学习笔记之国际化

1. 在struts2中需要做国际化的有:

jsp页面的国际化,action错误信息的国际化,类型转换错误信息的国际化,输入校验错误信息的国际化


2. 访问国际化消息:

Struts2访问国际化消息主要有如下几种方式:
(1)JSP页面:使用<text>标签或者<i18n>标签

(2)Action类中:使用ActionSupport类的getText方法。

(3)输入校验xml文件中:使用<message>元素

(4)struts表单元素:使用key属性(注:此时表单的theme属性一定不能为simple)


3. 国际化资源文件命名规则是basename_languageCode_countryCode.properties,共有以下四类:

  1)全局资源文件:

  命名规则为basename_languageCode_countryCode.properties。其中basename是在struts.xml文件中用<constant>元素覆盖的struts.custom.i18n.resources所对应的值,具体配置如下:

<!-- struts.xml文件中指定basename -->
<constant name="struts.custom.i18n.resources" value="baseName"/>

上面的配置代码指定了WEB-INF\classes目录下的全局资源文件名字中的basename应该为“message”,例如message_zh_CN.properties或message_en_US.properties。

 

  2)包级别资源文件

  包级别的资源文件位于包目录下,命名规则是package_languageCode_countryCode.properties。注意,文件名中的package是固定不变的,而不是用相应的包名替换。一旦建立了包级别的国际化资源文件,处于该包下的所有Action都可以访问该资源文件。

 

  3)类级别资源文件

  也叫Action级别资源文件。类级别资源文件命名格式是ActionName_languageCode_countryCode.properties,其中ActionName是相应的动作类名。类级别资源文件应该与相关的Action类处于同一目录下。

 

  4)临时资源文件

  临时资源文件指以<i18n>标签中name属性的值为basename的资源文件,位于WEB-INF\classes目录下。


4. 加载资源文件的顺序
   对于Action中加载资源文件的情况,假设我们在某个ChildAction中调用了getText("user.title"),Struts 2.0的将会执行以下的操作:

   (1)优先加载系统中保存在ChildAction的类文件相同位置,且baseName为ChildAction的系列资源文件。 
   (2)如果在(1)中找不到指定key对应的消息,且ChildAction有父类ParentAction,则加载系统中保存在ParentAction的类文件相同位置,且baseName为ParentAction的系列资源文件。 
   (3)如果在(2)中找不到指定key对应的消息,且ChildAction有实现接口IChildAction,则加载系统中保存在IChildAction的类文件相同位置,且baseName为IChildAction的系列资源文件。 
   (4)如果在(3)中找不到指定key对应的消息,且ChildAction有实现接口ModelDriven(即使用模型驱动模式),则对于getModel()方法返回的model对象, 
   重新执行第(1)步操作。 
   (5)如果在(4)中找不到指定key对应的消息,则查找当前包下baseName为package的系列资源文件。 
   (6)如果在(5)中找不到指定key对应的消息,则沿着当前包上溯,直到最顶层包来查找baseName为package的系列资源文件。 
   (7)如果在(6)中找不到指定key对应的消息,则查找struts.custom.i18n.resources常量指定baseName的系列资源文件。 
   (8)如果经过上面的步骤一直找不到key对应的消息,将直接输出该key的字符串值。

  

   对于在JSP中访问国际化消息,情况则简单的多,这又可以分为两种形式:
   (1)如果<s:text.../>标签、表单标签使用了<s:i18n.../>标签作为父标签:

      a、从<s:i18n.../>标签的name属性指定basename的国际化资源文件中加载信息。
      b、如果在a中找不到指定key对应的消息,则查找struts.custom.i18n.resources常量指定baseName的全局资源文件。
      c、如果经过上面步骤一直找不到该key对应的消息,将直接输出该key的字符串值。

   (2)如果<s:text.../>标签、表单标签没有使用<s:i18n.../>标签作为父标签:
      直接在struts.custom.i18n.resources常量指定baseName的全局资源文件中查找。如果找不到该key对应的消息,将直接输出该key的字符串值。

5. struts表单中使用key属性获取国际化信息时,也可以在label属性中调用getText(“key”)方法。例如,下面的<s:password>标签使用了key属性来获取国际化信息:

<s:password name="password" key="password"></s:password>

这与下面的做法完全等价:

<s:password name="password" label="%{getText('password')}" ></s:password>

 

posted @ 2011-01-16 13:14  弱水流觞  阅读(692)  评论(0编辑  收藏  举报