spring中MessageSource的配置使用方法--ResourceBundleMessageSource

转载 2016年06月08日 17:35:20

spring中MessageSource的配置使用方法--ResourceBundleMessageSource


ApplicationContext接口扩展了MessageSource接口,因而提供了消息处理的功能(i18n或者国际化)。与HierarchicalMessageSource一起使用,它还能够处理嵌套的消息,这些是Spring提供的处理消息的基本接口。让我们快速浏览一下它所定义的方法:

  • String getMessage(String code, Object[] args, String default, Locale loc):用来从MessageSource获取消息的基本方法。如果在指定的locale中没有找到消息,则使用默认的消息。args中的参数将使用标准类库中的MessageFormat来作消息中替换值。

  • String getMessage(String code, Object[] args, Locale loc):本质上和上一个方法相同,其区别在:没有指定默认值,如果没找到消息,会抛出一个NoSuchMessageException异常。

  • String getMessage(MessageSourceResolvable resolvable, Locale locale):上面方法中所使用的属性都封装到一个MessageSourceResolvable实现中,而本方法可以指定MessageSourceResolvable实现。

当一个ApplicationContext被加载时,它会自动在context中查找已定义为MessageSource类型的bean。此bean的名称须为messageSource。如果找到,那么所有对上述方法的调用将被委托给该bean。否则ApplicationContext会在其父类中查找是否含有同名的bean。如果有,就把它作为MessageSource。如果它最终没有找到任何的消息源,一个空的StaticMessageSource将会被实例化,使它能够接受上述方法的调用。

Spring目前提供了两个MessageSource的实现:ResourceBundleMessageSourceStaticMessageSource。它们都继承NestingMessageSource以便能够处理嵌套的消息。StaticMessageSource很少被使用,但能以编程的方式向消息源添加消息。ResourceBundleMessageSource会用得更多一些,为此提供了一下示例:

<beans>
  <bean id="messageSource"
        class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames">
      <list>
        <value>format</value>
        <value>exceptions</value>
        <value>windows</value>
      </list>
    </property>
  </bean>
</beans>

这段配置假定在你的classpath中有三个资源文件(resource bundle),它们是format, exceptionswindows。通过ResourceBundle,使用JDK中解析消息的标准方式,来处理任何解析消息的请求。出于示例的目的,假定上面的两个资源文件的内容为…

<span class="lineannotation" style="font-style: italic;"># in 'format.properties'</span>
message=Alligators rock!
<span class="lineannotation" style="font-style: italic;"># in 'exceptions.properties'</span>
argument.required=The '{0}' argument is required.

下面是测试代码。因为ApplicationContext实现也都实现了MessageSource接口,所以能被转型为MessageSource接口

public static void main(String[] args) {
    MessageSource resources = new ClassPathXmlApplicationContext("beans.xml");
    String message = resources.getMessage("message", null, "Default", null);
    System.out.println(message);
}

上述程序的输出结果将会是...

Alligators rock!

总而言之,我们在'beans.xml'的文件中(在classpath根目录下)定义了一个messageSource bean,通过它的basenames属性引用多个资源文件;而basenames属性值由list元素所指定的三个值传入,它们以文件的形式存在并被放置在classpath的根目录下(分别为format.propertiesexceptions.propertieswindows.properties)。

再分析个例子,这次我们将着眼于传递参数给查找的消息,这些参数将被转换为字符串并插入到已查找到的消息中的占位符(译注:资源文件中花括号里的数字即为占位符)。

<beans>

    <span class="lineannotation" style="font-style: italic;"><!-- this <code class="interfacename">MessageSource</code> is being used in a web application --></span>
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="baseName" value="WEB-INF/test-messages"/>
    </bean>
    
    <span class="lineannotation" style="font-style: italic;"><!-- let's inject the above <code class="interfacename">MessageSource</code> into this POJO --></span>
    <bean id="example" class="com.foo.Example">
        <property name="messages" ref="messageSource"/>
    </bean>

</beans>
public class Example {

    private MessageSource messages;

    public void setMessages(MessageSource messages) {
        this.messages = messages;
    }

    public void execute() {
        String message = this.messages.getMessage("argument.required",
            new Object [] {"userDao"}, "Required", null);
        System.out.println(message);
    }

}

调用execute()方法的输出结果是...

The 'userDao' argument is required.

