struts2国际化详解.docx
《struts2国际化详解.docx》由会员分享,可在线阅读,更多相关《struts2国际化详解.docx(9页珍藏版)》请在冰豆网上搜索。
struts2国际化详解
准备资源文件,资源文件的命名格式如下:
baseName_language_country.properties
baseName_language.properties
baseName.properties
其中baseName是资源文件的基本名,我们可以自定义,但language和country必须是java支持的语言和国家。
如:
中国大陆:
baseName_zh_CN.properties
美国:
baseName_en_US.properties
现在为应用添加两个资源文件:
第一个存放中文:
itcast_zh_CN.properties
内容为:
welcome=欢迎来到传智播客
第二个存放英语(美国):
itcast_en_US.properties
内容为:
welcome=welcometoitcast
对于中文的属性文件,我们编写好后,应该使用jdk提供的native2ascii命令把文件转换为unicode编码的文件。
命令的使用方式如下:
native2ascii源文件.properties目标文件.properties
配置全局资源与输出国际化信息
当准备好资源文件之后,我们可以在struts.xml中通过struts.custom.i18n.resources常量把资源文件定义为全局资源文件,如下:
itcast为资源文件的基本名。
后面我们就可以在页面或在action中访问国际化信息:
在JSP页面中使用textname=“”/>标签输出国际化信息:
textname=“user”/>,name为资源文件中的key
在Action类中,可以继承ActionSupport,使用getText()方法得到国际化信息,该方法的第一个参数用于指定资源文件中的key。
在表单标签中,通过key属性指定资源文件中的key,如:
textfieldname="realname"key="user"/>
国际化—输出带占位符的国际化信息
资源文件中的内容如下:
welcome={0},欢迎来到传智播客{1}
在jsp页面中输出带占位符的国际化信息
textname="welcome">
param>propertyvalue="realname"/>
param>
param>学习
param>
text>
在Action类中获取带占位符的国际化信息,可以使用getText(Stringkey,String[]args)或getText(StringaTextName,Listargs)方法。
国际化—包范围资源文件
在一个大型应用中,整个应用有大量的内容需要实现国际化,如果我们把国际化的内容都放置在全局资源属性文件中,显然会导致资源文件变的过于庞大、臃肿,不便于维护,这个时候我们可以针对不同模块,使用包范围来组织国际化文件。
方法如下:
在java的包下放置package_language_country.properties资源文件,package为固定写法,处于该包及子包下的action都可以访问该资源。
当查找指定key的消息时,系统会先从package资源文件查找,当找不到对应的key时,才会从常量struts.custom.i18n.resources指定的资源文件中寻找。
国际化—Action范围资源文件
我们也可以为某个action单独指定资源文件,方法如下:
在Action类所在的路径,放置ActionClassName_language_country.properties资源文件,ActionClassName为action类的简单名称。
当查找指定key的消息时,系统会先从ActionClassName_language_country.properties资源文件查找,如果没有找到对应的key,然后沿着当前包往上查找基本名为package的资源文件,一直找到最顶层包。
如果还没有找到对应的key,最后会从常量struts.custom.i18n.resources指定的资源文件中寻找。
国际化—JSP中直接访问某个资源文件
struts2为我们提供了i18n>标签,使用i18n>标签我们可以在类路径下直接从某个资源文件中获取国际化数据,而无需任何配置:
i18nname="itcast">
textname=“welcome”/>
i18n>
Itcast为类路径下资源文件的基本名。
如果要访问的资源文件在类路径的某个包下,可以这样访问:
i18nname=“cn/itcast/action/package">
textname="welcome">
param>小张
param>
text>
i18n>
上面访问cn.itcast.action包下基本名为package的资源文件。
Struts2的国际化
资源文件的命名:
basename_language_country.properties
JAVA国际化
如果系统同时存在资源文件、类文件,系统将以类文件为主,而不会调用资源文件。
对于简体中文的Locale,ResourceBundle搜索资源的顺序是:
(1)baseName_zh_CN.class
(2)baseName_zh_CN.properties
(3)baseName_zh.class
(4)baseName_zh.properties
(5)baseName.class
(6)baseName.properties
Struts2的国际化入门
Struts2国际化是建立在Java国际化的基础上的,一样是通过提供不同国家/语言环境的消息资源,然后通过ResourceBundle
加载指定Locale对应的资源文件,再取得该资源文件中指定key对应的消息--整个过程与JAVA程序的国家化完全相同,只是
Struts2框架对JAVA程序国际化进行了进一步封装,从而简化了应用程序的国际化。
Struts2需要国际化的部分
类型转换:
数据校验:
验证框架xml配置文件的国际化:
RegisterAction-validation.xml文件
JSP页面的国际化:
textname="addUser"/>
Action的国际化:
利用ActionSupport类提供的getText()方法.
Struts2中加载全局资源文件
struts.xml
或
struts.properties
struts.custom.i18n.resources=baseName
访问国际化消息
Struts2访问国际化消息主要有如下三种方式:
(1)JSP页面:
textname="key"/>
(2)Action类中:
使用ActionSupport类的getText方法。
(3)表单元素的Label里:
为表单元素指定一个key属性
输出带占位符的国际化消息
Struts2中提供了如下两种方式来填充消息字符串中的占位符
(1)JSP页面,在text.../>标签中使用多个param.../>标签来填充消息中的占位符。
(2)Action中,在调用getText方法时使用getText(StringaTextName,Listargs)或getText(Stringkey,String[]args)方法来填充占位符。
除此之外,Struts2还提供了对占位符的一种替代方式,这种方式允许在国际化消息资源文件中使用表达式,对于这种方式,则可避免在使用国际化消息时还需要为占位符传入参数
值。
如下在消息资源中使用表达式
succTip=${username},欢迎,您已经登录!
在上面的消息资源中,通过使用表达式,可以从ValueStack中取出该username属性值,自动填充到该消息资源中。
加载资源文件的方式
(1)加载全局资源文件:
(2)包范围资源文件:
为Struts2指定包范围资源文件的方法是,在包的根路径下建立多个文件名为package_language_country.properties的文件,一旦建立了
这个系列的国际化资源文件,应用中处于该包下的所有Action都可以访问该资源文件。
需要注意的是上面的包范围资源文件的baseName就是package,不是Action所在的包名。
(3)Action范围资源文件:
在Action类文件所在的路径建立多个文件名为ActionName_language_country.properties的文件。
(4)临时指定资源文件:
i18n.../>标签的name属性指定临时的国际化资源文件
加载资源文件的顺序
Action中加载资源文件,假设我们在某个ChildAction中调用了getText("user.title"),Struts2.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)对于使用i18n.../>标签作为父标签的text.../>标签、表单标签的形式:
a、将从i18n.../>标签指定的国际化资源文件中加载指定key对应的消息。
b、如果在a中找不到指定key对应的消息,则查找struts.custom.i18n.resources常量指定baseName