zoukankan      html  css  js  c++  java
  • Struts 2(七):国际化

    基于Struts 2的Web应用国际化开发非常简单,其中Struts 2的国际化包括如下几部分:校验提示信息国际化、类型转换提示信息国际化、Action信息国际化以及JSP页面国际化。

    第一节 JSP页面国际化

    要实现JSP页面国际化,首先需要添加并配置相应的国际化资源文件,然后在JSP页面中通过指定Text标签的name属性为相应的Key值从而实现国际化。JSP页面国际化有两种方式:一种是加载全局资源文件完成国际化,另一种是指定临时资源文件完成国际化;下面将分别介绍这两种方式的国际化操作

    1.1 加载全局资源文件完成国际化

    在一般情况下,可以将国际化信息放到国际化资源文件中,然后在struts.xml文件中配置该资源文件为全局的,这样就可以在JSP文件中很方便的访问到该资源文件,从而实现JSP页面国际化。

    下面首先来添加一份中文资源文件jspInterResource_zh_CN.properties,其代码如下所示:

    welcomeMessage=u5927u5BB6u597DuFF01

    再添加一份英文资源文件jspInterResource_en_US.properties,其代码如下所示:

    welcomeMessage=Hello,everyone!

    打开struts.xml配置文件,在struts根节点下添加一个常量节点constant用来配置全局资源文件,其代码如下所示:

    <constant name="struts.custom.i18n.resources" value="jspInterResource"></constant>

    下面这段代码主要演示如何通过Struts 2标签库中的Text标签输出国际化信息:

    <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
    <%@ taglib prefix="s" uri="/struts-tags"%>
    <html>
    <head><title>欢迎信息</title></head>
    <body>
        <s:text name="welcomeMessage"></s:text><!--输出国际化资源文件!-->
    </body>
    </html>

    解说:上述代码中添加了一个<s:text>标签,该标签的name属性为"welcomeMessage",表示用来输出国际化资源文件中Key为"welcomeMessage"的信息。

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

    前面的示例在struts.xml文件中配置全局资源文件,这样的资源文件在每个JSP文件中都可以使用。那如何才能使得资源文件不通过struts.xml文件配置,同样能被JSP页面调用呢?可以在需要调用国际化资源文件的JSP页面中通过<s:i18n >标签来指定临时资源文件,这样就可以通过指定Key值来找到国际化信息了。

    下面这段代码主要演示如何通过Struts 2标签库中的Text标签结合i18n标签输出临时资源文件中的国际化信息:

    <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
    <%@ taglib prefix="s" uri="/struts-tags"%>
    <html>
    <head><title>欢迎信息</title></head>
    <body>
        <s:i18n name="jspInterResource"><!--指定临时资源文件名-->
            <s:text name="welcomeMessage"></s:text><!--输出国际化资源文件!-->
        </s:i18n>    
    </body>
    </html>

    解说:上述代码添加了一个i18n标签,通过其name属性来设置资源文件名,该资源文件只在i18n标签内部才有用,离开该标签就无法使用了。

    1.3 为资源文件传递参数

    可以在Text标签中添加一个<s:param>标签来来传递参数给资源文件。资源文件则可以通过占位符的形式来接受参数值。

    首先修改中文资源文件jspInterResource_zh_CN.properties,为资源文件添加占位符,其代码如下所示:

    welcomeMessage={0}uFF0Cu4F60u597DuFF01

    再修改英文资源文件jspInterResource_en_US.properties,其代码如下所示:

    welcomeMessage=Hello,{0}!

    下面这段代码主要演示如何通过Struts 2标签库中的param标签来传递参数:

    <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
    <%@ taglib prefix="s" uri="/struts-tags"%>
    <html>
    <head><title>欢迎信息</title></head>
    <body>
        <s:i18n name="jspInterResource"><!--指定临时资源文件名-->
            <s:text name="welcomeMessage"><!--输出国际化资源文件!-->
                <s:param>James</s:param><!-- 传递参数 -->
            </s:text>
        </s:i18n>    
    </body>
    </html>

    解说:上述代码通过<s:param>标签传递参数,其参数值为James

    1.4 资源文件加载顺序

    前面介绍了两种JSP完成国际化的方式,一种是通过全局资源文件,一种是通过临时资源文件。那到底它们之间的加载顺序是如何的呢?

    下面来介绍资源文件加载顺序,其规则如下:

    (1)如果使用了<s:i18n/>指定了临时资源文件,则先从临时资源文件中查找指定key对应的value值。

    (2)如果在临时资源文件中没有找到指定的key对应的value值,则查找全局资源文件中该key对应的value值。

    (3)如果在全局资源文件中仍没找到指定的key对应的value值,则直接输出key值。

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

    第二节 Action国际化

    Struts 2中的Action可以通过指定全局资源文件、包范围资源文件、Action范围资源文件这三种方式实现国际化。

    2.1 加载全局资源文件完成国际化

    Action可以通过加载全局资源文件的方式获得国际化信息从而完成国际化,全局文件必须存放地址在项目的WEB-INF/classes目录下。

    首先来添加一份中文资源文件GlobalInterResource_zh_ CN.properties,其代码如下所示:

    ActionMessage=u5168u5C40u8303u56F4-u6B22u8FCEu4FE1u606F

    再添加一份英文资源文件GlobalInterResource_en_US.properties,其代码如下所示:

    ActionMessage=Global-WelcomeMessage

    打开struts.xml配置文件,在struts根节点下添加一个常量节点constant用来配置全局资源文件,其代码如下所示:

    <constant name="struts.custom.i18n.resources" value="GlobalInterResource"></constant>

    配置完全局的资源文件,就可以在Action中通过getText方法来取得国际化信息了,getText方法是在ActionSupport中定义的,所以要使用该方法必须首先将Action继承ActionSupport类。

    下面这段代码主要演示如何通过ActionSupport类中的getText方法获得全局资源文件中的国际化信息:

    package com.sanqing.action;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class ShowActionMessage extends ActionSupport {
        private String actionMessage;        //actionMessage属性
        public String getActionMessage() {    //设置actionMessage属性值
            return actionMessage;
        }
        public void setActionMessage(String actionMessage) {//获得actionMessage属性值
            this.actionMessage = actionMessage;
        }
        public String execute() throws Exception {
            actionMessage = this.getText("ActionMessage");// 取得国际化信息
            return this.SUCCESS;
        }
    }

    解说:上述代码中添加了一个actionMessage属性,该属性用来保存从资源文件中取得的国际化信息。

    添加完Action后,需要在struts.xml中配置该Action,其配置代码如下:

    <package name="struts2" extends="struts-default">
        <action name="showActionMessage" class="com.sanqing.action.ShowActionMessage">
            <result name="success">/ShowActionMessage.jsp</result>
        </action>
    </package>

    从配置中可以看到成功输出页面为,所以需要添加该页面,其代码如下:

    <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
    <%@ taglib prefix="s" uri="/struts-tags"%>
    <html>
    <head><title>国际化信息</title></head>
    <body>${actionMessage}</body>
    </html>

    解说:上述代码使用EL表达式输出Action中的属性

    2.2 加载包范围资源文件完成国际化

    下面来介绍包范围资源文件,包范围资源文件的好处在于不需要在struts.xml文件中配置。不同包下的Action使用不同的包范围资源文件,能够很好的将资源文件进行归类。包范围资源文件可以也只能被该包下的Action访问。包范围资源文件的命名规则为package_语言_国家.properties,下面在com.sanqing.action包下添加中英文的包范围资源文件。

    首先来添加一份中文资源文件package_zh_CN.properties,其代码如下所示:

    ActionMessage=u5305u8303u56F4-u6B22u8FCEu4FE1u606F

    再添加一份英文资源文件package_en_US.properties,其代码如下所示:

    ActionMessage=Package-WelcomeMessage

    2.3 加载Action范围资源文件完成国际化

    下面来介绍Action范围资源文件,Action范围资源文件同样不需要在struts.xml文件中配置。Action范围资源文件只能被所对应的Action访问,其他Action无法访问。Action范围资源文件的命名规则为ActionNamee_language_ country.properties,文件保存必须保存在Action同目录下。下面将为ShowActionMessage添加Action范围中英文资源文件。

    首先来添加一份中文资源文件ShowActionMessage_zh_CN.properties,其代码如下所示:

    ActionMessage=Actionu8303u56F4-u6B22u8FCEu4FE1u606F

    再添加一份英文资源文件ShowActionMessage_en_US.propertiess,其代码如下所示:

    ActionMessage=Action-WelcomeMessage

    2.4 资源文件加载顺序

    假如在Action范围资源文件、包范围资源文件、全局资源文件中同时定义了相同的key以及value值,那么最终Action中取得的国际化信息为Action范围资源文件中指定key对应的value值。

    下面来看资源文件加载顺序示意图,如图所示:

    第三节 示例→实现用户自行选择语言环境站点

  • 相关阅读:
    【纯水题】POJ 1852 Ants
    【树形DP】BZOJ 1131 Sta
    【不知道怎么分类】HDU
    【树形DP】CF 1293E Xenon's Attack on the Gangs
    【贪心算法】CF Emergency Evacuation
    【思维】UVA 11300 Spreading the Wealth
    【树形DP】NOI2003 逃学的小孩
    【树形DP】BZOJ 3829 Farmcraft
    【树形DP】JSOI BZOJ4472 salesman
    【迷宫问题】CodeForces 1292A A NEKO's Maze Game
  • 原文地址:https://www.cnblogs.com/studyLog-share/p/5475473.html
Copyright © 2011-2022 走看看