对于国际化(i18n),Spring中不同的MessageResource实现与JDK标准ResourceBundle中的locale解析规则一样。比如在上面例子中定义的messageSource bean,如果你想解析British (en-GB) locale的消息,那么需要创建format_en_GB.propertiesexceptions_en_GB.propertieswindows_en_GB.properties三个资源文件。

Locale解析通常由应用程序根据运行环境来指定。出于示例的目的,我们对将要处理的(British)消息手工指定locale参数值。

<span class="lineannotation" style="font-style: italic;"># in 'exceptions_en_GB.properties'</span>
argument.required=Ebagum lad, the '{0}' argument is required, I say, required.
public static void main(final String[] args) {
    MessageSource resources = new ClassPathXmlApplicationContext("beans.xml");
    String message = resources.getMessage("argument.required",
        new Object [] {"userDao"}, "Required", Locale.UK);
    System.out.println(message);
}

上述程序运行时的输出结果是...

Ebagum lad, the 'userDao' argument is required, I say, required.

MessageSourceAware接口还能用于获取任何已定义的MessageSource引用。任何实现了MessageSourceAware接口的bean将在创建和配置的时候与MessageSource一同被注入。

Java for Web学习笔记(七三):国际化i18n(1)使用Spring框架MessageSource

一般性了解 我们在JSTL fmt[1]中已经接触过国际化i18n,本地化L10n。使用JSTL fmt(Internationalization and Formatting tag library...
  • flowingflying
  • flowingflying
  • 2017年07月29日 22:21
  • 1859

Spring-国际化信息02-MessageSource接口

概述 MessageSource接口方法 MessageSource类结构 ResourceBundleMessageSource 实例 ReloadableResourceBundleMessage...
  • yangshangwei
  • yangshangwei
  • 2017年08月11日 04:05
  • 2134

【Spring4揭秘 基础4】国际化--MessageSource

假设我们正在开发一个支持多国语言的Web应用程序,要求系统能够根据客户端的系统的语言类型返回对应的界面:英文的操作系统返回英文界面,而中文的操作系统则返回中文界面——这便是典型的i18n国际化问题。对...
  • u011179993
  • u011179993
  • 2016年06月01日 10:31
  • 4435

spring中MessageSource的配置使用方法

转   Spring定义了访问国际化信息的MessageSource接口,并提供了几个易用的实现类。首先来了解一下该接口的几个重要方法:   String getMessage(String c...
  • fendou4533
  • fendou4533
  • 2014年05月23日 11:20
  • 1675

messagesource读取properties

xml中配置: classpath:web 程序中注入: @Resource private MessageSource messa...
  • sunhuwh
  • sunhuwh
  • 2015年05月16日 23:59
  • 1635

spring 加载资源文件的两个类ResourceBundleMessageSource和ReloadableResourceBundleMessageSource

在Spring 中可以使用以下两个类加载资源文件:org.springframework.context.support.ResourceBundleMessageSource和org.springf...
  • qq_31230529
  • qq_31230529
  • 2015年09月14日 11:04
  • 468

PropertyPlaceholderConfigurer和ReloadableResourceBundleMessageSource区别

PropertyPlaceholderConfigurer We use PropertyPlaceholderConfigurer when we need to load some pr...
  • caomiao2006
  • caomiao2006
  • 2016年07月10日 17:26
  • 597

spring中ResourceBundleMessageSource的配置使用方法

ApplicationContext接口扩展了MessageSource接口,因而提供了消息处理的功能(i18n或者国际化)。与HierarchicalMessageSource一起使用,它还能够处理...
  • qq_31230529
  • qq_31230529
  • 2015年09月14日 11:18
  • 1459

Spring Boot中实现可重载的MessageSource简明教程

引言: 在Spring Boot中messages中定义的信息,如果发生变更,则需要重启应用。那该如何实现才可以不重启应用的情况下替换messages中的展示信息呢?本文将给出一个简要的教程。1. M...
  • blueheart20
  • blueheart20
  • 2017年09月28日 10:56
  • 3917

spring中MessageSource的配置使用方法2--ReloadableResourceBundleMessageSource

如何在spring mvc框架中实现MessageSource来管理国际资源文件呢 如下: 1.在applicationContext.xml文件内配置如下 [java]...
  • u014704496
  • u014704496
  • 2014年08月31日 12:54
  • 278
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spring中MessageSource的配置使用方法--ResourceBundleMessageSource
举报原因:
原因补充:

(最多只允许输入30个字)