零基础学Struts
上QQ阅读APP看书,第一时间看更新

8.4 实现用户自行选择语言环境

许多网站都会提供一个语言选择下拉列表,让用户选择语言。当用户选择自己所需的语言环境后,整个Web应用都将采用该语言环境。通过Struts 2能够很方便地实现该功能。

8.4.1 新建下拉列表

许多网站都会提供一个语言选择下拉列表,让用户选择语言。利用Struts 2的国际化支持可以很容易地实现这一功能。首先新建语言环境选择页“select.jsp”,该页面包含一个下拉列表,代码如下所示。

        <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
        <%@ taglib prefix="s" uri="/struts-tags" %>
        <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        <html>
              <head>
                  <title><s:text name="title"/></title>
                  <script language="javascript">
                        function selectsubmit(){
                                    document.form1.submit();
                        }
                  </script>
              </head>
              <body>
                  <form action="select.action" method="post" name="form1">
                        <! -- 下拉列表   -->
                        <select name="languageSelect" onchange="selectsubmit(); ">
                              <! -- 选项1   -->
                              <option value="choose" selected="selected">
                                    <s:text name="form.choose"></s:text>
                              </option>
                              <! -- 选项2   -->
                              <option value="en_US">
                                    <s:text name="form.option1"></s:text>
                              </option>
                              <! -- 选项3   -->
                              <option value="zh_CN">
                                    <s:text name="form.option2"></s:text>
                              </option>
                              <! -- 选项4   -->
                              <option value="zh_TW">
                                    <s:text name="form.option3"></s:text>
                              </option>
                        </select>
                  </form>
                  <s:text name="message"></s:text>
              </body>
        </html>

8.4.2 新建全局资源文件

下拉列表中的选项显示文本是通过读取国际化资源文件来得到,所以必须提供国际化资源文件。这里选择中文简体、中文繁体、美国英语3种语言环境供用户选择,所以必须提供相应的国际化资源文件。

❑ 第一个资源文件:Resource_en_US.properties。

        form.choose = Please choose your language
        form.option1 = English
        form.option2 = Simplified_Chinese
        form.option3 = Traditional_Chinese
        message = Hello World!
        title = English

❑ 第二个资源文件:Resource_zh_CN.properties。

        form.choose =请选择语言的种类
    form.option1 =英文
    form.option2 =简体中文
    form.option3 =繁体中文
    message =你好世界
    title=中文页面

使用native2ascii命令来处理转换成Unicode编码。

    form.choose = \u8bf7\u9009\u62e9\u8bed\u8a00\u7684\u79cd\u7c7b
    form.option1 = \u82f1\u6587
    form.option2 = \u7b80\u4f53\u4e2d\u6587
    form.option3 = \u7e41\u4f53\u4e2d\u6587
    message = \u4f60\u597d\u4e16\u754c
    title=\u4e2d\u6587\u9875\u9762

❑ 第三个资源文件:Resource_zh_TW.properties。

    form.choose = 请选择语言的种类
    form.option1 =英文
    form.option2 =简体中文
    form.option3 =繁体中文
    message =你好世界
    title =繁体中文

使用native2ascii命令来处理转换成Unicode编码。

    form.choose =   \u8acb\u9078\u64c7\u8a9e\u8a00\u7684\u7a2e\u985e
    form.option1 = \u82f1\u6587
    form.option2 = \u7c21\u9ad4\u4e2d\u6587
    form.option3 = \u7e41\u9ad4\u4e2d\u6587
    message = \u4f60\u597d\u4e16\u754c
    title = \u7e41\u9ad4\u4e2d\u6587

8.4.3 新建及配置Action

新建Action,该Action对用户提交的选项值进行判断,根据判断结果设定语言环境,代码如下所示。

    package net.hncu.struts2.action;
    import java.util.Locale;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    public class SelectAction extends ActionSupport {
          private String languageSelect;
          public String getLanguageSelect() {
                return languageSelect;
          }
          public void setLanguageSelect(String languageSelect) {
                this.languageSelect = languageSelect;
          }
          public String execute() throws Exception {
                Locale locale = null;
                //判断用户选择的语言环境
                if("en_US".equals(languageSelect)) {
                              locale = Locale.US;
                        } else if("zh_CN".equals(languageSelect)){
                              locale = Locale.SIMPLIFIED_CHINESE;
                        } else if("zh_TW".equals(languageSelect)){
                              locale = Locale.TRADITIONAL_CHINESE;
                        }
                        //设置语言环境
                        ActionContext.getContext().setLocale(locale);
                        return SUCCESS;
                  }
            }

