- 浏览: 308907 次
最新评论
-
nucleus:
为什么都是没有图的。。。。。。。求图片啊
《研磨struts2》第七章 值栈和OGNL 之 7.4 ActionContext和ServletActionContext -
nucleus:
为什么都是没有图的。。。。。。。求图片啊
《研磨struts2》第七章 值栈和OGNL 之 7.4 ActionContext和ServletActionContext -
nucleus:
为什么都是没有图的。。。。。。。求图片啊
《研磨struts2》第七章 值栈和OGNL 之 7.4 ActionContext和ServletActionContext -
nucleus:
为什么都是没有图的。。。。。。。求图片啊
《研磨struts2》第七章 值栈和OGNL 之 7.4 ActionContext和ServletActionContext -
hunanjun000:
《研磨struts2》第四章 Action 之 4.5 Action的其它重要知识
9.2 Java内置的国际化
Struts2的国际化也不是无本之木,它依赖于Java内置的国际化机制,只是在Java内置的国际化机制的基础上增加了跟Struts2其他组件的融合,使得其他组件也可以非常方便的使用国际化。
9.2.1 Java内置的国际化入门
1:准备国际化信息文件
Java内置的国际化,以java.util.ResourceBundle和java.util.Locale两个类为中心。其中, java.util.Locale负责选择合适的语言,而java.util.ResourceBundle负责根据注入的java.util.Locale对象来选择国际化信息的来源,返回国际化信息。
如果我们的软件支持中文和英文两种语言,而以中文作为默认的语言。则会出现三种语言,默认的语言(中文)、中文和英文,当然,其实只有两种语言中文和英文。但是,以中文为默认的语言是非常必要的。有时候,软件需要应对的语言不一定只有中文和英文;如果法国的朋友想要使用软件呢?由于不存在法文的信息,这时候只能返回默认的语言,那就是中文了。
在这种情况下准备国际化资源文件,一般准备三个文件,分别是默认语言、中文与英文的文件。
每个文件都以properties为扩展名,内容以key-value对的形式存在,其中key是如何引用这条信息,而value就是这条信息真正要显示的内容了。
综上所述,可以准备如下三个文件作为国际化信息的文件。
(1)默认语言文件:message.properties
注意:在这个文件中,本应该在“=”后面写上中文,但是,我们没有这样做,这是因为Java内置的国际化在处理中文的时候还需要一步特殊处理,这在后面有专门的章节处理,因此这里就没有使用中文了。
(2)中文语言文件:message_zh_CN.properties
注意:故意在两行之前都加了一个#,这在properties文件中代表注释的意思,也就是说这个message_zh_CN.properties实际上是空的。
(3)英文语言文件:message_en_US.properties
先不去考虑客户端怎么写,观察一下这三个文件的命名。它们拥有共通的前缀message,代表了它们是同一组国际化信息的不同语言;它们各自的后缀代表了自己的语言,其中没有后缀(message.properties)的文件,代表这是默认语言文件。
2:使用ResouceBundler和Locale选择多语言信息
将上面的三个文件拷贝到工程的src目录下备用。然后就可以在Java程序中引用这些多语言信息了。
在引用多语言信息的时候,要做三件事情:
- 引用哪种语言。
- 引用哪组多语言文件。
- 引用这种语言的这组文件里的哪条信息。
带着这三个问题,一起来看一下Java中的客户端:
- package cn.javass.i18n;
- import java.util.Locale;
- import java.util.ResourceBundle;
- public class Test {
- public static void main(String[] args) {
- //选择中文
- Locale locale1 = Locale.SIMPLIFIED_CHINESE;
- //选择message这组文件
- ResourceBundle bundle1 = ResourceBundle.getBundle("message",locale1);
- //选择其中的labela这一项
- System.out.println("bundle1=="+bundle1.getString("labela"));
- Locale locale2 = Locale.US;
- ResourceBundle bundle2 = ResourceBundle.getBundle("message",locale2);
- System.out.println("bundle2=="+bundle2.getString("labela"));
- Locale locale3 = Locale.FRANCE;
- ResourceBundle bundle3 = ResourceBundle.getBundle("message",locale3);
- System.out.println("bundle3=="+bundle3.getString("labela"));
- }
- }
Locale类里预置了许多语种,上面代码中引用的Locale.SIMPLIFIED_CHINESE对应zh_CN,Locale.US对应en_US,Locale.FRANCE对应fr_FR;也就确定了前面所说的文件名后缀。
ResouceBundle.getBundle方法传入的第一个参数就是要引用哪组文件,也就确定了前面所说的文件名前缀。
由前缀和后缀共同作用取得的ResourceBundle对象就代表了一个文件中的所有多语言信息,它的getString方法传入的参数就是前面所说的key,而且返回值就是实际需要的value。
运行测试一下,结果如下:
9.2.2对中文的支持
在上一节中并没有在message.properties中写中文。现在,试着写一下中文,把“labela in zh_CN”改成“labela in 中文”,发现eclipse根本保存不了,eclipse会报错,这是因为properties文件只支持ascii码,而中文使用了Unicode,这该怎么办呢?
方法特别简单,找个工具把中文转换成ascii码就可以了,比如native2ascii的工具,它可以在jdk安装路径下的bin目录中找到。
使用native2ascii的基本步骤如下:
- 1、要先把message.proerties改个名字,比如为src_message.properties,因为message.properties这个文件要用来存储操作后的内容。
- 2、用文本编辑器来编辑src_message.properties,加入中文。
3、在cmd窗口中找到工程的src文件夹,运行如下命令。
然后在eclipse中刷新一下工程,会发现多出了message.properties,里面的内容为
这就是转换后的中文。
再次运行上一节的java客户端,我们可以发现,中文已经能正确显示了。
提示:为了保证知识的紧凑,这里只是用了最原始的方法调用了native2ascii,在真正的项目中会有更好的方法去调用,比如写ant脚本、使用eclipse插件等等。
9.2.3向国际化信息传入参数
在实际项目中,只是在国际化信息文件中写死一个字符串还并不能满足要求。比如,用户可能会对已经确定的订单进行修改操作,但是这时候商品已经出库,所以订单就不允许修改了。
这种情况下,通常需要提示用户:“您的订单已处理,商品已出库,不允许修改”。可是,一个用户有可能有多张订单,这样一句简单的提示会让用户迷惑,到底哪张订单不允许修改啊?
如果写出更友好的提示,比如:“您的订单(201009290001)已处理,商品已出库,不允许修改”,这就明确了很多。
该怎么实现这种功能呢?
这时候,光用前面学的国际化知识就不够了。前面在国际化文件中写的文本都是死的,但是,订单号显然不能在文本中写死,因为任何一张订单都有可能不允许修改。对于这种情况,可以把订单编号作为参数传入国际化信息内。
要向国际化信息传入参数,需要考虑两方面事情:
- 在编写国际化信息时,如何给参数留出位置?
- 在客户端访问国际化信息时,如何把参数传入预定的位置?
在国际化信息中,是使用索引的方式来进行占位。可以将默认语言的国际化信息修改一下,为了简单,避免去转换中文,就用英文来示例了,示例如下:
在客户端中,需要使用MessageFormat类将参数合成进读出的国际化信息中,示例如下:
- public class Test {
- public static void main(String[] args) {
- //选择中文
- Locale locale1 = Locale.SIMPLIFIED_CHINESE;
- //选择message这组文件
- ResourceBundle bundle1 = ResourceBundle.getBundle("message",locale1);
- //选择其中的labela这一项
- String message = bundle1.getString("labela");
- //将参数合成进读出的国际化信息
- String info = MessageFormat.format(message, "201009290001");
- System.out.println(info);
- }
- }
运行的结果为:
有朋友可能会说,那怎么传入多个参数呢?比如把国际化的信息修改成如下示例:
那么在程序里面,只要把传入的参数改成数组就可以了,示例如下:
- public class Test {
- public static void main(String[] args) {
- //选择中文
- Locale locale1 = Locale.SIMPLIFIED_CHINESE;
- //选择message这组文件
- ResourceBundle bundle1 = ResourceBundle.getBundle("message",locale1);
- //选择其中的labela这一项
- String message = bundle1.getString("labela");
- //将参数合成进读出的国际化信息
- String[] params = new String[2];
- params[0] = "Petter";
- params[1] = "201009290001";
- String info = MessageFormat.format(message, params);
- System.out.println(info);
- }
- }
运行的结果如下:
9.2.4小结
本节中介绍的都是Java内置的国际化信息的使用,而Struts2的国际化,是在Java内置的国际化支持的基础上对其包装使用,因此,以上的特性在Struts2中都得到了体现,也就是说在这节中学到的知识,到Struts2中仍然有用。
私塾在线网站原创《研磨struts2》系列
转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4084.html】
欢迎访问http://sishuok.com获取更多内容
发表评论
-
研磨struts2 目录贴
2012-08-24 12:12 163331.1 《研磨struts2》 第一章 Struts2 ... -
跟着cc学设计 之 研磨设计模式 视频教程 出炉了
2012-08-15 07:16 2研磨设计模式——跟着CC学设计系列精品课程,上线了! ... -
研磨struts2 目录
2012-07-30 21:15 2471.1 《研磨struts2》 第一章 Strut ... -
研磨struts2 目录
2012-07-30 16:54 361.1 《研磨struts2》 第一章 Stru ... -
《研磨struts2》A.2 struts.properties的配置 之 A.2.1 概述
2012-07-09 12:10 3055A.2.1 概述 如果我们希望覆盖在 ... -
《研磨struts2》附录A Struts2的配置 之 A.1 struts.xml的配置
2012-07-09 12:10 2710A.1 struts.xml的配置 A.1.1 ... -
《研磨struts2》第二十一章 零配置 之 21.3 通过注解来实现零配置
2012-07-06 08:07 291121.3 通过注解来实现零配置 21.3.1 ... -
《研磨struts2》第二十一章 零配置 之 21.2 约定大于配置
2012-07-05 10:44 245821.2 约定大于配置 21.2.1 约定 ... -
《研磨struts2》第二十一章 零配置 之 21.1 概述
2012-07-05 10:44 231321.1 概述 21.1.1 零配置概述 在 ... -
《研磨struts2》第二十章 整合SiteMesh 之 20.3 整合Struts2与SiteMesh
2012-07-04 08:15 2072在Struts2中使用SiteMesh ... -
《研磨struts2》第二十章 整合SiteMesh 之 20.2 单独使用SiteMesh
2012-07-03 08:00 209120.2 单独使用SiteMesh 20. ... -
《研磨struts2》第二十章 整合SiteMesh 之 20.1 调整应用的风格
2012-07-03 07:59 185520.1 调整应用的风 ... -
《研磨struts2》19.2 使用execAndWait拦截器模拟进度条 之 19.2.1 模拟长时间运行的Action
2012-07-02 12:24 213719.2.1模拟长时间运行的Action ... -
《研磨struts2》第十九章 进度条 之 19.1 使用“进度条”告知用户进度
2012-07-02 12:23 214119.1 使用“进度条”告知用户进度 ... -
《研磨struts2》第十八章 结合JFreeChart 之 18.3 Struts2结合JFreeChart
2012-06-28 12:12 199918.3 Struts2结合JFreeChart ... -
《研磨struts2》第十八章 结合JFreeChart 之 18.2 Struts2插件概述
2012-06-28 12:11 2022Struts2并没有求大求全,企图把所有 ... -
《研磨struts2》第十八章 结合JFreeChart 之 18.1 JFreeChart使用
2012-06-20 15:48 227818.1 JFreeChart使用 18.1.1概 ... -
研磨struts2(1-10章)电子书下载
2012-06-19 07:30 6058研磨struts2的博客文章 私塾在线学习网 《研 ... -
《研磨struts2》第十七章 防止重复提交 之 17.3 更强大的tokenSession拦截器
2012-06-18 13:46 206917.3 更强大的tokenSession拦截器 ... -
《研磨struts2》第十七章 防止重复提交 之 17.2 使用标签
2012-06-18 13:45 233317.2 使用<s:token/>标签 ...
相关推荐
Struts2是一个强大的Java web应用程序框架,用于构建和维护可扩展、模块化且易于管理的Web应用。这个压缩包中的“研磨Struts2配书视频对应的演示源代码”是《研磨Struts2》一书作者为了帮助读者更好地理解和实践书中...
为了让应用程序能够适应不同的语言环境,Struts2提供了国际化支持。 #### 11.2 国际化实现 - **资源文件**:使用.properties文件来存放不同语言的文本。 - **切换语言**:可以通过设置locale参数来切换语言。 ###...
由于文件较大,我把这个文档切割为2部分,这是第一部分,请下载完第一部分后一定要下载第二部分,否则不能阅读。
Struts2的国际化和本地化支持也是重要的知识点,这对于构建多语言的应用至关重要。 在实际开发中,Struts2的异常处理机制和错误页面配置也是不可忽视的部分。开发者需要了解如何优雅地处理程序中的异常,以及如何...
相比于第一代Struts框架,Struts 2提供了更多的功能,如拦截器、动态方法调用、更强大的表单处理机制等,并且它与Spring和Hibernate等其他Java EE技术栈的集成更加紧密。 ### Struts 2的特点 1. **强大的表单处理...
研磨Struts2 高清完整版,请和第一部分一起下载啊
12. **其他重要知识**:Struts2还涉及国际化、异常处理、主题与皮肤、动态方法调用等多个高级主题,这些内容使得Struts2能够应对复杂的Web应用需求。 通过《研磨Struts2》,读者可以系统地学习Struts2框架的各个...
研磨Struts2_12859679_高清完整版
研磨Struts2-高清-完整目录-2011年10月,分享给所有需要的人
Java的研磨设计模式是将这些模式应用到Java编程中的具体体现,它能够帮助开发者编写出更加灵活、可维护和可扩展的代码。本篇文章将深入探讨设计模式的核心概念,并通过Java实例来解析这些模式。 1. 单例模式:确保...
Java工程师三大框架面试题.pdf
第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) ...
第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) ...
这三本书籍——《JVM深入理解java虚拟机》、《Spring揭秘》和《研磨Struct2》分别涵盖了Java技术栈中的核心组件、企业级应用开发框架以及一个流行的Web框架,对于深化Java知识体系具有极大的帮助。 首先,《JVM深入...