1. ApplicationContext 接口扩展了MessageSource 接口,因而提供了消息的处理能力即 i18n 或国际化
2. 看看接口中的方法定义:
2.1 String getMessage(String code, Object[] args, String defaultMessage, Locale locale); 用来从MessageSource中获取消息,当没有获取时使用 默认的消息参数 defaultMessage ; Object[] args 表示要设置的参数的值,new Object[] { 参数1,参数2,....}
2.2 String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException; 此方法没有默认消息,当没有获取时会抛出异常 NoSuchMessageException
2.3 String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException; 此方法的属性都封装在 MessageSourceResolvable 中,本方法可以指定 MessageSoruceResolvable 的实现
3. 工作原理:
3.1 当ApplicationContext加载时,他会自动在context 中加载 定义为MessageSource 的bean ,而且此bean 必须命名为 messageSource
3.2 如果加载找到了会将方法的调用交给 此bean 来处理,没找到则ApplicationContext 会在 其父类中查找同名的bean,如果找到将会委托给此bean,没找到任何消息bean,则会实例化一个空的 StaticMessageSource来接受此方法的调用。
3.3 spring 提供了 ResourceBundleMessageSource 和 StaticMessageSource 可以实现消息的处理,一般我们使用 ResourceBundleMessageSource 比较多
4. 实例如下:
4.1 在 application-context.xml 中
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<!-- core -->
<value>i18n/base/error</value>
<!-- basic-api -->
<value>i18n/auth/error</value>
<value>i18n/message/error</value>
<!-- elite-api -->
<value>i18n/position/error</value>
<value>i18n/user/error</value>
<!-- elite-app-web-c -->
<value>i18n/message</value>
</list>
</property>
</bean>
4.2 在 message.properties 中有:
hh=猎头
hr=HR
secrecy.name=某某
deliver.1.title=【简历投递】
deliver.2.title=【简历查看】
deliver.3.title=【简历通过】
deliver.4.title=【简历拒绝】
deliver.1.content={0} 收到了 {1} 的简历投递
deliver.2.content={0} 查看了 {1} 的简历
deliver.3.content={0} 通过了 {1} 的简历,线下会联系
deliver.4.content={0} 觉得 {1} 不适合该职位
4.3 在java 代码中 使用
MessageSource resources = new ClassPathXmlApplicationContext("beans.xml");
或者
@Autowired
private MessageSource messageSource;
String message = messageSource.getMessage("hh", null, null);
String secrecyName = messageSource.getMessage("secrecy.name", null, null);
for(int i=0;i<4;i++){
String content = messageSource.getMessage("deliver." + i + ".content",
new Object[] { message, secrecyName }, Locale.SIMPLIFIED_CHINESE);
String title = messageSource.getMessage("deliver." + i+ ".title", null, null);
}
System.out.println(“”message :“”+message );
System.out.println(“”secrecyName:“”+secrecyName );
System.out.println(“”content:“”+content );
System.out.println(“title”+title);
就可以获取 : message:猎头
secrecyName: 某某
content: 猎头 收到了 某某 的 简历投递
title:deliver.1.title=【简历投递】
。。。。
最后创建一个工具类 MessageUtil:
import java.util.Locale;
import org.springframework.context.MessageSource;
import org.springframework.context.NoSuchMessageException;
/**
* @author
*/
public class MessageUtil {
public static String message(String code, MessageSource messageSource) {
return message(code, messageSource, (Object[]) null);
}
public static String message(String code, MessageSource messageSource, Object... params) {
return message(code, messageSource, Locale.CHINA, params);
}
public static String message(String code, MessageSource messageSource, Locale locale, Object... params) {
return message(code, messageSource, "", locale, params);
}
public static String message(String code, MessageSource messageSource, String defaultMessage, Locale locale, Object... params){
if (messageSource == null) {
return code;
}
try {
return messageSource.getMessage(code, params, defaultMessage, locale);
} catch (NoSuchMessageException e) {
return code;
}
}
}