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

8.2 JSP页面国际化

实现JSP页面国际化非常简单,只需添加并配置相应的国际化资源文件,并在JSP页面中通过text标签指定相应的Key值就能国际化信息。

8.2.1 通过加载全局资源文件完成国际化

下面来简单回顾JSP页面国际化的实现,这需要通过Struts 2标签库中的text标签来实现。

将前面的那两个资源文件拷贝到Web应用的WEB-INF/classes目录下。新建JSP页面,该页面通过<s:text>输出国际化消息,代码如下所示。

        <%@ page language="java" pageEncoding="gb2312"%>
        <%@ taglib prefix="s" uri="/struts-tags"%>
        <html>
              <head>
                  <title>JSP页面国际化</title>
              </head>
              <body>
                  <center>
                        <! -- 输出国际化信息 -->
                        <s:text name="message.welcome"></s:text>
                  </center>
              </body>
        </html>

新建“struts.xml”文件,添加常量用来定义全局资源文件baseName,代码如下所示。

        <? 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="hello"></constant>
        </struts>

打开浏览器,运行JSP页面,页面输出中文的欢迎信息,如图8.2所示。

只需修改浏览器的语言环境,设置其语言环境为美国英语就可以输出英文的欢迎信息。修改浏览器的语言环境后,刷新该页面,页面输出英文的欢迎信息,如图8.3所示。

图8.2 页面输出中文的欢迎信息

图8.3 页面输出英文的欢迎信息

下面来看如何在JSP页面中输出带占位符的消息。首先修改资源文件的baseName,使用包含占位符的那两个资源文件,如下所示。

        <! -- struts为配置文件根元素-->
        <struts>
              <! -- 定义资源文件baseName -->
              <constant name="struts.custom.i18n.resources" value="hello02"></constant>
        </struts>

通过在<s:text>标签中添加<s:param>来传递参数,从而为占位符赋值,代码如下所示。

        <! -- 输出国际化信息 -->
              <s:text name="message.welcome">
                    <s:param>xiaoqiang</s:param>
              </s:text>

打开浏览器,运行JSP页面,页面输出中文的欢迎信息,如图8.4所示。

注意

输出中文的欢迎信息是因为已经提前将浏览器的语言环境设置回了中文语言环境。

修改浏览器的语言环境,设置其语言环境为美国英语。刷新该页面,页面输出英文的欢迎信息,如图8.5所示。

图8.4 页面输出中文的欢迎信息

8.2.2 临时指定资源文件完成国际化

图8.5 页面输出英文的欢迎信息

前面示例通过在“struts.xml”文件中配置全局资源文件的baseName,这样的资源文件在每个JSP文件中都可以使用。那如何才能使得资源文件不通过“struts.xml”配置,同样能被JSP页面调用呢?

为了能够对比全局资源文件和临时资源文件的加载顺序,这里选择新建两个资源文件,同样保存在Web应用的WEB-INF/classes目录下。

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

        message.welcome = temp:Welcome come to beijing Olympic Games {0}

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

        message.welcome = 临时资源文件:北京奥运欢迎你{0}

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

        message.welcome = \u4E34\u65F6\u8D44\u6E90\u6587\u4EF6:\u5317\u4EAC\u5965\u8FD0\u6B22\u8FCE\u4F60 {0}

修改JSP页面,添加<s:i18n/>标签作为<s:text/>的父标签,并指定临时资源文件的baseName,代码如下所示。

        <%@ page language="java" pageEncoding="gb2312"%>
        <%@ taglib prefix="s" uri="/struts-tags"%>
        <html>
            <head>
                  <title>JSP页面国际化</title>
            </head>
            <body>
                  <center>
                      <s:i18n name="temp">
                            <! -- 输出国际化信息 -->
                            <s:text name="message.welcome">
                                  <s:param>xiaoqiang</s:param>
                            </s:text>
                      </s:i18n>
                  </center>
            </body>
        </html>

打开浏览器,运行JSP页面,页面输出中文的临时资源文件中的欢迎信息,如图8.6所示。

修改浏览器的语言环境,设置其语言环境为美国英语。刷新该页面,页面输出英文的临时资源文件中的欢迎信息,如图8.7所示。

图8.6 页面输出中文的欢迎信息

图8.7 页面输出英文的欢迎信息

8.2.3 加载资源文件顺序

通过前面这个示例运行的结果,能分辨出全局资源文件和临时资源文件的加载顺序吗?

前面这个示例中,同时定义了全局资源文件和临时资源文件,而且其key值完全相同。但是最后输出的是临时资源文件中的信息,可想而知肯定是临时资源文件先加载。

下面是加载文件顺序规则。

❑ 如果使用了<s:i18n/>指定资源文件,则先从<s:i18N />标签中指定的国际化资源文件中查找指定key对应的value值。如果没有找到指定的key对应的value值,则查找全局国家化资源文件中该key对应的value值。如果仍没找到指定的key对应的value值,则直接输出key值。

❑ 如果没有使用<s:i18n/>指定资源文件,则直接查找全局国家化资源文件中该key对应的value值。如果没找到指定的key对应的value值,则直接输出key值。