`

Struts2 i18n(三)

 
阅读更多

下面略述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
<wbr><wbr><wbr><wbr><wbr><wbr><wbr> Parameters:aTextName-the resource bundle key that is to be searched for<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 得到一个基于key的消息,如果没有找到这个消息则返回null<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 参数:aTextName是在资源包寻找到的所匹配的key<br> 小结:该方法用来完成国际化,接收的参数即资源包中的key,返回资源包中的value<br> public String getText(String aTextName,List args)<br> 说明:Gets a message based on a key using the supplied args,as defined in MessageFormat<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 使用提供的一个被定义在MessageFormat中的参数args得到一个基于key的消息<br> 小结:即此时资源包的key的值可以带参数,即{0}占位符,该参数由List类型的args提供<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 换句话说,此时可以传递一些运行时的参数,使得消息的产生是动态的<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 另外还有个与该方法功能相同的public String getText(String key,String[] args)<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 只不过List参数的方法可接收Object参数,而数组参数的方法则只能接收String<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 实际上Object类型的参数真正输出到页面时,也是调用toString()转换成字符串<br> public String getText(String aTextName,String defaultValue)<br> 说明:Gets a message based on a key,if the message is not found,a supplied default value is returned<br> 小结:即当在资源包中找不到key时,就会返回defaultValue</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>


--------------------------------------------------------------------------------

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/>标签内
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 使用&lt;s:text/&gt;输出的国际化信息则是一些单纯的文本<br> &lt;s:i18n name=""/&gt;用来明确的指定所使用的临时的国际化资源文件<br> 并且该临时资源文件默认与struts.xml处于同一目录下,亦可在name中指定其存放路径<br> 它的name值用来指定所要读取的国际化资源文件,然后再嵌套&lt;s:text/&gt;标签就可以输出指定的key值了<br> 在&lt;s:param/&gt;中显示国际化信息如在&lt;s:param value="%{getText('login.tip')}"/&gt;<br> 在&lt;s:param/&gt;中接收Action属性如&lt;s:param value="%{username}"/&gt;<br> Struts2表单标签的key属性通常用来输出国际化信息,可以在key值中传一个OGNL表达式<br> 而label属性中放的是字符串,所以也可以使用%{}输出国际化信息,如下所示<br> &lt;s:property value="getText('key')"/&gt;或者&lt;s:textfield label="%{getText('key')}"/&gt;<br> 另外关于&lt;s:radio/&gt;标签的国际化显示,如下所示<br> &lt;s:radio list="#{1:getText('i18n.sex.male') ,0:getText('i18n.sex.female')}" name="sex" value="1" key="i18n.sex"/&gt;<br> 这个时候就不用再写成%{getText('i18n.sex.male')}了,也就是说可以把%{}去掉了<br> 由于&lt;s:textfield label="%{getText('key')}"/&gt;的label默认使用的是字符串,所以要加上%{}<br> 而在&lt;s:radio/&gt;的list属性里面本身已经有{}符号了,说明它已经是一个OGNL表达式了<br> 所以在&lt;s:radio list=“#{}”/&gt;中就没必要再使用%{}了</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>


--------------------------------------------------------------------------------

浅述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中
这样就使得以后客户的所有操作都是在同一个国际化的环境下执行
就不需要我们每一次都手工判断用户的国际化环境了


--------------------------------------------------------------------------------

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

<wbr></wbr>

首先是struts.xml文件

view plaincopy to clipboardprint?
<?xml version="1.0" encoding="UTF-8" ?><wbr><br> &lt;!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"<wbr><wbr><br> "</wbr></wbr></wbr>
http://struts.apache.org/dtds/struts-2.1.dtd"><wbr><br><wbr><br> &lt;struts&gt;<wbr><br><wbr><wbr><wbr> &lt;constant name="struts.custom.i18n.resources" value="message"/&gt;<wbr><br><wbr><wbr><wbr> &lt;package name="struts2.1" extends="struts-default"&gt;<wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;action name="internationalization" class="com.jadyer.action.InternationalizationActi<wbr>on"&gt;<wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;result&gt;loginSuccess.jsp&lt;/result&gt;<wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;result name="input"&gt;internationalization.jsp&lt;/result&gt;<wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;/action&gt;<wbr><br><wbr><wbr><wbr> &lt;/package&gt;<wbr><br> &lt;/struts&gt;<wbr><br> &lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br> &lt;!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"<br> "</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>http://struts.apache.org/dtds/struts-2.1.dtd">

<struts>
<wbr>&lt;constant name="struts.custom.i18n.resources" value="message"/&gt;<br><wbr>&lt;package name="struts2.1" extends="struts-default"&gt;<br><wbr><wbr>&lt;action name="internationalization" class="com.jadyer.action.InternationalizationActi<wbr>on"&gt;<br><wbr><wbr><wbr>&lt;result&gt;loginSuccess.jsp&lt;/result&gt;<br><wbr><wbr><wbr>&lt;result name="input"&gt;internationalization.jsp&lt;/result&gt;<br><wbr><wbr>&lt;/action&gt;<br><wbr>&lt;/package&gt;<br> &lt;/struts&gt;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

然后是web.xml文件

view plaincopy to clipboardprint?
<?xml version="1.0" encoding="UTF-8"?><wbr><br> &lt;web-app version="2.5" xmlns="</wbr>
http://java.sun.com/xml/ns/javaee"<wbr><br><wbr><wbr><wbr> xmlns:xsi="</wbr></wbr></wbr></wbr>http://www.w3.org/2001/XMLSchema-instance"<wbr><br><wbr><wbr><wbr> xsi:schemaLocation="</wbr></wbr></wbr></wbr>http://java.sun.com/xml/ns/javaee<wbr><wbr><wbr><br><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr>http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><wbr><br><wbr><wbr><wbr> &lt;filter&gt;<wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;filter-name&gt;struts2&lt;/filter-name&gt;<wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;filter-class&gt;org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteF<wbr>ilter&lt;/filter-class&gt;<wbr><br><wbr><wbr><wbr> &lt;/filter&gt;<wbr><br><wbr><wbr><wbr> &lt;filter-mapping&gt;<wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;filter-name&gt;struts2&lt;/filter-name&gt;<wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;url-pattern&gt;<wbr><br><wbr><wbr><wbr> @Override<wbr><br><wbr><wbr><wbr> public void validate() {<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> if (null == username || username.length() &lt; 4 || username.length() &gt; 10) {<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> this.addFieldError("username",this.getText("username.invalid", new String[]{username}));<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> }<wbr><wbr><br><wbr><wbr><wbr> }<wbr><wbr><br> }<wbr><br> package com.jadyer.action;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class InternationalizationActi<wbr>on extends ActionSupport {<br><wbr>private String username;<br><wbr>private String password;<br><wbr><br><wbr>//关于username和password属性的getter和setter方法略<br><wbr><br><wbr>@Override<br><wbr>public String execute() throws Exception {<br><wbr><wbr>if("admin".equals(this.getUsername().trim())&amp;&amp;"jadyer".equals(this.getPassword().trim())){<br><wbr><wbr><wbr>return SUCCESS;<br><wbr><wbr>}else{<br><wbr><wbr><wbr>this.addFieldError("username", this.getText("username.password.error"));<br><wbr><wbr><wbr>return INPUT;<br><wbr><wbr>}<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><br><wbr>@Override<br><wbr>public void validate() {<br><wbr><wbr>if (null == username || username.length() &lt; 4 || username.length() &gt; 10) {<br><wbr><wbr><wbr>this.addFieldError("username",this.getText("username.invalid", new String[]{username}));<br><wbr><wbr>}<br><wbr>}<br> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>


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

view plaincopy to clipboardprint?
hello = \u4F60\u597D\u3010{0}\u3011\u3002\u8FD9\u662F\u4F7F\u7528Struts2\u7684i18n\u6807\u7B7E\u5D4C\u5957text\u6807\u7B7E\u8F93\u51FA\u7684\u7ED3\u679C<wbr><wbr><br><wbr><br><wbr><br> hello = Hello\u3010{0}\u3011\u3002This is used the Struts2 i18n with text tag to result<wbr><br> hello = \u4F60\u597D\u3010{0}\u3011\u3002\u8FD9\u662F\u4F7F\u7528Struts2\u7684i18n\u6807\u7B7E\u5D4C\u5957text\u6807\u7B7E\u8F93\u51FA\u7684\u7ED3\u679C</wbr></wbr></wbr></wbr></wbr>


hello = Hello\u3010{0}\u3011\u3002This is used the Struts2 i18n with text tag to result


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

view plaincopy to clipboardprint?
internationalization.jsp.CHINESE<wbr> = \u4E2D\u6587\u7248<wbr><wbr><br> internationalization.jsp.ENGLISH<wbr> = \u82F1\u6587\u7248<wbr><wbr><br> internationalization.jsp.passwrod = \u5BC6\u7801<wbr><wbr><br> internationalization.jsp.username = \u7528\u6237<wbr><wbr><br> username.invalid<wbr><wbr><wbr><wbr><wbr><wbr><wbr> = \u7528\u6237\u540D "{0}" \u586B\u5199\u4E0D\u6B63\u786E<wbr><wbr><br> username.password.error = \u7528\u6237\u540D\u6216\u5BC6\u7801\u4E0D\u6B63\u786E<wbr><wbr><br><wbr><br><wbr><br> internationalization.jsp.CHINESE<wbr> = Chinese<wbr><wbr><br> internationalization.jsp.ENGLISH<wbr> = English<wbr><wbr><br> internationalization.jsp.passwrod = password<wbr><wbr><br> internationalization.jsp.username = username<wbr><wbr><br> username.invalid<wbr><wbr><wbr><wbr><wbr><wbr><wbr> = username "{0}" invalid<wbr><wbr><br> username.password.error = username or password error</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr></wbr>

分享到:
评论

相关推荐

    struts2 i18n学习记录

    三、配置Struts2 i18n 在Struts2中,配置i18n主要涉及以下步骤: 1. 创建资源文件:你需要为每种语言创建一个.properties文件,如messages_en_US.properties(英语美国)和messages_zh_CN.properties(简体中文)。...

    Struts2 I18N国际化最简单例子

    在这个“Struts2 I18N国际化最简单例子”中,我们将探讨如何在Struts2框架下实现国际化功能。 1. **Struts2的I18N支持** Struts2提供了内置的支持来处理多语言环境。它通过资源包(Resource Bundle)来管理不同的...

    国际化 struts2i18n demo

    在"struts2i18n"这个示例中,我们将会看到如何在Struts2环境中配置和使用i18n功能。这个实例基于Struts2.16版本,一个稳定且功能丰富的发行版。MyEclipse6是一个集成开发环境(IDE),它提供了对Struts2等框架的良好...

    struts2-i18n实现国际化例子

    Struts2-i18n是Apache Struts框架中用于实现应用程序国际化的功能模块。这个例子主要是为了帮助初学者理解如何在Struts2框架下进行国际化设置。以下将详细讲解Struts2-i18n的基本概念、实现步骤以及相关知识点。 **...

    (三)Struts2国际化(i18n) :简单语言包的实现

    在Struts2中,国际化(i18n)是处理多语言环境的重要特性,使得同一个应用可以适应不同地区用户的需求。本篇文章将深入探讨如何在Struts2中实现简单语言包的国际化。 首先,我们需要了解什么是i18n。这里的数字"18...

    struts2 i18n国际化实例

    这个"struts2 i18n国际化实例"应该包含了实现上述所有步骤的具体代码示例,对于初学者来说,是一个很好的学习起点,可以帮助理解Struts2如何处理国际化,以及如何在实际项目中应用这些概念。同时,遇到问题可以与...

    struts_i18n_login.rar_i18n

    "struts_i18n_login.rar_i18n" 这个标题暗示我们将会探讨如何在 Struts 1 中实现国际化登录界面。 国际化(i18n)这个名字来源于 "internationalization" 的首字母缩写,数字 "18" 是因为 "n" 之后到 "i" 之间有18...

    struts_I18N

    2. **I18N在Struts中的应用**: - **资源包**:在Struts中,为了实现I18N,开发者需要创建一系列的资源包,每个包对应一种语言或地区。资源包通常是以.properties为扩展名的文本文件,其中存储了键值对,键是标识符...

    struts_I18N国际化

    Struts I18N 国际化是一种技术,它允许应用程序根据用户所在的地理位置或首选语言环境来显示相应的本地化内容。在Struts框架中,I18N(Internationalization)是一个关键特性,使得开发者能够轻松地创建支持多语言的...

    struts2i18n

    struts2 中际化示例,加上s2sh所需的Jar就可以运行!如果不行留言,把demo发给你! 示例图:http://blog.csdn.net/liuc0317/archive/2010/12/01/6048552.aspx

    struts2国际化_i18n

    Struts2是一个非常流行的Java Web框架,用于构建可维护、可扩展且结构良好的应用程序。...这个提供的`i18n`压缩包文件可能包含了示例的资源包和相关的配置文件,可以帮助初学者理解并实践Struts2的国际化实现。

    struts2_i18n

    在Struts2中,i18n(国际化)是一种重要的功能,它允许开发者创建能够支持多种语言的应用程序,以满足全球用户的需要。在这个主题"struts2_i18n"中,我们将深入探讨Struts2框架中的国际化实现机制。 首先,了解i18n...

    Struts2 国际化 I18N 和Java 国际化

    2. 在Struts2配置文件中启用I18N支持。 3. 使用`ActionContext`或`ValueStack`在Action和视图中获取本地化字符串。 4. 可以通过`MessageProvider`自定义消息提供策略。 5. 使用`Locale`对象进行语言环境切换,以便于...

    struts2-i18n

    Struts2-i18n是一个专门针对Struts2框架实现的国际化(i18n)解决方案。在Web开发中,国际化是一项重要的功能,它允许应用为不同地区的用户提供本地化的界面和内容。Struts2作为流行的Java Web MVC框架,提供了一套...

    struts2中的国际化(i18n)项目实例.(MyEclipse工具)

    这个"struts2中的国际化(i18n)项目实例"是为了帮助初学者理解如何在Struts2中实现在MyEclipse集成开发环境中配置和使用国际化功能。 首先,我们要知道i18n代表的是“国际化”,这里的18个字符代表了英文单词...

    i18n的一些源码

    - 在Struts2的配置文件(如struts.xml或struts.properties)中,需要设置i18n的属性,指明资源文件的位置。例如: ```xml &lt;constant name="struts.i18n.encoding" value="UTF-8"/&gt; &lt;constant name="struts....

    struts1的I18例子

    2. **配置Struts1的I18N**: - 在`struts-config.xml`配置文件中,需添加一个`&lt;message-resources&gt;`元素来指定资源文件的位置。例如: ```xml ``` - `parameter`属性指定了资源文件的路径,可以是类路径或完全...

    struts_i18n1_login

    在"struts_i18n1_login"这个实例中,我们将探讨如何利用Struts框架实现国际化(i18n)功能,并创建一个基本的登录界面。国际化是一个重要的特性,它允许应用程序根据用户的语言和地区提供定制化的用户界面。 首先,...

    struts2 国际化 i18n

    Struts2的国际化(i18n)是Web应用开发中必不可少的一个特性,它允许应用程序根据用户的语言和地区提供相应的本地化内容。Struts2框架提供了强大的国际化支持,包括页面、Action和XML配置文件的国际化。 首先,为了...

    Struts2中的validation_多国语言版 国际化i18n+struts2数据校验.zip

    本资料包聚焦于Struts2中的数据校验以及国际化(i18n)支持。 首先,我们来探讨"Struts2中的validation_多国语言版",这是Struts2的数据校验功能。Struts2提供了一种灵活的机制来验证用户输入,通过在Action类中...

Global site tag (gtag.js) - Google Analytics