Struts2国际化是建立在Java国际化的基础之上,一样也是通过提供不同国家/语言环境的消息资源,然后通过ResourceBundle加载指定Locale对应的资源文件,再取得该资源文件中指定key对应的消息——整个过程与Java程序的国家化完全相同,只是Struts2对Java程序国际化进一步封装,从而简化了应用程序的国际化。
Struts2中加载全局资源文件
通过在struts.xml或struts.properties中配置struts.custom.i18n.resources常量,该常量的值为全局国际化资源文件的baseName。
假设系统需要加载的国际化资源文件的baseName为messageResource,则我们可以在struts.properties文件中指定如下一行:
#指定Struts2国际化资源文件的baseName为messageResource
struts.custom.i18n.resources=messageResource
或者在struts.xml文件中配置如下的一个常量:
<!--
指定Struts2国际化资源文件的baseName为messageResource
-->
<constantname=”struts.custom.i18n.resources” value=”messageResource”/>
通过这种方式加载国际化资源文件后,Struts2应用就可以在所有地方取出这些国际化资源文件了,包括JSP页面和Action。
访问国际化消息
Struts2访问国际化消息有如下三种方式:
- 在JSP页面中输出国际化消息,使用Struts2的<s:text…/>标签,该标签可以指定一个name属性,该属性指定了国际化资源文件中的key。比如<s:text
name=”loginPage”/>。 - 为了在Action类中访问国际化消息,可以使用ActionSupport类的getText方法,该方法可以接受一个name参数,该参数指定了国际化资源文件中的key。比如:
ActionContext ctx = ActionContext.getContext();
Ctx.put(“tip”,getText(“succTip”));
- 为了在该表单元素的Label里输出国际化信息,可以为该表单标签指定一个key属性,该key指定了国际化资源文件中的key。比如:
<s:textfield name=”username” key=”user”/>
注意:
- 资源文件名:mess_en_US.properties,表明该国际化资源文件的baseName是mess,它是英国英语的资源文件。
- 第二种方式中,取出了国际化资源文件中key为succTip的信息,并将其设置成request范围的属性。通过这种方式,即使Action需要设置在下一个页面显示的信息,也无须直接设置字符串常量,而是使用国际化消息的key来输出,从而实现程序的国际化。
- 第三种方式,通过在表单元素textfield中指定key属性来输出国际化消息。
输出带占位符的国际化消息
占位符示例:
succTip={0},Welcome,youhas logged in!
welcomeMsg={0},Hello!Nowis {1}!
{0}、{1}就是占位符,程序运行中,可以填充占位符。
succTip=${username},欢迎,您已经登陆!
${username}直接将传入的username值填充。
Struts2中提供两种方式来填充消息字符串中占位符:
- 如果需要在JSP页面中填充国际化消息里的占位符,则可以通过在<s:text…/>标签中使用多个<s:param…/>标签来填充消息中的占位符。第一个<s:param…/>标签指定第一个占位符值,第二个<s:param…/>标签指定第二个占位符值…...比如:
<jsp:useBeanid="d" class="java.util.Date" scope="page"/>
<s:textname="welcomeMsg">
<s:param><s:propertyvalue="username"/></s:param>//第一个username参数
<s:param>${d}</s:param>//第二个时间参数
</s:text>
- 如果需要在Action中填充国际化消息里的占位符,则可以通过在调用getText方法时使用getText(String aTextName,List args)或getText(Stringkey,String[]
args)方法来填充占位符。该方法的第二个参数既可以是一个字符串数组,也可以是字符串组成的List对象,从而完成对占位符的填充。其中字符串数组、字符串集合中第一个元素将填充第一个占位符,字符串数组、字符串集合中第二个元素将填充第二个占位符……比如:ActionContextctx = ActionContext.getContext();
ctx.put("tip", getText("succTip" , new String[]{getUsername()}));
加载资源文件方式
包范围资源文件
为了更好地体现软件工程里“分而治之”的原则,Struts2允许针对不同模块、不同Action来组织国际化资源文件。
为Struts2应用指定包范围资源文件的方法是:在包的跟路径下建立多个文件名为package_language_country.properties的文件,一旦建立了这个系列的国际化资源文件,应用处于该包下的所有Action都可以访问该资源文件。
Action将优先使用包范围的资源文件。
Action范围资源文件
为Action单独指定国际化资源文件的方法是:在Action类文件所在的路径建立多个文件名为ActionName_language_country.properties的文件,一旦建立了这个系列的国际化资源文件,这系列资源文件只能由该Action来访问。
临时指定资源文件
还有一种临时指定资源文件的方式,可以在JSP页面中输出国际化消息时临时指定国际化资源的位置,在这种方式下,需要借助Struts2的另外一个标签:<s:i18n…/>。
如果把<s:i18n…/>标签作为<s:text…/>标签的父标签,则<s:text…/>标签将会直接加载<s:i18n…/>标签里指定的国际化资源文件;如果把<s:i18n…/>标签当成表单标签的父标签,则表单标签的key属性将会从国际化资源文件中加载该消息。