[原创]java WEB学习笔记69:Struts2 学习之路-- 消息处理与国际化,概述,配置国际资源文件,访问国际化消息,通过超链接切换语言
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用
内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。
本人互联网技术爱好者,互联网技术发烧友
微博:伊直都在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=UserName
password=Password
submit=Submit
time=Time:{0}
i18n.properties
username=UserName
password=Password
submit=Submit
time=Time:{0}
i18n_en_US.properties
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学习笔记69:Struts2 学习之路-- 消息处理与国际化,概述,配置国际资源文件,访问国际化消息,通过超链接切换语言的更多相关文章
- Android(java)学习笔记69:JDK5之后的Lock锁的概述和使用
1. Lock锁的概述: java.util.concurrent.locks,接口Lock 首先Lock是一个接口,Lock实现提供了比使用synchronized方法 和 同步代码块更为广泛的锁定 ...
- [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记95:Hibernate 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Java后台处理框架之struts2学习总结
Java后台处理框架之struts2学习总结 最近我在网上了解到,在实际的开发项目中struts2的使用率在不断降低,取而代之的是springMVC.可能有很多的朋友看到这里就会说,那还不如不学str ...
- 学习笔记:CentOS7学习之二十:shell脚本的基础
目录 学习笔记:CentOS7学习之二十:shell脚本的基础 20.1 shell 基本语法 20.1.1 什么是shell? 20.1.2 编程语言分类 20.1.3 什么是shell脚本 20. ...
- 学习笔记:CentOS7学习之十九:Linux网络管理技术
目录 学习笔记:CentOS7学习之十九:Linux网络管理技术 本文用于记录学习体会.心得,兼做笔记使用,方便以后复习总结.内容基本完全参考学神教育教材,图片大多取材自学神教育资料,在此非常感谢MK ...
- HTML+CSS学习笔记 (6) - 开始学习CSS
HTML+CSS学习笔记 (6) - 开始学习CSS 认识CSS样式 CSS全称为"层叠样式表 (Cascading Style Sheets)",它主要是用于定义HTML内容在浏 ...
- 学习笔记:CentOS7学习之二十五:shell中色彩处理和awk使用技巧
目录 学习笔记:CentOS7学习之二十五:shell中色彩处理和awk使用技巧 25.1 Shell中的色彩处理 25.2 awk基本应用 25.2.1 概念 25.2.2实例演示 25.3 awk ...
随机推荐
- SQL2008全部数据导出导入两种方法【转】
方法一:生成脚本导出导入sql2008全部数据 第一步,右键要导出的数据库,任务--生成脚本 第二步,在设置脚本编写选项处,点击--高级(A),选择要编写脚本的数据的类型为:架构和数据 如果找 ...
- foreach遍历 < 创建表 >练习题
原表如下: 效果图如下: <table border="1" width="500" height="260"><tr&g ...
- 智能手机,医疗诊断,云会议(gotomeeting/citrix)
在诊断领域已出现很多大有希望的创新,它们可能会起到真正的变革作用. 例如,有一种新技术可以让健康护理工作者用一部智能手机拍摄高质量的视网膜图像.这些数码照片像素很高,足以帮助检测白内障.黄斑退化.糖尿 ...
- 国外it网站收集
1.http://news.com.com/2.http://www.zdnet.com/3.http://www.salon.com/tech/index.html4.http://www.brin ...
- sqlserver中常用的全局变量
变量 Transact-SQL语言中有两种形式的变量,一种是用户自己定义的局部变量,另外一种是系统提供的全局变量.局部变量 局部变量是一个能够拥有特定数据类型的对象,它的作用范围仅限制在程序内部.局部 ...
- J2SE 1.6 特性:java.lang.instrument
1. import java.lang.instrument.Instrumentation; public class ObjectSizeFetcher { private static Inst ...
- 逻辑运算符——逻辑与&&、逻辑或||
一直以来,都是认为逻辑运算符返回的是布尔值,却突然发现:并不是这样. 对于||来说,如果条件判断结果为true就返回第一个操作数的值,如果为false就返回第二个操作数的值. &&则相 ...
- Linux的常用基本命令
Linux的常用基本命令. 首先启动Linux.启动完毕后需要进行用户的登录,选择登陆的用户不同自然权限也不一样,其中“系统管理员”拥有最高权限. 在启动Linux后屏幕出现如下界面显示: …… Re ...
- CodeMIrror 简单使用
代码高亮是程序员的刚需,不管是在笔记类,论坛类,博客类web网站中,都对代码高亮提出要求,不高亮的代码阅读体验很差,codeMirror是一个前端代码高亮库,使用方便. codeMirror可以直接在 ...
- 在CentOS下企图整合Apache和Tomcat依然失败
环境: 64位CentOS Linux version 2.6.32-431.el6.x86_64 CentOS release 6.5 (Final) Apache/2.2.15,mod_jk/1 ...