下面略述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文件
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
- "http://struts.apache.org/dtds/struts-2.1.dtd">
- <struts>
- <constant name="struts.custom.i18n.resources" value="message"/>
- <package name="struts2.1" extends="struts-default">
- <action name="internationalization" class="com.jadyer.action.InternationalizationAction">
- <result>loginSuccess.jsp</result>
- <result name="input">internationalization.jsp</result>
- </action>
- </package>
- </struts>
然后是web.xml文件
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
- <filter>
- <filter-name>struts2</filter-name>
- <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <welcome-file-list>
- <welcome-file>internationalization.jsp</welcome-file>
- </welcome-file-list>
- </web-app>
用于显示国际化信息的internationalization.jsp页面
- <%@ page language="java" pageEncoding="UTF-8"%>
- <%@ taglib prefix="s" uri="/struts-tags"%>
- <strong>
- <a href="internationalization.action?request_locale=zh_CN"><s:text name="internationalization.jsp.CHINESE"/></a>|
- <a href="internationalization.action?request_locale=en_US"><s:text name="internationalization.jsp.ENGLISH"/></a>
- </strong>
- <hr/>
- <STRONG>
- <FONT color="green">
- <s:i18n name="com.jadyer.action.temp">
- <s:text name="hello">
- <s:param>玄玉</s:param>
- </s:text>
- </s:i18n>
- </FONT>
- </STRONG>
- <hr/>
- <h4>初始姓名和密码为<font color="blue"><b>admin</b></font>和<font color="blue"><b>jadyer</b></font></h4>
- <s:fielderror cssStyle="font-size:20px;color:red;text-align:left;font-weight:bold"/>
- <s:form action="internationalization" theme="simple">
- <table border="9">
- <tr>
- <td><s:property value="getText('internationalization.jsp.username')"/></td>
- <td><s:textfield name="username"/></td>
- </tr>
- <tr>
- <td><s:text name="internationalization.jsp.passwrod"/></td>
- <td><s:password name="password"/></td>
- </tr>
- <tr>
- <td> </td>
- <td align="center"><s:submit/></td>
- </tr>
- </table>
- </s:form>
访问成功后跳转到loginSuccess.jsp页面
- <%@ page pageEncoding="UTF-8"%>
- <h2>Login Success</h2>
然后是用到的InternationalizationAction.java类
- package com.jadyer.action;
- import com.opensymphony.xwork2.ActionSupport;
- @SuppressWarnings("serial")
- public class InternationalizationAction extends ActionSupport {
- private String username;
- private String password;
- //关于username和password属性的getter和setter方法略
- @Override
- public String execute() throws Exception {
- if("admin".equals(this.getUsername().trim())&&"jadyer".equals(this.getPassword().trim())){
- return SUCCESS;
- }else{
- this.addFieldError("username", this.getText("username.password.error"));
- return INPUT;
- }
- }
- /**
- * List list = new ArrayList();
- * list.add(username);
- * this.addFieldError(this.getText("username.invalid", list));
- * 建议使用String[]数组的方式。因为它本身放的就是String类型的参数,很方便
- * 使用addActionError()实现国际化的方式与addFieldError()是一样的,这里就不再举例了
- */
- @Override
- public void validate() {
- if (null == username || username.length() < 4 || username.length() > 10) {
- this.addFieldError("username",this.getText("username.invalid", new String[]{username}));
- }
- }
- }
用来测试<s:i18n>、<s:text>、<s:param>标签组合使用的temp_zh_CN_en_US.properties国际化资源文件
- hello = /u4F60/u597D/u3010{0}/u3011/u3002/u8FD9/u662F/u4F7F/u7528Struts2/u7684i18n/u6807/u7B7E/u5D4C/u5957text/u6807/u7B7E/u8F93/u51FA/u7684/u7ED3/u679C
- hello = Hello/u3010{0}/u3011/u3002This is used the Struts2 i18n with text tag to result
最后是用到的全局的message_zh_CN.properties和message_en_US.properties国际化资源文件
- internationalization.jsp.CHINESE = /u4E2D/u6587/u7248
- internationalization.jsp.ENGLISH = /u82F1/u6587/u7248
- internationalization.jsp.passwrod = /u5BC6/u7801
- internationalization.jsp.username = /u7528/u6237
- username.invalid = /u7528/u6237/u540D "{0}" /u586B/u5199/u4E0D/u6B63/u786E
- username.password.error = /u7528/u6237/u540D/u6216/u5BC6/u7801/u4E0D/u6B63/u786E
- internationalization.jsp.CHINESE = Chinese
- internationalization.jsp.ENGLISH = English
- internationalization.jsp.passwrod = password
- internationalization.jsp.username = username
- username.invalid = username "{0}" invalid
- username.password.error = username or password error
相关推荐
Struts2是一个流行的Java web应用程序框架,它极大地简化了MVC(模型-视图-控制器)架构的实现。...如果你想要深入学习Struts2和OGNL,可以参考给出的博客链接,或者查阅官方文档和其他相关的技术资源。
在Struts2中实现国际化,可以提供多语言支持,比如中英文切换,这对于全球用户来说非常关键。 首先,我们需要理解国际化的基本概念。国际化不是简单地翻译文本,而是设计一个可扩展的系统,以便能够轻松添加新的...
Struts2的国际化主要依赖于Java的ResourceBundle类,该类用于管理应用程序中的多语言资源。以下是如何在Struts2中进行国际化设置的详细步骤: 1. **创建资源文件**: 在项目的`src/main/resources`目录下,创建一...
"Struts2国际化demo"是一个示例,展示了如何在Struts2框架下实现这一功能,使得网站可以根据用户的浏览器设置显示不同的语言。 首先,要实现国际化,我们需要创建资源文件。在Java中,这些通常是`.properties`文件...
4. **在JSP页面中使用**:在JSP页面中,可以通过OGNL表达式访问国际化资源。例如: ```jsp ``` 5. **处理用户选择的语言**:用户可以选择他们偏好使用的语言。这可以通过HTTP请求头的`Accept-Language`字段或...
Struts 2是Java Web开发中的一个开源框架,主要...在提供的压缩包“struts 2 国际化.rar”中,可能包含了示例项目的源码、配置文件和资源文件,学习者可以通过这些资源深入理解Struts 2国际化的工作原理和实践方法。
Struts2 OGNL表达式是Java Web开发中一个重要的概念,它是一种强大的对象图形导航语言(Object-Graph Navigation Language)。在Struts2框架中,OGNL被广泛用于视图层,作为数据绑定的主要手段,使得开发者能够方便...
官方指南是学习和解决Struts2问题的重要参考,可以帮助开发者快速掌握框架的核心功能和高级特性,如Tiles插件、Struts2的AJAX支持、国际化和安全性。 5. **Struts2的拦截器(Interceptors)**: 拦截器是Struts2的...
4. **在JSP页面中展示**:在JSP页面中,我们可以使用OGNL表达式或者Struts2的标签库来显示国际化文本。 ```jsp <%@ taglib prefix="s" uri="/struts-tags" %> ... ``` 5. **处理请求中的locale**:Struts2会自动...
在Struts2中,国际化(i18n)是一项关键功能,允许开发者创建能够适应不同语言和地区的应用。下面将详细讲解如何在Struts2.1中实现国际化。 首先,国际化的核心在于资源文件。这些文件通常以.properties为扩展名,...
5. **JSP页面显示**:在JSP页面中,我们可以使用Struts2的OGNL表达式来获取资源文件中的字符串。例如,`<s:text name="hello.message"/>`会根据当前的locale从资源文件中获取对应的"hello.message"字符串。 6. **...
Struts2是一个强大的Java web应用程序框架,用于构建和维护可扩展、易于管理的企业级Web应用。这个"struts2资源包"包含了实现Struts2框架所...理解并掌握这些库的功能和用法,对于深入学习和使用Struts2框架至关重要。
这份文档集合了jQuery 1.8的使用方法、Struts框架中的标签应用以及正则表达式的实践指南,特别适合初学者快速学习和查阅。 jQuery是JavaScript库的杰出代表,它极大地简化了JavaScript的DOM操作、事件处理、动画...
开发者可以自定义Action类,通常会继承`org.struts2.interceptor.ActionSupport`,这个基类提供了错误处理、国际化等基础功能。 **5. Interceptors(拦截器)** 拦截器是Struts2的一个强大特性,可以在Action执行...
综上所述,"struts2上传图国际资源"涵盖了Struts2框架下处理图片上传和国际化资源的核心步骤。通过理解并实践这些知识点,开发者可以构建出更健壮、适应多种语言环境的Web应用。同时,注意安全性和用户体验,是实现...
10. **国际化与本地化**:Struts2支持多语言环境,可以通过资源包(properties文件)实现界面文本的国际化。 11. **安全考虑**:Struts2虽然强大,但也需要注意安全性问题,例如XSS、CSRF等。开发者应确保对用户...
9. **国际化和本地化**:Struts2支持多语言,可以通过资源文件来实现。 10. **异常处理**:Struts2提供了一套完整的异常处理机制,可以自定义错误页面和异常处理器。 总的来说,"struts2jar.zip"压缩包是一个实用...
- **国际化**:通过配置资源文件实现多语言支持,增强应用的可用性。 - **异常处理**:配置异常拦截器,实现全局异常捕获和处理,提升用户体验。 - **文件上传与下载**:Struts2内置了对文件上传的支持,可以轻松...
Struts2-showcase是一个用于演示和学习Apache Struts2框架功能的开源项目。这个压缩包“struts2-showcase.rar”包含了完整的源代码,旨在帮助...同时,它也是一个很好的学习资源,帮助初学者快速上手Struts2开发。