前言
不管你程序要不要进行国际化,都是都要做好国际化的打算,原因有二:
- 方便后期管理和国际化扩展
- 方便消息资源统一管理
所以说,国际化是必不可少的知识点。在Struts2中,它的国际化是建立在Java国际化的基础之上,一样也是通过提供不同国家/语言环境的消息资源,然后通过ResourceBundle加载指定Locale对应的资源文件,再取得该资源文件中指定key对应的消息,整个过程与Java程序的国际化完全相同,只是Struts2框架对Java程序国际化进行了进一步的封装,从而简化了应用程序的国际化。这篇文章就将总结如何对Struts2程序进行国际化。
加载全局资源文件
对于国际化,我们需要指定国际化资源文件,程序通过加载资源文件,访问资源文件中的资源内容,从而完成国际化。于此,我们就需要在struts.xml文件中配置资源文件的baseName:
<constant name="struts.custom.i18n.resources" value="messageResources" />
通过这种方式指定、加载国际化资源文件后,Struts2应用就可以在所有地方取出这些国际化资源文件了,包括JSP页面和Action。下面说说具体怎么访问资源文件。
访问国际化消息
不管是JSP页面,还是Action类中,都可以输出国际化消息。对于此,Struts2都提供非常简单的支持。在Struts2中访问国际化消息主要有如下三种方式:
- 为了在JSP页面中输出国际化消息,可以使用Struts2的
<s:text .../>
标签,该标签可以指定一个name属性,该属性指定了国际化资源文件中的key; - 为了在Action类中访问国际化消息,可以使用
ActionSupport
类的getText
方法,该方法可以接受一个name参数,该参数指定了国际化资源文件中的key; - 为了在表单元素的Label里输出国际化信息,可以为该表单标签指定一个key属性,该key指定了国际化资源文件中的key。
对于资源文件,它里面的内容是以key-value的键值对的形式,例如以下形式:
loginPage=登陆页面
errorPage=错误页面
succPage=成功页面
failTip=对不起,您不能登陆!
succTip=欢迎,您已经登陆!
user=用户名
pass=密 码
login=登陆
对于包含非西欧字符的国际化资源文件必须使用native2ascii工具进行处理,但是我们在Eclipse中新建一个名为mess_zh_CN.properties
,Eclipse会自动进行处理。命名为mess_zh_CN.properties
表明这是简体中文的资源文件,将该文件保存在WEB-INF/classes
路径下,当通过浏览器进行访问时,系统会根据浏览者所在的Locale来加载对应的语言资源文件。下面还是对之前的登陆Demo程序进行改造:
<s:form action="login">
<s:textfield name="userName" key="user" />
<s:password name="password" key="pass" />
<s:submit key="login"></s:submit>
</s:form>
指定了key以后,运行程序时,就会根据指定的key值,显示对应的资源文件。而如果要在Action中访问国际化消息,则需要调用ActionSupport类的getText方法,例如:
public String execute() throws Exception
{
ActionContext ac = ActionContext.getContext();
if (getUserName().equals("jelly")
&& getPassword().equals("123456"))
{
ac.getSession().put("User", getUserName());
ac.put("tip", getText("succTip")); // 使用getText方法访问资源文件
return SUCCESS;
}
else
{
ac.put("tip", getText("failTip"));
return ERROR;
}
}
输出带占位符的国际化消息
做过国际化程序的伙计应该知道,国际化消息可能包括占位符,这些占位符必须使用参数来填充。在Java程序的国际化中,我们可以使用MessageFormat类来完成填充这些占位符。而Struts2则提供了更简单的方式来填充占位符,Struts2中提供了如下两种方式来填充消息字符串中的占位符:
- 如果需要在JSP页面中填充国际化消息里的占位符。第一个
<s:param .../>
标签指定第一个占位符值,第二个<s:param .../>
标签指定第二个占位符值,以此类推; - 如果需要在Action中填充国际化消息里的占位符,则可以通过在调用getText方法时使用
getText(String key, List args)
或getText(String key, String[] args)
方法来填充占位符。
我们在资源文件中使用以下方式使用占位符:
failTip={0},对不起,您不能登陆!
succTip={0},欢迎,您已经登陆!
总结
这篇文章对Struts2中的国际化知识点进行了简单的总结,总体来说就是对知识片段的梳理,同时也是对开发人员提个醒儿:开发时一定要考虑到国际化的问题,即使程序将来不进行国际化,也要使用国际化的方式来管理资源文件。
果冻想,认真玩技术的地方。
2016年3月13日 于呼和浩特。