在“struts.xml”文件中配置该Action,以及定义处理结果与视图资源之间的关系。如果Action返回success,那么页面将跳转到语言选择页“select.jsp”。

        <? xml version="1.0" encoding="UTF-8" ? >
        <! DOCTYPE struts PUBLIC
            "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
            "http://struts.apache.org/dtds/struts-2.0.dtd">
        <! -- struts为配置文件根元素-->
        <struts>
              <! -- 定义资源文件baseName -->
              <constant name="struts.custom.i18n.resources" value="Resource"></constant>
              <package name="struts2" extends="struts-default">
                    <! -- 定义selectAction,其实现类为net.hncu.struts2.action.LanguageAction -->
                    <action name="select" class="net.hncu.struts2.action.SelectAction">
                          <! -- 定义处理结果与视图资源之间的关系-->
                          <result name="success">/select.jsp</result>
                    </action>
              </package>
        </struts>

8.4.4 测试用户自行选择的语言环境

打开浏览器,浏览语言环境选择页“select.jsp”,页面默认显示简体中文,如图8.15所示。

通过下拉列表选择语言环境为英文,这时语言环境被设置成美国英语,所以页面将显示为英文页面,如图8.16所示。

图8.15 页面默认显示为简体中文

图8.16 选择语言环境为英文

通过下拉列表选择语言环境为繁体中文,这时语言环境被设置成繁体中文,所以页面将显示为繁体中文页面,如图8.17所示。

图8.17 选择语言环境为繁体中文

8.4.5 在下拉列表中显示当前选择语言

上面这个示例成功地实现了用户自行选择语言环境这一功能,但是有一个地方还不够完善。每次选择完语言环境后,下拉列表都是显示“请选择语言的种类”这个选项。

下面就来实现在下拉列表中显示当前选中的语言。在下拉列表中要默认选择某项,只需设置其selected属性为selected即可。根据这一点,可以通过接受用户提交的参数来决定设置哪个选项被默认选择。

在JSP中接受参数以及判断都会有大量的JavaScriplet代码,可以使用Struts 2的<s:if>标签来进行判断,使用#parameters.×××来接受参数,修改代码如下所示。

        <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
        <%@ taglib prefix="s" uri="/struts-tags"%>
        <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        <html>
            <head>
                  <title><s:text name="title" /></title>
                  <script language="javascript">
                      function selectsubmit(){
                            if(document.all("languageSelect").value! ="choose"){
                                    document.form1.submit();
                            }
                      }
                  </script>
            </head>
            <body>
                  <form action="select.action" method="post" name="form1">
                      <select name="languageSelect" onchange="selectsubmit(); ">
                            <option value="choose">
                                    <s:text name="form.choose"></s:text>
                            </option>
                            <option value="en_US"
                            <s:if test="#parameters.languageSelect[0] == ' en_US' ">
                                    selected="selected"
                            </s:if>>
                                    <s:text name="form.option1"></s:text>
                            </option>
                            <option value="zh_CN"
                            <s:if test="#parameters.languageSelect[0] == ' zh_CN' ">
                                    selected="selected"
                            </s:if>>
                                    <s:text name="form.option2"></s:text>
                            </option>
                                <option value="zh_TW"
                                <s:if test="#parameters.languageSelect[0] == ' zh_TW' ">
                                        selected="selected"
                                </s:if>>
                                        <s:text name="form.option3"></s:text>
                                </option>
                          </select>
                    </form>
                    <s:text name="message"></s:text>
                </body>
            </html>

通过下拉列表选择语言环境为英文,这时语言环境被设置成美国英语,所以页面将显示为英文页面。同时在下拉列表中显示了当前选择的语言环境,如图8.18所示。

通过下拉列表选择语言环境为简体中文,这时语言环境被设置成简体中文,所以页面将显示为简体中文页面。同时在下拉列表中显示了当前选择的语言环境,如图8.19所示。

