4.5 Struts 2的国际化与应用案例

国际化是指应用程序运行时,可根据客户端请求来自的国家/地区、语言的不同而显示不同的界面。常用i18n作为“国际化”的简称,Struts 2框架通过资源文件的方式来实现国际化。使用国际化,首先需要建立不同语言的资源文件,并把中文符转化为Unicode代码,然后在struts.xml配置文件中配置资源文件。

4.5.1 资源文件

语言资源文件内容是由一组key-value对组成的。其格式如下。

    loginName=用户名称
    loginPassword=用户密码

针对不同的语言环境,需要定义不同的资源文件。资源文件放在“源包”(src)下,全局资源文件的命名可以有以下3种形式。

● 资源文件名_语言种类编码_国家编码.properties。

● 资源文件名_语言种类编码.properties。

● 资源文件名.properties。

资源文件如果使用第3种命名方式,即缺省语言代码,若系统找不到与客户端请求的语言环境相匹配的资源文件,则系统使用该默认的属性文件。

例4-7】假设对登录系统进行国际化处理,根据不同的语言环境显示英文和中文用户界面。创建英文和中文版本的资源文件,分别取名为globalMessages_zh_CN.properties和globalMessages_en_US.properties。

提示:对于中文资源文件内容,需要将中文字符转化为Unicode编码。在Eclipse开发环境中,自动进行转换。若使用其他开发工具,根据其特点,选取相应的方法。

1)建立中文版资源文件:globalMessages_zh_CN.properties,代码如下。

    title=登录页面
    username=姓名
    password=密码
    submit=登录
    reset=重置
    message.success=你已成功登录。现进入了主页。
    message.failure=你登录失败。现进入注册页面,请注册你的信息。

2)建立英文版资源文件:globalMessages_en_US.properties,代码如下。

    title = Login Page
    username = Input your username
    password = Input your password
    submit = Submit
    reset = Reset
    message.success = you're successful to login in. Now you've entered the main page.
    message.failure = you fail to login in. You need register your information.

4.5.2 资源文件的访问

编写完国际化资源文件后,需要在struts.xml文件中配置国际化资源文件的名称(或者在struts.properties属性文件内直接设置资源文件),从而使Struts 2的i18n拦截器在加载国际化资源文件时能找到这些国际化资源文件。

1.资源文件的配置

在struts.xml中,需要使用Struts 2的i18n拦截器,通过constant元素配置常量,指定国际资源文件名称,value的值就是常量值,即国际化资源文件的名称,配置格式如下。

2.访问资源文件

当建立资源文件并配置后,就可以在Web应用程序中引用这些资源文件。但不同的Web技术(JSP、Struts 2中的Action、XML)其引用方法不同。

1)JSP页面上使用国际化资源。

JSP页面上使用国际化资源,一般使用<s:text>标签,直接显示资源文件内的属性值。另外,在表单中要注意以下两种情况。

● 表单不使用theme主题,即表单的theme属性不能设置为simple,此时使用表单标签的key属性。例如,【例4-7】给出登录页面的设计,其代码如下。

    <s:form action="">
        <s:textfield name="username" key="username"></s:textfield>
        <s:password name="password" key="password"></s:password>
        <s:submit key="submit"></s:submit>
    </s:form>

● 表单使用theme主题,即表单的theme属性若设置为simple,则表单标签的key属性不起作用,此时,需要使用<s:text>标签添加提示信息。例如,【例4-7】登录页面也可以给出如下的等价设计,其代码如下。

    <s:form action="" theme="simple">
        <s:text name="username"/>:<s:textfield name="username"></s:textfield><br>
        <s:text name="password"/>:<s:password name="password"> </s:password><br>
        <s:submit key="submit"></s:submit>
    </s:form>

2)Action访问国际化资源文件,通过getText(String key)方法获取资源信息。注意:采用该方式,Action必须继承ActionSupport。

例如,在【例4-7】中给出如下Action的定义,并配置Action。

    package com.edu.i18n.action;
    import com.opensymphony.xwork2.ActionSupport;
    public class TestI18nAction extends ActionSupport {
        public String execute() throws Exception {
            //在Action中访问国际化资源文件的value值,这里是"username"
            String username = getText("username");
            System.out.println(username);
            return SUCCESS;
        }
    }

