Spring国际化--从数据库读取messageSource
2015-10-29 16:51
204 查看
从数据库读取messageSource
一直以来用Spring做国际化,都将国际化信息写在properties文件中。这次在项目中遇到一个需求,需要把properties文件去掉,直接从数据库读取国际化信息。从数据库读取messageSource可以将properties文件的管理界面化,数据化。
SPRING 国际化
从数据库读取messageSource
方便维护
注意:读取xml配置文件的顺序
Spring配置代码块
<!-- 定义国际化文件和编码 --> <bean id="propertiesMessageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames" value="messages/message"/> <property name="defaultEncoding" value="utf8" /> </bean> <!-- 使用session判断用户语言 --> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"> <property name="defaultLocale" value="cn"/> </bean> <mvc:interceptors> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> <property name="paramName" value="locale"/> </bean> </mvc:interceptors> <!-- 数据库国际化资源 自定义的MessageResource --> <bean id="messageSource" class="com.platform.i18n.MessageResource"> <property name="parentMessageSource" ref="propertiesMessageSource"/> </bean>
cookie的国际化暂时没有进行配置,通过重写MessageResource后,就可以从数据库读取信息了。目前这样的配置也可以读取properties文件中的国际化信息。
dto代码
/** * 根据properties定义的对象 * */ package com.platform.i18n.dto; import java.io.Serializable; public class Resource implements Serializable { //唯一标识 private long resourceId; //键名 private String name; //值 private String text; //对应的语言 private String language; public long getResourceId() { return resourceId; } public void setResourceId(long resourceId) { this.resourceId = resourceId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getText() { return text; } public void setText(String text) { this.text = text; } public String getLanguage() { return language; } public void setLanguage(String language) { this.language = language; } }
自定义的MessageSource代码
package com.platform.i18n; /** * messageSource自定义代码 */ import java.text.MessageFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import org.springframework.context.ResourceLoaderAware; import org.springframework.context.support.AbstractMessageSource; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.ResourceLoader; import com.genertech.web.platform.i18n.dto.Resource; public class MessageResource extends AbstractMessageSource implements ResourceLoaderAware { @SuppressWarnings("unused") private ResourceLoader resourceLoader; /** * Map切分字符 */ protected final String MAP_SPLIT_CODE = "|"; private final Map<String, String> properties = new HashMap<String, String>(); public MessageResource() { reload(); } public void reload() { properties.clear(); properties.putAll(loadTexts()); } /** * * 描述:TODO * 查询数据 虚拟数据,可以从数据库读取信息,此处省略 * @return */ private List<Resource> getResource(){ List<Resource> resources = new ArrayList<Resource>(); Resource re = new Resource(); Resource re1 = new Resource(); re.setResourceId(1); re.setName("common.name"); re.setText("name"); re.setLanguage("en"); resources.add(0, re); re1.setResourceId(2); re1.setName("common.name"); re1.setText("\u59D3\u540D"); re1.setLanguage("cn"); resources.add(1, re1); return resources; } /** * * 描述:TODO * 加载数据 * @return */ protected Map<String, String> loadTexts() { Map<String, String> mapResource = new HashMap<String, String>(); List<Resource> resources = this.getResource(); for (Resource item : resources) { String code = item.getName() + MAP_SPLIT_CODE + item.getLanguage(); mapResource.put(code, item.getText()); } return mapResource; } /** * * 描述:TODO * @param code * @param locale 本地化语言 * @return */ private String getText(String code, Locale locale) { String localeCode = locale.getLanguage(); String key = code + MAP_SPLIT_CODE + localeCode; String localeText = properties.get(key); String resourceText = code; if(localeText != null) { resourceText = localeText; } else { localeCode = Locale.ENGLISH.getLanguage(); key = code + MAP_SPLIT_CODE + localeCode; localeText = properties.get(key); if(localeText != null) { resourceText = localeText; } else { try { if(getParentMessageSource() != null) { resourceText = getParentMessageSource().getMessage(code, null, locale); } } catch (Exception e) { logger.error("Cannot find message with code: " + code); } } } return resourceText; } @Override public void setResourceLoader(ResourceLoader resourceLoader) { this.resourceLoader = (resourceLoader != null ? resourceLoader : new DefaultResourceLoader()); } @Override protected MessageFormat resolveCode(String code, Locale locale) { String msg = getText(code, locale); MessageFormat result = createMessageFormat(msg, locale); return result; } @Override protected String resolveCodeWithoutArguments(String code, Locale locale) { String result = getText(code, locale); return result; } }
jsp页面调用国际化信息代码块
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@taglib prefix="spring" uri="http://www.springframework.org/tags" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> properties国际化信息显示:<br/> <spring:message code="common.emptyrecords"/><br/> 数据库读取的国际化信息显示:<br/> <spring:message code="common.name"/><br/> </body> </html>
温馨提示:每个项目的配置不同,一个项目中可能会有很多个xml配置文件,要注意xml之间的先后加载顺序。否则极易出现错误。
相关文章推荐
- Java NIO系列教程(五) 通道之间的数据传输
- Java多线程常问问题(二)
- Java多线程常问问题(一)
- 原生java调用webservice的方法,不用生成客户端代码
- 从头认识java-6.1 聚合(aggregation)
- 从头认识java-6.1 聚合(aggregation)
- Java-单例设计模式(基础)
- 一道题反映Java的类初始化过程
- SpringMVC 3.0 常用注解简介
- java常用类库之日期操作类
- java语言基础之面向对象3
- Java读取Excel数据
- JAVA内部类
- jdk之多线程Future框架解析
- java 多态
- Java中的匿名内部类
- java 深拷贝浅拷贝
- java中main方法详解
- eclipse安装插件提示Duplicate Location错误的解决办法
- java switch语句