zoukankan      html  css  js  c++  java
  • Struts2的国际化

    Struts2的国际化

    资源文件的命名:basename_language_country.properties

    Struts2的国际化入门

    Struts2国际化是建立在Java国际化的基础上的,一样是通过提供不同国家/语言环境的消息资源,然后通过ResourceBundle

    加载指定Locale对应的资源文件,再取得该资源文件中指定key对应的消息--整个过程与JAVA程序的国家化完全相同,只是

    Struts2框架对JAVA程序国际化进行了进一步封装,从而简化了应用程序的国际化。

    Struts2需要国际化的部分

    类型转换:

    数据校验:

    验证框架xml配置文件的国际化:RegisterAction-validation.xml文件<message key="username.xml.invalid"/>

    JSP页面的国际化:<s:text name="addUser"/>

    Action的国际化:利用ActionSupport类提供的getText()方法.

    Struts2中加载全局资源文件

    struts.xml

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

    struts.properties

    struts.custom.i18n.resources=baseName

    访问国际化消息

    Struts2访问国际化消息主要有如下三种方式:

    (1)JSP页面:<s:text name="key"/>

    (2)Action类中:使用ActionSupport类的getText方法。

    (3)表单元素的Label里:为表单元素指定一个key属性

    输出带占位符的国际化消息

    properties中消息的格式应为:key=value1{0},value1{1}

    Struts2中提供了如下两种方式来填充消息字符串中的占位符

    (1)JSP页面,在<s:text.../>标签中使用多个<s:param.../>标签来填充消息中的占位符。

    (2)Action中,在调用getText方法时使用getText(String aTextName,List args)或getText(String key, String[] args)方法来填充占位符。

    除此之外,Struts2还提供了对占位符的一种替代方式,这种方式允许在国际化消息资源文件中使用表达式,对于这种方式,则可避免在使用国际化消息时还需要为占位符传入参数值。

    如下在消息资源中使用表达式

    succTip=${username}, 欢迎, 您已经登录!

    在上面的消息资源中,通过使用表达式,可以从ValueStack中取出该username属性值,自动填充到该消息资源中。

    加载资源文件的方式

    (1)加载全局资源文件: <constant name="struts.custom.i18n.resources" value="baseName"/>

    (2)包范围资源文件 :为Struts2指定包范围资源文件的方法是,在包的根路径下建立多个文件名为package_language_country.properties的文件,一旦建立了这个系列的国际化资源文件,应用中处于该包下的所有Action都可以访问该资源文件。需要注意的是上面的包范围资源文件的baseName就是“package”而非Action所在的包名。

    (3)Action范围资源文件:在Action类文件所在的路径建立多个文件名为ActionName_language_country.properties的文件。此时的ActionName为该Action的类名

    (4)临时指定资源文件:<s:i18n.../>标签的name属性指定临时的国际化资源文件

    加载资源文件的顺序

    Action中加载资源文件,假设我们在某个ChildAction中调用了getText("user.title"),Struts 2.0的将会执行以下的操作:

    (1)优先加载系统中保存在ChildAction的类文件相同位置,且baseName为ChildAction的系列资源文件。

    (2)如果在(1)中找不到指定key对应的消息,且ChildAction有父类ParentAction,则加载系统中保存在ParentAction的类文件相同位置,且

       baseName为ParentAction的系列资源文件。

    (3)如果在(2)中找不到指定key对应的消息,且ChildAction有实现接口IChildAction,则加载系统中保存在IChildAction的类文件相同位置,且

       baseName为IChildAction的系列资源文件。

    (4)如果在(3)中找不到指定key对应的消息,且ChildAction有实现接口ModelDriven(即使用模型驱动模式),则对于getModel()方法返回的model对象,

       重新执行第(1)步操作。

    (5)如果在(4)中找不到指定key对应的消息,则查找当前包下baseName为package的系列资源文件。

    (6)如果在(5)中找不到指定key对应的消息,则沿着当前包上溯,直到最顶层包来查找baseName为package的系列资源文件。

    (7)如果在(6)中找不到指定key对应的消息,则查找struts.custom.i18n.resources常量指定baseName的系列资源文件。

    (8)如果经过上面的步骤一直找不到key对应的消息,将直接输出该key的字符串值。

    对于在JSP中访问国际化消息,则简单的多,他们又可以分为两种形式:

    (1)对于使用<s:i18n.../>标签作为父标签的<s:text.../>标签、表单标签的形式:

       a、将从<s:i18n.../>标签指定的国际化资源文件中加载指定key对应的消息。

       b、如果在a中找不到指定key对应的消息,则查找struts.custom.i18n.resources常量指定baseName的系列资源文件。

       c、如果经过上面步骤一直找不到该key对应的消息,将直接输出该key的字符串值。

    (2)如果<s:text.../>标签、表单标签没有使用<s:i18n.../>标签作为父标签:

        直接加载struts.custom.i18n.resources常量指定baseName的系列资源文件。如果找不到该key对应的消息,将直接输出该key的字符串值。

     

    允许用户自行选择程序语言

    Struts2国际化的运行机制

        在Struts2中,可以通过ActionContext.getContext().setLocale(Locale arg)设置用户的默认语言。

    为了简化设置用户默认语言环境,Struts2提供了一个名为i18n的拦截器(Interceptor),并且将其注册在默认的拦截器中(defaultStack)。

        i18n拦截器在执行Action方法前,自动查找请求中一个名为request_locale的参数。如果该参数存在,拦截器就将其作为参数,转换成Locale对象,

    并将其设为用户默认的Locale(代表国家/语言环境)。

     除此之外,i18n拦截器还会将上面生成的Locale对象保存在用户Session的名为WW_TRANS_I18N_LOCALE的属性中。一旦用户Session中存在一个名为

    WW_TRANS_I18N_LOCALE的属性,则该属性指定的Locale将会作为浏览者的默认Locale。

    <%@ page language="java" contentType="text/html; charset=GBK"%>

    <%@taglib prefix="s" uri="/struts-tags"%>

    <script. type="text/javascript">

    function langSelecter_onChanged()

    {

     document.getElementById("langForm").submit();

    }

    </script>

    <%-- 设置SESSION_LOCALE为用户session中的WW_TRANS_I18N_LOCALE属性值 --%>

    <s:set name="SESSION_LOCALE" value="#session['WW_TRANS_I18N_LOCALE']"/>

    <%-- 使用lee.Locales创建locales实例 --%>

    <s:bean id="locales" name="lee.Locales">

     <%-- 为locales实例传入current参数值,如果SESSION_LOCALE为空,则返回ValueStack中locale属性值(即用户浏览器设置的Locale) --%>

     <s:param name="current" value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"/>

    </s:bean>

    <%-- 让用户选择语言的表单 --%>

    <form. action="<s:url/>" id="langForm"

        style="background-color:#bbbbbb; padding-top: 4px; padding-bottom: 4px;">

        <s:text name="languag"/>

     <s:select label="Language" list="#locales.locales" listKey="value" listValue="key"

            value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"

            name="request_locale" id="langSelecter"

            nchange="langSelecter_onChanged()" theme="simple"/>

    </form>

    在其他页面中包含该页面:

    <s:include value="selectlanguage.jsp"/>

    在struts.xml文件中增加Action通配符的配置:

    <?xml version="1.0" encoding="GBK"?>

    <!DOCTYPE struts PUBLIC

            "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

            "http://struts.apache.org/dtds/struts-2.0.dtd">

    <struts>

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

     <constant name="struts.i18n.encoding" value="GBK"/>

        <package name="lee" extends="struts-default">

      <!-- 使用通配符定义Action的name -->

      <action name="*">

       <!-- 将请求转发给/WEB-INF/jsp/路径下同名的JSP页面 -->

       <result>/WEB-INF/jsp/{1}.jsp</result>

      </action>

        </package>

    </struts>

     

    转自---http://www.blogjava.net/toby/archive/2009/03/19/260918.html

  • 相关阅读:
    Shell Script-读取配置文件
    [LeetCode]题解(python):048-Rotate Image
    [LeetCode]题解(python):043-Multiply Strings
    暑假学习记录(七)
    暑期学习记录(六)
    暑假学习记录(五)
    暑假学习记录(四)
    暑假学习记录(三)
    暑假学习记录(二)
    暑假学习记录(一)
  • 原文地址:https://www.cnblogs.com/auto714/p/3012335.html
Copyright © 2011-2022 走看看