配置Action和资源文件,代码如下。

    <struts>
        <constant name="struts.custom.i18n.resources" value="globalMessages"></constant>
        <package name="default" namespace="/" extends="struts-default">
            <action name="testI18n" class="com.edu.i18n.action.TestI18nAction">
                <result>/i18n.jsp</result>
            </action>
        </package>
    </struts>

当运行该Action时,在控制台上输出username对应的“国际化信息”。

3)利用超链接实现动态加载国际化资源文件——直接进入所需要的语言页面。

在超链接的后面附着request_locale的请求参数,其参数值为“语言国家代码”。注意:超链接必须是一个Struts 2的Action请求。例如,对于前面给出的Action:testI18n,利用超链接直接加载国际化资源,从而按规定的语言显示页面。

    <a href="testI18n.action? request_locale=en_US">按英文显示页面</a>
    <a href="testI18n.action? request_locale=zh_CN">按中文显示页面</a>

4.5.3 Struts 2的国际化应用案例

例4-8】在【例4-7】已经给出的资源文件基础上,设计具有“中英文”的登录系统。

【分析】对于登录系统的业务流程,在前面的一些案例中已经介绍过,请参考。

【设计】该系统需要设计的组件有以下几个。

1)两个页面:登录页面login.jsp和成功登录页面loginsuccess.jsp。

2)两个资源文件:支持英文登录和支持中文登录的资源文件。

3)登录验证的控制器LoginAction类。该控制器的业务逻辑是:如果验证成功,则跳转到loginsuccess.jsp页面;如果验证不成功,则重新返回到登录页面(login.jsp)。

【实现过程】

1)建立工程c4_i18n,并在web.xml中配置核心控制器。

2)编写国际化资源文件。见【例4-7】给出的资源文件。

3)编写视图组件输出国际化消息。

● 中英文登录页面(login.jsp)的代码如下。

    <html> <head><title><s:text name="title" /></title></head>
      <body>
        <s:form action="checkLogin" method="post">
            <s:textfield name="name" key="username" size="20" />
            <s:password name="password" key="password" size="22" />
            <s:submit key="submit" />
        </s:form>
      </body>
    </html>

● 登录成功页面(loginSuccess.jsp)的代码如下。

    <html> <head> <title> <s:text name="message.success"/></title> </head>
        <body>
          <s:text name="username"/>:<s:property value="name"/><br>
          <s:text name="password"/>:<s:property value="password"/>
        </body>
        <br><a href="login.jsp"> <s:property value="tip"/></a>
    </html>

4)编写控制器Action, login.jsp对应的业务控制器LoginAction类,代码如下。

    package com.edu.i18n.action;
    //省略了import;
    public class LoginAction extends ActionSupport {
        private String name;
        private String password;
        private String tip; //用于存放标题信息
        //省略了属性的setter/getter方法
        public String execute() throws Exception{
            if(getName().equals("QQ")&&getPassword().equals("123") ){
                ActionContext.getContext().getSession().put("name", getName());
                tip=getText("title");
                return "success";
            }else{ return "error"; }
        }
    }

5)在struts.xml中配置Action与国际资源文件,配置内容如下。

    <struts>
        <constant name="struts.custom.i18n.resources" value="globalMessages" />
        <constant name="struts.i18n.encoding" value="UTF-8" />
        <package name="I18N" extends="struts-default">
          <action name="checkLogin" class="loginAction.LoginAction">
              <result name="success">/loginSuccess.jsp</result>
              <result name="error">/login.jsp</result>
          </action>
      </package>
    </struts>

6)项目部署和运行。

项目部署后运行,如果操作系统是在中文系统下,运行login.jsp页面,将出现中文提示信息的运行页面;如果使用的是英文操作系统或者通过设置浏览器语言,运行时将出现英文登录页面。在中文情况下的运行界面如图4-7所示。

图4-7 【例4-8】的运行界面

a) 登录页面b) 显示登录成功页面