Spring笔记之八(国际化,资源文件的加载)

国际化支持在实际开发中可能是最常用的特性,本文分析Spring的 ApplicationContext 提供国际化支持, 其提供了更加强大的功能,如信息的自动装配以及热部署功能(配置文件修改后自动读取,而无需重新启动应用程序)。
    目前Spring中提供了两个 MessageSource接口的实现,即ResourceBundleMessageSourceReloadableResourceBundleMessageSource,后者提供了无需重启即可重新加载配置信息的特性。

   
    在下面的配置文件中,通过MessageResource的一个实现类org.springframework.context.support.ResourceBundleMessageSource来获得国际化的信息。
 1  < beans >
 2  < description > Spring Quick Start </ description >
 3  < bean  id ="messageSource"
     class
="org.springframework.context.support.ResourceBundleMessageSource" >
 4  < property  name ="basenames" >
 5  < list >
 6  < value > messages </ value >
 7  </ list >
 8  </ property >
 9  </ bean >
10  </ beans >
11 

这里声明了一个名为 messageSource Bean 注意: 对于Message定义,Bean ID必须为messageSource,这是目前Spring的编码规约),对应类为ResourceBundleMessageSource

而其中的basename属性用來设定资源信息文件的前置文件名称,在本例中为messagesSpring会自动在CLASSPATH根路径中按照如下顺序搜寻资源信息文件并进行加载(以Localezh_CN为例,其实Spring在实际上调用了JDKResourceBundle读取配置文件) :

messages_zh_CN.properties

messages_zh.properties

messages.properties

messages_zh_CN.class <!--[endif]-->

messages_zh.class

messages.class

<!--[if !supportLists]--> 资源配置信息文件中的内容

1 messages_zh_CN.properties:
2 userinfo=当前登录用户: [{0}] 登录时间:[{1}]
3 messages_en_US.properties:
4 userinfo=Current Login user: [{0}] Login time:[{1}]
5 

   测试代码:
1 ApplicationContext ctx =
               
new FileSystemXmlApplicationContext("bean.xml");
2 Object[] arg = new Object[]
3 "Erica", Calendar.getInstance().getTime()
4 };
5 //以系统默认Locale加载信息(对于中文WinXP而言,默认为zh_CN)
6 String msg = ctx.getMessage("userinfo", arg);
7 System.out.println("Message is ===> "+msg);
8 

代码中,我们将一个Object数组arg作为参数传递给ApplicationContext.getMessage方法,这个参数中包含了出现在最终文字信息中的可变内容,ApplicationContext  将根据参数中的Locale信息对其进行处理(如针对不同   Locale设定日期输出格式),并用其替换配置文件中的{n}标识(n代表参数数组中的索引,从开始)。

运行上面的代码,得到以下输出的内容:
   Message is ===> |
ì〃¤?°|ì???¨???: [Erica] |ì???¨o〃¤??:[07-9-27 上午1:27]

针对ResourceBundle的编码过程中发生的问题。这是由于转码过程中产生的编码问题引发的。比较简单的解决办法是通过JDK提供的转码工具native2ascii.exe  进行转换。执行: native2ascii messages_zh_CN.properties msg.txt。 再用msg.txt文件替换Messages_zh_CN.properties       文件。

   再次运行示例代码,得到正确输出:

   Message is ===> 当前登录用户: [Erica] 登录时间:[07-9-27 上午1:30]

尝试在代码中指定不同的Locale参数:

String msg = ctx.getMessage("userinfo", arg, Locale.US); 再次运行,可以看到:

Message is ===> Current Login user: [Erica] Login time::[9/27/07 1:35AM]

可见,前者根据当前默认Locale"zh_CN"getMessage方法自动加载了messages_zh_CN.properties文件;后者getMessage方法根据指定编码"en_US"加载了messages_en_US.properties文件。

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值