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

来源:互联网 发布:苹果cms解析教程 编辑:程序博客网 时间:2024/05/17 22:38

参考自:http://www.cnblogs.com/huang0925/archive/2013/05/29/3106022.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];@Overrideprotected 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;@Controllerpublic class LoginController {@AutowiredMongoDao 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


这样就实现了根据不同的请求调用不同的资源文件的目的。

0 0
原创粉丝点击