【原创】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>