`
piperzero
  • 浏览: 3553570 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

spring中MessageSource的配置使用方法3--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),它们是formatexceptionswindows。通过ResourceBundle,使用JDK中解析消息的标准方式,来处理任何解析消息的请求。出于示例的目的,假定上面的两个资源文件的内容为…

# in 'format.properties'
message=Alligators rock!
# in 'exceptions.properties'
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>

    <!-- this MessageSource is being used in a web application -->
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="baseName" value="WEB-INF/test-messages"/>
    </bean>
    
    <!-- let's inject the above MessageSource into this POJO -->
    <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参数值。

# in 'exceptions_en_GB.properties'
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一同被注入。

分享到:
评论

相关推荐

    spring messageSource结合ehcache demo

    `messageSource`是Spring提供的一种用于处理多语言环境下的消息管理机制,而Ehcache则是一个广泛使用的Java缓存系统,它能够帮助我们在内存中存储常用数据,减少数据库的访问压力。 首先,我们需要理解Spring的`...

    spring-framework-3.0.0.RC3-with-docs.zip

    Spring 3.0.0.RC3在处理国际化和本地化方面也有所提升,通过ResourceBundleMessageSource和MessageSource接口,开发者可以轻松实现多语言环境下的应用。 通过这些特性,Spring 3.0.0.RC3不仅提升了开发者的开发...

    SpringBoot消息国际化配置实现过程解析

    4. 消息资源的加载:需要使用 ResourceBundleMessageSource 来加载消息配置文件,并使用 setBasenames 方法来设置配置文件的basename。 SpringBoot 消息国际化配置实现过程解析需要结合实际项目需求进行配置和实现...

    Spring2.5的国际化配置

    在配置文件中,通过创建一个 `bean` 并指定其 `id` 为 "messageSource",然后将 `class` 设置为 `org.springframework.context.support.ResourceBundleMessageSource`。`basename` 属性定义了基础资源文件名,例如 ...

    spring显示国际化信息

    - 在Spring MVC的配置文件(如`WebConfig.java`)中,添加`ResourceBundleMessageSource` bean来加载和管理这些资源文件。 - 示例配置: ```java @Bean public MessageSource messageSource() { ...

    基于SpringBoot 实现国际化配置的完整源码示例

    在Spring Boot应用中,配置国际化是一项重要的任务,它允许我们为不同的地区和语言提供相应的界面和文本。本项目提供了SpringBoot配置国际化的完整...Spring Boot默认使用`ResourceBundleMessageSource`实现`MessageSou

    SpringBoot 配置国际化完整源码

    如果使用Thymeleaf作为模板引擎,可以在模板文件中使用`th:text="#{message.key}"`来获取本地化文本。Spring Expression Language (SpEL)也可以在Java代码中表达式`#{message.key}`来获取。 5. **Maven配置**: `...

    Spring MVC实例 MVC注解配置

    在Spring MVC中,通常通过`@ModelAttribute`注解将数据绑定到模型对象,然后在视图中使用这些对象。 4. **视图(View)**: - 视图负责渲染和展示数据。Spring MVC支持多种视图技术,如JSP、Thymeleaf、FreeMarker...

    Spring实现国际化的一个小例子

    4. **在控制器中使用** 在Spring MVC的控制器中,我们可以使用`@RequestParam`、`@PathVariable`或其他方式获取请求中的语言参数。然后,通过`MessageSource`接口的`getMessage()`方法来获取对应语言的消息。例如:...

    Spring Boot 国际化(i18n)配置demo.zip

    通过这个例子,你可以了解到如何创建资源文件、配置消息源以及如何在控制器和视图中使用这些资源。 首先,国际化主要依赖于`MessageSource`接口,Spring Boot默认提供了基于`ResourceBundleMessageSource`的实现。`...

    10 扩展之Spring MVC中如何实现国际化i18n慕课专栏1

    可以使用XML配置或注解方式,Spring MVC中通常推荐使用注解方式。`basename`属性指定了locale目录下以`messages`开头的文件名。 在Controller中,我们需要添加处理Locale的请求响应方法。通过检测`Accept-Language`...

    spring2.5的applicationContext配置文件

    7. **国际化**:Spring支持多语言环境,通过`&lt;bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"&gt;`来配置消息源,使应用能够根据用户的语言环境显示相应的文本。...

    spring-core-4.3.15.RELEASE.jar

    - 4.3.15.RELEASE版本中,开发者可以通过`@MessageSource`注解和`ResourceBundleMessageSource`类来轻松实现国际化功能。 总的来说,Spring Core 4.3.15.RELEASE作为Spring框架的基础,提供了强大的DI、AOP、资源...

    Spring国际化案例

    3. **在代码中使用**:在Controller或Service层,我们可以使用`MessageSource`的`getMessage()`方法来获取国际化的消息。例如: ```java @Autowired private MessageSource messageSource; public String ...

    spring-2.0.x-api

    Spring 2.0.x提供了一套完整的国际化解决方案,包括MessageSource接口和ResourceBundleMessageSource类,方便地管理和使用多语言资源。 7. **Web服务支持** 2.0.x版本开始,Spring支持了Web服务,包括SOAP和...

    Spring-ws搭建WebService服务端demo

    在本文中,我们将深入探讨如何使用Spring框架与Spring-WS模块构建一个Web Service服务端的示例。Spring-WS是一个基于XML的Web Service框架,它提供了创建SOAP Web Service的简单方式。结合Maven进行项目管理,我们...

    spring boot国际化 i18n

    3. **在视图中使用**: 在Thymeleaf或JSP等模板引擎中,我们可以使用表达式来显示本地化消息。例如,在Thymeleaf中: ```html &lt;p th:text="#{greeting}"&gt;Hello ``` Thymeleaf会自动从`MessageSource`获取对应...

    spring国际化实例

    此外,`Thymeleaf`等模板引擎也支持Spring的国际化,可以直接在模板中使用`#{greeting}`这样的表达式来获取本地化消息。 总的来说,Spring框架通过`ResourceBundle`和`MessageSource`提供了一套强大的机制,使...

    spring mvc 3 国际化(下)——简单自定义操作

    在Spring MVC 3中,国际化是一项重要的功能,它允许我们为不同的地区和语言提供定制的显示内容。在“spring mvc 3 国际化(下)——简单自定义操作”这一主题中,我们将深入探讨如何自定义国际化过程,以满足特定的...

Global site tag (gtag.js) - Google Analytics