这里声明了一个名为 messageSource 的Bean( 注意: 对于Message定义,Bean ID必须为messageSource,这是目前Spring的编码规约),对应类为ResourceBundleMessageSource。
而其中的basename属性用來设定资源信息文件的前置文件名称,在本例中为messages。Spring会自动在CLASSPATH根路径中按照如下顺序搜寻资源信息文件并进行加载(以Locale为zh_CN为例,其实Spring在实际上调用了JDK的ResourceBundle读取配置文件) :
messages_zh_CN.properties
messages_zh.properties
messages.properties
messages_zh_CN.class <!--[endif]-->
messages_zh.class
messages.class
<!--[if !supportLists]--> 资源配置信息文件中的内容
代码中,我们将一个Object数组arg作为参数传递给ApplicationContext.getMessage方法,这个参数中包含了出现在最终文字信息中的可变内容,ApplicationContext 将根据参数中的Locale信息对其进行处理(如针对不同 Locale设定日期输出格式),并用其替换配置文件中的{n}标识(n代表参数数组中的索引,从1 开始)。
运行上面的代码,得到以下输出的内容:
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文件。