您的位置:首页 > 编程语言 > Java开发

SpringMvc国际化 根据不同请求调用不同的资源文件

2014-04-18 12:34 513 查看
参考自:/article/4905492.html

项目中有两个资源文件如下:

messages_en_US.properties内容如下:

label.message.name=hello


test_en_US.properties内容如下:

label.message.name=hello test


现要实现一功能,就是模块1要取test_en_US.properties中的内容,其他模块取messages_en_US.properties中的内容

实现方法:在模块1的controller中的request作用域放一个标识:如

@RequestMapping(value = "/login.json", method = RequestMethod.GET)
public String login(HttpServletRequest request) {
request.setAttribute("testrequest", "test");
return "login";
}


扩展一个类继承ReloadableResourceBundleMessageSource或ResourceBundleMessageSource

代码如下:

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Properties;

import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

public class ReloadMessageResourceExtesion extends ReloadableResourceBundleMessageSource {

private static List<Locale> supporedLocales = new ArrayList<Locale>();
private String[] basefilenames = new String[0];

public void setBasenames(String[] basenames) {
if (basenames != null) {
this.basefilenames = new String[basenames.length];
for (int i = 0; i < basenames.length; i++) {
String basename = basenames[i];
Assert.hasText(basename, "Basename must not be empty");
this.basefilenames[i] = basename.trim();
}
}
else {
this.basefilenames = new String[0];
}
super.setBasenames(basenames);
}

public static List<Locale> getSupporedLocales() {

return supporedLocales;
}

public Properties getAllProperties(String filename){
return super.getProperties(filename).getProperties();

}
public Properties getAllProperties(Locale locale){
return super.getMergedProperties(locale).getProperties();

}
public String getMessage(String code, Locale locale){
return super.resolveCodeWithoutArguments(code,locale);
}

@Override
protected String resolveCodeWithoutArguments(String code, Locale locale) {
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
final String testrequest = (String) attr.getAttribute("testrequest", RequestAttributes.SCOPE_REQUEST);
for(String basename : basefilenames) {
if (StringUtils.endsWithIgnoreCase(basename,testrequest)) {
List<String> filenames = calculateAllFilenames(basename, locale);
for (String filename : filenames) {
PropertiesHolder propHolder = getProperties(filename);
String result = propHolder.getProperty(code);
if (result != null) {
return result;
}
}
}
}
return super.resolveCodeWithoutArguments(code, locale);
}

}




import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

public class MessageResourceExtesion extends ResourceBundleMessageSource {
private String[] basenames = new String[0];

@Override
protected String resolveCodeWithoutArguments(String code, Locale locale) {
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
final String testrequest = (String) attr.getAttribute("testrequest", RequestAttributes.SCOPE_REQUEST);

logger.debug(testrequest);

for (String basename : basenames) {
if (StringUtils.endsWithIgnoreCase(basename, testrequest)) {
ResourceBundle bundle = getResourceBundle(basename, locale);
if (bundle != null) {
return getStringOrNull(bundle, code);
}
}
}
return super.resolveCodeWithoutArguments(code, locale);
}

public void setBasenames(String... basenames) {
if (basenames != null) {
this.basenames = new String[basenames.length];
for (int i = 0; i < basenames.length; i++) {
String basename = basenames[i];
Assert.hasText(basename, "Basename must not be empty");
this.basenames[i] = basename.trim();
}
} else {
this.basenames = new String[0];
}
super.setBasenames(basenames);
}

private String getStringOrNull(ResourceBundle bundle, String key) {
try {
return bundle.getString(key);
} catch (MissingResourceException ex) {
return null;
}
}

}


在springmvc-servlet中定义如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 
<mvc:annotation-driven />
<context:component-scan base-package="com.mongo.web"></context:component-scan>

<!--
<bean id="messageSource"  class="com.mongo.util.ReloadMessageResourceExtesion">
<property name="basenames">
<list>
<value>classpath:i18n/messages</value>
<value>classpath:i18n/test</value>
</list>
</property>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
-->
<bean id="messageSource"  class="com.mongo.util.MessageResourceExtesion">
<property name="basenames">
<list>
<value>i18n.messages</value>
<value>i18n.test</value>
</list>
</property>
</bean>

<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang" />
</bean>

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" >
<property name="defaultLocale" value="en_US" />
</bean>

<bean id="handlerMapping"  class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors"> <ref bean="localeChangeInterceptor" /></property>
</bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
web.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
<!-- spring -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:*.xml
</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- spring MVC配置 -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>*.json</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
</web-app>


controller如下:

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.mongo.dao.MongoDao;

@Controller
public class LoginController {

@Autowired
MongoDao mongodao;

@RequestMapping(value = "/login.json", method = RequestMethod.GET) public String login(HttpServletRequest request) { request.setAttribute("testrequest", "test"); return "login"; }
@RequestMapping(value = "/index.json", method = RequestMethod.GET)
public String index(){
return "index";
}

}


两个jsp文件如下:

login.jsp

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%
response.setHeader("Pragma","no-cache");
response.setHeader("Cache-Control","no-cache, no-store, must-revalidate, private");
%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="ctx" value="<%=request.getContextPath() %>"></c:set>
<c:set var="scheme" value="<%=request.getScheme() %>"></c:set>

<html>
<body>
当前页面login.jsp:<spring:message code="label.message.name" /><br/>
<a href="index.json">index</a>
</body>
</html>


index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%
response.setHeader("Pragma","no-cache");
response.setHeader("Cache-Control","no-cache, no-store, must-revalidate, private");
%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="ctx" value="<%=request.getContextPath() %>"></c:set>
<c:set var="scheme" value="<%=request.getScheme() %>"></c:set>

<html>
<body>
当前页面index.jsp:<spring:message code="label.message.name" /><br/>
<a href="login.json">login</a>
</body>
</html>


则调用login.json时候

当前页面login.jsp:hello test

index

点击index时候会显示:

当前页面index.jsp:hello

login

这样就实现了根据不同的请求调用不同的资源文件的目的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: