下面略述com.opensymphony.xwork2.ActionSupport.getText()方法

public String getText(String aTextName)

说明:Gets a messages based on a message key,or null if no message is found        

Parameters:aTextName-the resource bundle key that is to be searched for

得到一个基于key的消息,如果没有找到这个消息则返回null

参数:aTextName是在资源包寻找到的所匹配的key

小结:该方法用来完成国际化,接收的参数即资源包中的key,返回资源包中的value

public String getText(String aTextName,List args)

说明:Gets a message based on a key using the supplied args,as defined in MessageFormat

使用提供的一个被定义在MessageFormat中的参数args得到一个基于key的消息

小结:即此时资源包的key的值可以带参数,即{0}占位符,该参数由List类型的args提供

换句话说,此时可以传递一些运行时的参数,使得消息的产生是动态的

另外还有个与该方法功能相同的public String getText(String key,String[] args)

只不过List参数的方法可接收Object参数,而数组参数的方法则只能接收String

实际上Object类型的参数真正输出到页面时,也是调用toString()转换成字符串

public String getText(String aTextName,String defaultValue)

说明:Gets a message based on a key,if the message is not found,a supplied default value is returned

小结:即当在资源包中找不到key时,就会返回defaultValue


Struts2里面国际化资源文件的三个存活范围

Struts2提供了更精细化的资源文件定义方式,可分全局的局部的 而局部的国际化资源文件又分为两种情况,分别是:包级别类级别

包级别资源文件自然要在相应包下建立,它的命名是固定的package_zh_CN.properties 若存在相同key,那么包级别中的提示信息要高于全局资源文件中的提示信息 这就好似Java一样,若定义了同名的成员变量和局部变量,那么成员变量将被覆盖掉

类级别资源文件同样要建立在相应包下,它的命名类似于LoginAction_zh_CN.properties 类级别的提示信息更加具体,因此类级别的提示信息要高于包级别资源文件的提示信息


类级别和包级别在应用中的触发点

若要在表单中进行国际化信息的显示,则应去掉<s:form/>theme="simple"属性 然后将姓名输入域改为<s:textfield name="username" key="username.xml.invalid"/> 访问页面时,会在姓名位置显示包级别提示信息,即package_zh_CN.properties中的 点击Submit时会在姓名位置显示类级别别提示信息,即RegisterAction_zh_CN.properties中的 点击Submit后,表单便与在struts.xml中设定的Action关联在一起,故显示类级别提示信息 所以当使用类级别国际化文件时,必须经过Action才能生效,才能按照预定的进行国际化 若未经Action而直接访问JSP页面,则无法显示类级别的国际化消息,这一点和Struts1.X是不一样的


在国际化资源文件中嵌套OGNL表达式

国际化资源文件中的内容示例如下 login.text = 登录 login.title = %{getText("login.text")}页面 那么在页面中显示login.title国际化消息时,就会显示:登录页面


页面中国际化的显示

<s:text name="key"/>会自动按照范围到资源文件中查找name所指定的key 然后输出Key所对应的Value,若Key不存在,则将name值原封不动的输出 并且它也是可以动态传递参数的,这时需要在该标签中嵌套<s:param/>标签

<s:label key=""/>在输出国际化信息时,会自动在国际化文本后面加上一个多余的冒号 通过查看页面源文件发现:使用<s:label/>输出的国际化信息位于HTML的<label/>标签内                                   使用<s:text/>输出的国际化信息则是一些单纯的文本

<s:i18n name=""/>用来明确的指定所使用的临时的国际化资源文件 并且该临时资源文件默认与struts.xml处于同一目录下,亦可在name中指定其存放路径 它的name值用来指定所要读取的国际化资源文件,然后再嵌套<s:text/>标签就可以输出指定的key值了

<s:param/>中显示国际化信息如在<s:param value="%{getText('login.tip')}"/>

<s:param/>中接收Action属性如<s:param value="%{username}"/> Struts2表单标签的key属性通常用来输出国际化信息,可以在key值中传一个OGNL表达式 而label属性中放的是字符串,所以也可以使用%{}输出国际化信息,如下所示 <s:property value="getText('key')"/>或者<s:textfield label="%{getText('key')}"/> 另外关于<s:radio/>标签的国际化显示,如下所示 <s:radio list="#{1:getText('i18n.sex.male') ,0:getText('i18n.sex.female')}" name="sex" value="1" key="i18n.sex"/> 这个时候就不用再写成%{getText('i18n.sex.male')}了,也就是说可以把%{}去掉了 由于<s:textfield label="%{getText('key')}"/>label默认使用的是字符串,所以要加上%{} 而在<s:radio/>list属性里面本身已经有{}符号了,说明它已经是一个OGNL表达式了 所以在<s:radio list=“#{}”/>中就没必要再使用%{}


浅述Struts2国际化的实现过程

Struts2的I18nInterceptor拦截器会拦截所有的Action,它主要做的事情为 从客户端发送过来的请求参数中寻找是否存在名为request_locale的参数 若有,则将request_locale的value转化为locale保存起来 该locale是保存在以WW_TRANS_I18N_LOCALE所命名的session里面的 详见源码的第124行session.put(attributeName, locale) 其中attributeName即79行的protected String attributeName = DEFAULT_SESSION_ATTRIBUTE 和第75行的public static final String DEFAULT_SESSION_ATTRIBUTE = "WW_TRANS_I18N_LOCALE" 于是便可通过这种方式实现一个选择页面所显示的语言环境的功能 比如选择中文,那么就可以将request_locale设置为zh_CN 如果我们不做任何配置的话,客户端是不会发送request_locale参数的 它默认会用request的getLocale()方法得到默认locale,将其存放在session中 这样就使得以后客户的所有操作都是在同一个国际化的环境下执行 就不需要我们每一次都手工判断用户的国际化环境了


接下来为大家展示示例代码

首先是struts.xml文件

  1. <?xmlversion="1.0"encoding="UTF-8"?> 
  2. <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" 
  3. "http://struts.apache.org/dtds/struts-2.1.dtd"> 
  4.  
  5. <struts> 
  6.     <constantname="struts.custom.i18n.resources"value="message"/> 
  7.     <packagename="struts2.1"extends="struts-default"> 
  8.         <actionname="internationalization"class="com.jadyer.action.InternationalizationAction"> 
  9.             <result>loginSuccess.jsp</result> 
  10.             <resultname="input">internationalization.jsp</result> 
  11.         </action> 
  12.     </package> 
  13. </struts> 

然后是web.xml文件

  1. <?xmlversion="1.0"encoding="UTF-8"?> 
  2. <web-appversion="2.5"xmlns="http://java.sun.com/xml/ns/javaee" 
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
  5.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
  6.     <filter> 
  7.         <filter-name>struts2</filter-name> 
  8.         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 
  9.     </filter> 
  10.     <filter-mapping> 
  11.         <filter-name>struts2</filter-name> 
  12.         <url-pattern>/*</url-pattern> 
  13.     </filter-mapping> 
  14.     <welcome-file-list> 
  15.         <welcome-file>internationalization.jsp</welcome-file> 
  16.     </welcome-file-list> 
  17. </web-app> 

用于显示国际化信息的internationalization.jsp页面

  1. <%@ page language="java"pageEncoding="UTF-8"%> 
  2. <%@ taglib prefix="s"uri="/struts-tags"%> 
  3. <strong> 
  4.     <ahref="internationalization.action?request_locale=zh_CN"><s:textname="internationalization.jsp.CHINESE"/></a>| 
  5.     <ahref="internationalization.action?request_locale=en_US"><s:textname="internationalization.jsp.ENGLISH"/></a> 
  6. </strong> 
  7.  
  8. <hr/> 
  9.  
  10. <STRONG> 
  11.     <FONTcolor="green"> 
  12.         <s:i18nname="com.jadyer.action.temp"> 
  13.             <s:textname="hello"> 
  14.                 <s:param>玄玉</s:param> 
  15.             </s:text> 
  16.         </s:i18n> 
  17.     </FONT> 
  18. </STRONG> 
  19.  
  20. <hr/> 
  21.  
  22. <h4>初始姓名和密码为<fontcolor="blue"><b>admin</b></font>和<fontcolor="blue"><b>jadyer</b></font></h4> 
  23.  
  24. <s:fielderrorcssStyle="font-size:20px;color:red;text-align:left;font-weight:bold"/> 
  25.  
  26. <s:formaction="internationalization"theme="simple"> 
  27.     <tableborder="9"> 
  28.         <tr> 
  29.             <td><s:propertyvalue="getText('internationalization.jsp.username')"/></td> 
  30.             <td><s:textfieldname="username"/></td> 
  31.         </tr> 
  32.         <tr> 
  33.             <td><s:textname="internationalization.jsp.passwrod"/></td> 
  34.             <td><s:passwordname="password"/></td> 
  35.         </tr> 
  36.         <tr> 
  37.             <td></td> 
  38.             <tdalign="center"><s:submit/></td> 
  39.         </tr> 
  40.     </table> 
  41. </s:form> 

访问成功后跳转到loginSuccess.jsp页面

  1. <%@ page pageEncoding="UTF-8"%> 
  2. <h2>Login Success</h2> 

然后是用到的InternationalizationAction.java类

  1. package com.jadyer.action; 
  2.  
  3. import com.opensymphony.xwork2.ActionSupport; 
  4.  
  5. @SuppressWarnings("serial") 
  6. publicclass InternationalizationAction extends ActionSupport { 
  7.     private String username; 
  8.     private String password; 
  9.      
  10.     //关于username和password属性的getter和setter方法略 
  11.      
  12.     @Override 
  13.     public String execute() throws Exception { 
  14.         if("admin".equals(this.getUsername().trim())&&"jadyer".equals(this.getPassword().trim())){ 
  15.             return SUCCESS; 
  16.         }else{ 
  17.             this.addFieldError("username", this.getText("username.password.error")); 
  18.             return INPUT; 
  19.         } 
  20.     } 
  21.  
  22.     /**
  23.      * List list = new ArrayList();
  24.      * list.add(username);
  25.      * this.addFieldError(this.getText("username.invalid", list));
  26.      * 建议使用String[]数组的方式。因为它本身放的就是String类型的参数,很方便
  27.      * 使用addActionError()实现国际化的方式与addFieldError()是一样的,这里就不再举例了
  28.      */ 
  29.     @Override 
  30.     publicvoid validate() { 
  31.         if (null == username || username.length() < 4 || username.length() > 10) { 
  32.             this.addFieldError("username",this.getText("username.invalid", new String[]{username})); 
  33.         } 
  34.     } 

