[原创]java WEB学习笔记69:Struts2 学习之路-- 消息处理与国际化,概述,配置国际资源文件,访问国际化消息,通过超链接切换语言
2016-09-28 16:54
489 查看
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用
内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。
本人互联网技术爱好者,互联网技术发烧友
微博:伊直都在0221
QQ:951226918
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------1.概述:
1)在程序设计领域, 把在无需改写源代码即可让开发出来的应用程序能够支持多种语言和数据格式的技术称为国际化.
2)与国际化对应的是本地化, 指让一个具备国际化支持的应用程序支持某个特定的地区
3)Struts2 国际化是建立在 Java 国际化基础上的:
- 为不同国家/语言提供对应的消息资源文件
- Struts2 框架会根据请求中包含的 Locale 加载对应的资源文件
- 通过程序代码取得该资源文件中 指定 key 对应的消
2.如何配置国际化资源文件
1) Action 范围资源文件:在Action类文件所在的路径建立名为 ActionName_language_country.properties 的文件
2) 包范围资源文件:在包的根路径下建立文件名为package_language_country.properties 的属性文件,一旦建立,处于该包下的所有 Action 都可以访问该资源文件。注意:包范围资源文件的 baseName 就是package,不是Action所在的包名。
3) 全局资源文件
- 命名方式: basename_language_country.properties
- struts.xml : <constant name="struts.custom.i18n.resources" value="baseName"/>
了解:
- struts.propertiesstruts.custom.i18n.resources=baseName
- 临时指定资源文件:<s:i18n.../> 标签的 name 属性指定临时的国际化资源文件
4)国际化资源文件加载的顺序如何?离当前 Action 较近将优先被加载
1 假设我们在某个 ChildAction 中调用了getText("username"): 2 (1)加载和 ChildAction 的类文件在同一个包下的系列资源文件 ChildAction.properties 3 (2)加载 ChildAction 实现的接口 IChild,且和 IChildn 在同一个包下 IChild.properties 系列资源文件。 4 (3)加载 ChildAction 父类 Parent,且和 Parent 在同一个包下的 baseName 为 Parent.properties 系列资源文件。 5 (4) 若 ChildAction 实现 ModelDriven 接口,则对于getModel()方法返回的model 对象,重新执行第(1)步操作。 6 (5) 查找当前包下 package.properties 系列资源文件。 7 (6) 沿着当前包上溯,直到最顶层包来查找 package.properties 的系列资源文件。 8 (7) 查找 struts.custom.i18n.resources 常量指定 baseName 的系列资源文件。 9 (8) 直接输出该key的字符串值。
username=\u7528\u6237\u540D password=\u5BC6\u7801 submit=\u63D0\u4EA4 time=\u65F6\u95F4:{0}
i18n_zh_CN.properties
3.如何在页面上和Action 类中访问国际化资源文件的value 值:
1)在Aciton 类中,若Action 实现了TextProvider 接口,则可以调其getText() 方法获取value 值
> 通过继承ActionSupport 的方式
package com.jason.struts2.i18n; import java.util.Arrays; import java.util.Date; import com.opensymphony.xwork2.ActionSupport; public class TestI18nAction extends ActionSupport { /** * @Fields:serialVersionUID */ private static final long serialVersionUID = 1L; private Date date = null; public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } @Override public String execute() throws Exception { date = new Date(); // 1.在Actoin 中访问国际化资源文件的value 值 String username = getText("username"); System.out.println(username); // 2.带占位符 String time = getText("time", Arrays.asList(date)); System.out.println(time); return SUCCESS; } }
2)页面上可以使用<s:text> 标签;对于表单标签可以使用标签的Key 属性值。
> 若有占位符,则可以使用<s:text> 标签的<s:param> 子标签来填充多个占位符
> 若当前页面来自于Action 则可以直接访问Action 中的属性值
> 可以利用标签 和 OGNL 表单式直接访问值栈中的属性,(对象栈 额 map栈)
simple主题下:使用<s:text>
<s:form action="" theme="simple"> <!--label 方式 是把label 写死在标签里 --> <s:textfield name="username" label="UserName"></s:textfield> <!-- 若label 标签使用 %{getText('xxx')} 的方式就可以从国际化资源文件中获取value值。因为此时,在对象栈中, 有DefaultTextProvizer 的一个实例,该对象中提供了访问国际化资源文件的getText() 方法, 同时还需要告知 Struts2 框架 label 中放入的不在是一个普通的字符,而是一个OGNL 表达式,所以使用%{},强制进行OGNL 解析 --> <!-- 对于simple 主题 可以使用 <s:text name=""/> 标签来访问国际化资源文件中的value 值 --> <s:text name="username"/><s:textfield name="username" label="%{getText('userName')}"></s:textfield> <!-- 直接上资源文件中获取 value 值 --> <s:text name="username"/><s:textfield name="username" key="username"></s:textfield> <s:text name="password"/><s:textfield name="password" key="password"></s:textfield> <s:submit key="submit" value="%{getText('submit')}"></s:submit> </s:form>
其他的使用 key 来获取资源文件的value值
<s:form action="" > <!--label 方式 是把label 写死在标签里 --> <s:textfield name="username" label="UserName"></s:textfield> <!-- 若label 标签使用 %{getText('xxx')} 的方式就可以从国际化资源文件中获取value值。因为此时,在对象栈中, 有DefaultTextProvizer 的一个实例,该对象中提供了访问国际化资源文件的getText() 方法, 同时还需要告知 Struts2 框架 label 中放入的不在是一个普通的字符,而是一个OGNL 表达式,所以使用%{},强制进行OGNL 解析 --> <s:textfield name="username" label="%{getText('userName')}"></s:textfield> <!-- 直接上资源文件中获取 value 值 --> <s:textfield name="username" key="username"></s:textfield> <s:textfield name="password" key="password"></s:textfield> <s:submit key="submit" ></s:submit> </s:form>
4.通过超链接切换语言
1)关键之处在于知道Struts2 框架 是如何确定local 对象的
2)可以通过阅读 i18n 拦截器知道
i18n 拦截器运行流程
> Struts2 使用 i18n 拦截器 处理国际化,并且将其注册在默认的拦截器中
> i18n拦截器在执行Action方法前,自动查找请求中一个名为request_locale 的参数。如果该参数存在,拦截器就将其作为参数,转换成Locale对象,并将其设为用户默认的Locale(代表国家/语言环境)。并把其设置为 session 的 WW_TRANS_I18N_LOCALE 属性
> 若 request 没有名为request_locale 的参数,则 i18n 拦截器会从 Session 中获取 WW_TRANS_I18N_LOCALE 的属性值,若该值不为空,则将该属性值设置为浏览者的默认Locale
> 若 session 中的 WW_TRANS_I18N_LOCALE 的属性值为空,则从 ActionContext 中获取 Locale 对象。
具体实现:只需要在超链接的后面附着 request_locale 的请求参数:语言_国家代码
<a href="testI18n.acttion?request_locale=en_US">英文</a>
<a href="testI18n.acttion?request_locale=zh_CN">中文</a>
注意:超链接必须是一个strut2 的请求,即使 i18n 拦截器工作
相关文章推荐
- [原创]java WEB学习笔记55:Struts2学习之路---详解struts2 中 Action,如何访问web 资源,解耦方式(使用 ActionContext,实现 XxxAware 接口),耦合方式(通过ServletActionContext,通过实现 ServletRequestAware, ServletContextAware 等接口的方式)
- [原创]java WEB学习笔记67:Struts2 学习之路-- 类型转换概述, 类型转换错误修改,如何自定义类型转换器
- Struts2.x 学习笔记 之 通过超链接动态加载国际化资源文件
- [原创]java WEB学习笔记72:Struts2 学习之路-- 文件的上传下载,及上传下载相关问题
- [原创]java WEB学习笔记54:Struts2学习之路---概述,环境的搭建
- [原创]java WEB学习笔记71:Struts2 学习之路-- struts2常见的内建验证程序及注意点,短路验证,非字段验证,错误消息的重用
- [原创]java WEB学习笔记82:Hibernate学习之路---映射 一对多关联关系,配置,CRUD方法测试及注意点
- [原创]java WEB学习笔记70:Struts2 学习之路-- struts2拦截器源码分析,运行流程
- [原创]java WEB学习笔记63:Struts2学习之路--表单标签 用户注册模块
- [原创]java WEB学习笔记60:Struts2学习之路--Actioin-声明式异常处理
- [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系
- [原创]java WEB学习笔记78:Hibernate学习之路---session概述,session缓存(hibernate 一级缓存),数据库的隔离级别,在 MySql 中设置隔离级别,在 Hibernate 中设置隔离级别
- [原创]java WEB学习笔记64:Struts2学习之路--主题
- [原创]java WEB学习笔记77:Hibernate学习之路---Hibernate 版本 helloword 与 解析,.环境搭建,hibernate.cfg.xml文件及参数说明,持久化类,对象-关系映射文件.hbm.xml,Hibernate API (Configuration 类,SessionFactory 接口,Session 接口,Transaction(事务))
- [原创]java WEB学习笔记54:Struts2学习之路--- 编写Struts2 的第一个程序,HelloWord,简述 package ,action,result
- [原创]java WEB学习笔记56:Struts2学习之路---Struts 版本的 登录 demo
- [原创]java WEB学习笔记53:Struts2学习之路---前奏:使用 Filter 作为控制器的 MVC
- [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录
- [原创]java WEB学习笔记58:Struts2学习之路---Result 详解 type属性,通配符映射
- [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