不管你程序要不要进行国际化,都是都要做好国际化的打算,原因有二:
所以说,国际化是必不可少的知识点。在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中访问国际化消息主要有如下三种方式:
<s:text .../>
标签,该标签可以指定一个name属性,该属性指定了国际化资源文件中的key; ActionSupport
类的 getText
方法,该方法可以接受一个name参数,该参数指定了国际化资源文件中的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中提供了如下两种方式来填充消息字符串中的占位符:
<s:param .../>
标签指定第一个占位符值,第二个 <s:param .../>
标签指定第二个占位符值,以此类推; getText(String key, List args)
或 getText(String key, String[] args)
方法来填充占位符。 我们在资源文件中使用以下方式使用占位符:
failTip={0},对不起,您不能登陆! succTip={0},欢迎,您已经登陆!
这篇文章对Struts2中的国际化知识点进行了简单的总结,总体来说就是对知识片段的梳理,同时也是对开发人员提个醒儿:开发时一定要考虑到国际化的问题,即使程序将来不进行国际化,也要使用国际化的方式来管理资源文件。
果冻想,认真玩技术的地方。
2016年3月13日 于呼和浩特。