用来测试<s:i18n>、<s:text>、<s:param>标签组合使用的temp_zh_CN_en_US.properties国际化资源文件

[c-sharp] view plaincopyprint?

 
  1. hello = /u4F60/u597D/u3010{0}/u3011/u3002/u8FD9/u662F/u4F7F/u7528Struts2/u7684i18n/u6807/u7B7E/u5D4C/u5957text/u6807/u7B7E/u8F93/u51FA/u7684/u7ED3/u679C 
  2.  
  3.  
  4. hello = Hello/u3010{0}/u3011/u3002This is used the Struts2 i18n with text tag to result 

最后是用到的全局的message_zh_CN.properties和message_en_US.properties国际化资源文件

  1. internationalization.jsp.CHINESE  = /u4E2D/u6587/u7248 
  2. internationalization.jsp.ENGLISH  = /u82F1/u6587/u7248 
  3. internationalization.jsp.passwrod = /u5BC6/u7801 
  4. internationalization.jsp.username = /u7528/u6237 
  5. username.invalid        = /u7528/u6237/u540D "{0}" /u586B/u5199/u4E0D/u6B63/u786E 
  6. username.password.error = /u7528/u6237/u540D/u6216/u5BC6/u7801/u4E0D/u6B63/u786E 
  7.  
  8.  
  9. internationalization.jsp.CHINESE  = Chinese 
  10. internationalization.jsp.ENGLISH  = English 
  11. internationalization.jsp.passwrod = password 
  12. internationalization.jsp.username = username 
  13. username.invalid        = username "{0}" invalid 
  14. username.password.error = username or password error 

