Spring攻略学习笔记(2.13)------解析文本消息
一、知识点
Spring的应用程序上下文能够根据关键字为目标语言环境解析文本消息。通常,一个语言环境的消息应该存储在一个独立的属性文件中,这个属性文件称作资源包(Resource bundle)。
MessageSource是一个定义了多种消息解析方法的接口。ApplicationContext接口扩展了这个接口,使得所有应用程序上下文都能解析文本消息。应用程序上下文将消息解析委托给名为messageSource的Bean。ResourceBundleMessageSource是最常见的MessageSource实现,它从资源包中解析不同语言环境的消息。
二、代码示例
创建美国英语资源包message_en_US.properties。
alert.checkout=A shopping cart has been checked out.
Bean配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/beans/spring-context-3.2.xsd">
<!-- 用ResourceBundleMessageSource作为MessageSource的实现。Bean名称必须设置为messageSource,应用程序上下文才能发现它。必须为ResourceBundleMessageSource指定资源包的基本名称 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename">
<value>messages</value>
</property>
</bean>
</beans>
对于这个MessageSource定义,如果寻找一个用于美国地区、首选语言为英语的文本消息,将首先考虑语言和国家都匹配的资源包messages_en_US.properties。如果没有找到这样的资源包或者消息,就会考虑仅匹配语言的messages_en.properties。如果还找不到,最终将选择用于所有地区的默认资源包messages.properties。
测试类
package com.jackie.codeproject.springrecipesnote.springadvancedioc;
import java.util.Locale;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author jackie
*
*/
public class MessageResolveTest {
@Test
public void testMessageResolve() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// getMessage方法要求应用程序上下文解析消息。第一个参数是关键字,第三个参数是目标语言环境。
String alert = applicationContext.getMessage("alert.checkout", null, Locale.US);
System.out.println(alert);
}
}
getMessage()方法的第二个参数是消息参数数组。可用索引值定义多个参数。
alert.checkout=A shopping cart costing {0} dollars has been checked out at {1}.
传入一个对象数组,数组元素在填写参数之前转换成字符串
String alert = applicationContext.getMessage("alert.checkout", new Object[]{4, new Date()}, Locale.US);
System.out.println(alert);
对于解析文本消息的Bean来说,必须实现ApplicationContextAware接口或者MessageSourceAware
package com.codeproject.jackie.springrecipesnote.springadvancedioc;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.Locale;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.MessageSource;
import org.springframework.context.MessageSourceAware;
/**
* Cashier类实现BeanNameAware感知接口和,StorageConfig标记接口和MessageSourceAware接口
* @author jackie
*
*/
public class Cashier implements BeanNameAware, StorageConfig, MessageSourceAware {
private String name;
private BufferedWriter writer;
private String path;
private MessageSource messageSource;
public void setPath(String path) {
this.path = path;
}
public void openFile() throws IOException {
File file = new File(path, name + ".txt");
FileWriter fw = new FileWriter(file, true);
writer = new BufferedWriter(fw);
}
public void checkout(ShoppingCart cart) throws IOException {
double total = 0;
for (Product product : cart.getItems()) {
total += product.getPrice();
}
writer.write(new Date() + "\t" + total + "\r\n");
writer.flush();
String alert = messageSource.getMessage("alert.checkout", new Object[] { total, new Date()}, Locale.US);
System.out.println(alert);
}
public void closeFile() throws IOException {
writer.close();
}
@Override
public String getPath() {
return path;
}
@Override
public void setBeanName(String beanName) {
this.name = beanName;
}
@Override
public void setMessageSource(MessageSource messageSource) {
this.messageSource = messageSource;
}
}

浙公网安备 33010602011771号