转载

Struts2学习之国际化

前言

不管你程序要不要进行国际化,都是都要做好国际化的打算,原因有二:

  1. 方便后期管理和国际化扩展
  2. 方便消息资源统一管理

所以说,国际化是必不可少的知识点。在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日 于呼和浩特。

原文  https://www.jellythink.com/archives/289
正文到此结束
Loading...