[原创]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 ...
随机推荐
- BAE3.0上的java+tomcat代码发布
---------------------------------2016/01/25更新-------------------------------------- 最近两天去百度开放云,发现它再也 ...
- pdo封装类
<?php //http://www.imavex.com/php-pdo-wrapper-class/ class db extends PDO { private $error; priva ...
- 创建QT CREATOR对话框报错 linux QT Creator :-1: error: cannot find -lGL
装完QT5.4 及 QT Creator3.3 后 创建第一个QT Widgets Application(相当于窗体) 应用程序 报如上错误. 执行 sudo apt-get install lib ...
- pomelo架构概览
pomelo之所以简单易用.功能全面,并且具有高可扩展性.可伸缩性等特点,这与它的技术选型和方案设计是密不可分的.在研究大量游戏引擎设计思路基础上,结合以往游戏开发的经验,确定了pomelo框架的设计 ...
- VS2013编译Qt5.6.0静态库(乌合之众)
获取qt5.6.0源码包 直接去www.qt.io下载就好了,这里就不详细说了. 这里是我已经编译好的** 链接:http://pan.baidu.com/s/1pLb6wVT 密码: ak7y ** ...
- zepto源码--init--学习笔记
先展示init函数,由于笔记本屏幕太小,删掉了部分源码注释,才能在一屏内截图. 当我们调用$()的时候,便会直接调用zepto.init()生成zepto对象,跟jquery生成jquery对象类似. ...
- C/C++程序编译流程(预处理->编译->汇编->链接)
程序的基本流程如图: 1. 预处理 预处理相当于根据预处理指令组装新的C/C++程序.经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内 ...
- linux root不能用
在操作查看vi /etc/passwd 查看用户信息时,不小心修改了root的用户名改成了eoot,这样在切换到普通用户后,就切不回root,即使明明知道用户名是eoot,也知道原来的root密码,但 ...
- Cupid's Arrow---hdu1756(判断点与多边形的位置关系 模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1756 题意:中文题,套模板即可: /* 射线法:判断一个点是在多边形内部,边上还是在外部,时间复杂度为 ...
- HTML页引用CSS
方法1 使用import 方法引用CSS <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"&g ...