struts2之消息处理与国际化

 

概述

在程序设计领域,把在无需改写源代码即可让开发出来的应用程序能够支持多种语言和数据格式的技术称为国际化。

与国际化对应的是本地化,指让一个具备国际化支持的应用程序支持某个特定的地区。

Struts2 国际化是建立在 Java 国际化基础上的:

1. 为不同国家/语言提供对应的消息资源文件

2. Struts2 框架会根据请求中包含的<s:text name="submit"></s:text>

3. Locale 加载对应的资源文件

4. 通过程序代码取得该资源文件中指定 key 对应的消息

配置国际化资源文件

方法一:Action范围资源文件:

在Action类文件所在的路径建立名为ActionName_language_country.properties 的文件

方法二:包范围资源文件:

在包的根路径下建立文件名为package_language_country.properties 的属性文件,一旦建立,处于该包下的所有 Action 都可以访问该资源文件。注意:包范围资源文件的 baseName 就是package,不是Action所在的包名。

方法三:全局资源文件

命名方式: basename_language_country.properties

在struts.xml文件中配置:<constant name="struts.custom.i18n.resources" value="baseName"/>

或在struts.properties文件中配置:struts.properties struts.custom.i18n.resources=baseName

方法四:临时指定资源文件:

<s:i18n.../> 标签的 name 属性指定临时的国际化资源文件

加载资源文件的顺序

假设我们在某个 ChildAction 中调用了getText("submit"):

(1)加载和 ChildAction 的类文件在同一个包下的系列资源文件 ChildAction.properties

(2)加载  ChildAction 实现的接口 IChild,且和 IChildn 在同一个包下 IChild.properties 系列资源文件。

(3)加载 ChildAction 父类 Parent,且和 Parent 在同一个包下的 baseName 为 Parent.properties 系列资源文件。

(4) 若 ChildAction 实现 ModelDriven 接口,则对于getModel()方法返回的model 对象,重新执行第(1)步操作。

(5) 查找当前包下 package.properties 系列资源文件。

(6) 沿着当前包上溯,直到最顶层包来查找 package.properties 的系列资源文件。

(7) 查找 struts.custom.i18n.resources 常量指定 baseName 的系列资源文件。

(8) 直接输出该key的字符串值。

访问国际化消息

方式一:JSP 页面访问国际化消息:

a)不带占位符:

<s:text name="key"/>

表单元素的 label 属性:可替换为 key 或使用 getText() 方法,并对其进行强制 OGNL 解析

b)带占位符:

在 <s:text.../> 标签中使用多个 <s:param.../> 标签来填充消息中的占位符。

Struts2 直接在国际化消息资源文件中通过 “${}” 使用表达式,该表达式将从值栈中获取对应的属性值

方式二:Action 访问国际化消息:

若 Action 类继承了 ActionSupport ,则可调用 TextProvider 接口的 getText 方法。

利用超链接实现动态加载国际化资源文件

a) Struts2 使用 i18n 拦截器 处理国际化,并且将其注册在默认的拦截器中

b) i18n拦截器在执行Action方法前,自动查找请求中一个名为request_locale 的参数。如果该参数存在,拦截器就将其作为参数,转换成Locale对象,并将其设为用户默认的Locale(代表国家/语言环境)。并把其设置为 session 的 WW_TRANS_I18N_LOCALE 属性

c) 若 request 没有名为request_locale 的参数,则 i18n 拦截器会从 Session 中获取 WW_TRANS_I18N_LOCALE 的属性值,若该值不为空,则将该属性值设置为浏览者的默认Locale 

d) 若 session 中的 WW_TRANS_I18N_LOCALE 的属性值为空,则从 ActionContext 中获取 Locale 对象。

I18N 拦截器确定Locale对象流程分析



 

 

 

猜你喜欢

转载自ihuning.iteye.com/blog/2235301