ActionSupport.getText()方法 以及 js中:<s:text name="" />的更多相关文章

  1. js中的text(),html() ,val()的区别

    js中的text(),html() ,val()的区别 text(),html() ,val()三个方法用于html元素的存值和取值,但是他们各有特点,text()用于html元素文本内容的存取,ht ...

  2. String方法,js中Array方法,ES5新增Array方法,以及jQuery中Array方法

    相关阅读:https://blog.csdn.net/u013185654/article/details/78498393 相关阅读:https://www.cnblogs.com/huangyin ...

  3. JS高级面试题思路(装箱和拆箱、栈和堆、js中sort()方法、.js中Date对象中的getMounth() 需要注意的、开发中编码和解码使用场景有哪些)

    1.装箱和拆箱: 装箱:把基本数据类型转化为对应的引用数据类型的操作: var num = 123 // num var objNum = new Num(123) // object console ...

  4. Asp.net MVC Razor输出字符串方法(js中嵌入razor)

    @{ Model p = new Model(); //输出名称和年龄 //1.第一种方式 @:姓名=@p.Name //2.第二中方式 <text>年龄=</text>p.A ...

  5. 判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解

    提醒大家,Object.prototype.toString().call(param)返回的[object class]中class首字母是大写,像JSON这种甚至都是大写,所以,大家判断的时候可以 ...

  6. 纯静态界面中(html)中通过js调用dll中的方法从数据库中读取数据

    最近接到一个离职员工的任务,一个搭好框架的ERP系统,看了两天,说一下看到的东西,整个项目目录中我没发现一个.aspx后缀的文件,全是静态HTML文件,之后发现他用的jquery简直看的头疼,不过大概 ...

  7. JS与OC交互,JS中调用OC方法(获取JSContext的方式)

    最近用到JS和OC原生方法调用的问题,查了许多资料都语焉不详,自己记录一下吧,如果有误欢迎联系我指出. JS中调用OC方法有三种方式: 1.通过获取JSContext的方式直接调用OC方法 2.通过继 ...

  8. JS中的对象和方法简单剖析

    众所周知,在js中对象就是精髓,不理解对象就是不理解js. 那么什么事js中的对象呢? 在js中,几乎一切皆对象: Boolean ,String,Number可以是对象(或者说原生数据被认作对象): ...

  9. js中的Object.defineProperty()和defineProperties()详解

    ECMAS-262第5版在定义只有内部采用的特性时,提供了描述了属性特征的几种属性.ECMAScript对象中目前存在的属性描述符主要有两种,数据描述符(数据属性)和存取描述符(访问器属性),数据描述 ...

随机推荐

  1. 对于JavaScript对象的prototype和__proto__的理解

    一.Object和Function的关系: 刚学JavaScript的时候,看书上说JavaScript中万物皆对象,而javascript中的其他对象都是从Object继承而来,包括内置对象.瞬间觉 ...

  2. MooTools 异步请求验证

    http://www.chinamootools.com/ 问题 MooTools 异步请求例子 <{foreach from=array('0','1','2','3','4') item=c ...

  3. python列表sort方法的两个参数key, reverse

    使用列表的sort方法可以进行排序,其中有两个参数用来表示排序的方式,代码: In [7]: a = ['x11','abc323','e26','112ddd'] In [8]: a.sort(ke ...

  4. 元组:戴上了枷锁的列表 - 零基础入门学习Python013

    元组:戴上了枷锁的列表 让编程改变世界 Change the world by program 元组:戴上了枷锁的列表 由于和列表是近亲关系,所以元组和列表在实际使用上是非常相似的. 我们这节课主要通 ...

  5. 使用BufferedReader的时候出现的问题

    今天在使用BufferedReader的时候,出现了一个奇怪的问题 有时候换行的时候,行首会少一个字符 开始的代码是这样写的 while( br.read()!=-1 ){ String str = ...

  6. 深入浅出Node.js (4) - 异步编程

    4.1 函数式编程 4.1.1 高阶函数 4.1.2 偏函数用法 4.2 异步编程的优势与难点 4.2.1 优势 4.2.2 难点 4.3 异步编程解决方案 4.3.1 事件发布/订阅模式 4.3.2 ...

  7. Tomcat查看用户名密码

    在非安装版的tomcat中,可以在{解压路径}/conf/tomcat_users.xml 配置文件中找到,也可以自己添加新的用户

  8. 最短路径问题:dijkstar

    算法描述: 输入图G,源点v0,输出源点到各点的最短距离D 中间变量v0保存当前已经处理到的顶点集合,v1保存剩余的集合 1.初始化v1,D 2.计算v0到v1各点的最短距离,保存到D for eac ...

  9. 关于vs的lib文件和dll文件

    一.LIB文件概念 一个lib文件是obj文件的集合.当然,其中还夹杂着其他一些辅助信息,目的是为了让编译器能够准确找到对应的obj文件 二.与DLL的区别 (1)lib是编译时需要的,dll是运行时 ...

  10. linux时钟管理

    ref https://access.redhat.com/solutions/18627 在el5中 如何查看系统现在使用的clock source是什么? 答: 方式1:需要说明的是不能保证这个两 ...