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

参考自: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];

	@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


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值