通过下拉列表选择语言环境为繁体中文,这时语言环境被设置成繁体中文,所以页面将显示为繁体中文页面。同时在下拉列表中显示了当前选择的语言环境,如图8.20所示。

图8.18 选择语言环境为英文

图8.19 选择语言环境为简体中文

图8.20 选择语言环境为繁体中文

8.4.6 使用Struts 2的i18n拦截器改写案例

前面是通过在Action中设置用户的默认语言从而实现用户自行选择语言功能的。但是这种方式是通过手动实现的,如果需要提供更多的语言选择,那么就必须在Action中进行更多的判断,代码就非常繁琐了。

这里可以自定义拦截器,这样可以在多个Action中使用了。这里无需手动自定义拦截器,因为Struts 2已经给提供了一个用于国际化的i18n拦截器。

        <interceptors>
                    ...
                    <interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
                    ...

i18n拦截器在执行Action之前,先查找请求参数中是否存在一个名为request_locale的参数。如果存在该参数,拦截器将其参数值转换成一个Locale对象,并将其设为默认的语言环境。

利用这一点可以修改下拉列表的name属性值为request_locale,并配置下拉列表中的选项的value为其对应的国家/语言代码,修改代码如下所示。

          <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
          <%@ taglib prefix="s" uri="/struts-tags"%>
          <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
                <head>
                    <title><s:text name="title" /></title>
                    <script language="javascript">
                          function selectsubmit(){
                                if(document.all("request_locale").value! ="choose"){
                                      document.form1.submit();
                                }
                          }
                    </script>
                </head>
                <body>
                    <form action="select.action" method="post" name="form1">
                          <select name="request_locale" onchange="selectsubmit(); ">
                                <option value="choose">
                                      <s:text name="form.choose"></s:text>
                                </option>
                                <option value="en_US"
                                      <s:if test="#parameters.languageSelect[0] == ' en_US' ">
                                      selected="selected"
                                </s:if>>
                                      <s:text name="form.option1"></s:text>
                                </option>
                                <option value="zh_CN"
                                      <s:if test="#parameters.languageSelect[0] == ' zh_CN' ">
                                      selected="selected"
                                </s:if>>
                                      <s:text name="form.option2"></s:text>
                                </option>
                                <option value="zh_TW"
                                      <s:if test="#parameters.languageSelect[0] == ' zh_TW' ">
                                      selected="selected"
                                </s:if>>
                                      <s:text name="form.option3"></s:text>
                                </option>
                          </select>
                    </form>
                    <s:text name="message"></s:text>
                </body>
          </html>

在“struts.xml”文件中配置用户语言选择请求,这里只用到了i18n拦截器而并没有使用Action,所以可以不用提供Action实现类。为了让所有的JSP页面都能得到Struts 2处理,可以使用通配符号来定义Action的name。定义其返回结果为/{1}.jsp,表示跳转到同路径下的同名的JSP页面,比如请求页面为“select.jsp”,那么处理完成后跳转的结果页面也是“select.jsp”。

        <? xml version="1.0" encoding="UTF-8" ? >
        <! DOCTYPE struts PUBLIC
            "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
            "http://struts.apache.org/dtds/struts-2.0.dtd">
        <! -- struts为配置文件根元素-->
        <struts>
              <! -- 定义资源文件baseName -->
              <constant name="struts.custom.i18n.resources" value="Resource"></constant>
              <package name="struts2" extends="struts-default">
                    <! -- 使用通配符号来定义Actionname -->
                    <action name=" * ">
                        <! -- 定义处理结果与视图资源之间的关系-->
                        <result>/{1}.jsp</result>
                    </action>
              </package>
        </struts>

打开浏览器,浏览语言环境选择页“select.jsp”。通过下拉列表选择语言环境为英文,这时语言环境被设置成美国英语,所以页面将显示为英文页面。同时在下拉列表中显示了当前选择的语言环境。

通过下拉列表选择语言环境为简体中文,这时语言环境被设置成简体中文,所以页面将显示为简体中文页面。同时在下拉列表中显示了当前选择的语言环境。

通过下拉列表选择语言环境为繁体中文,这时语言环境被设置成繁体中文,所以页面将显示为繁体中文页面。同时在下拉列表中显示了当前选择的语言环境。

通过测试可以看出,通过Sturts 2的i18n拦截器成功实现了用户自行选择语言环境功能。