七、SpringMVC国际化配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/QQB67G8COM/article/details/81350350

SpringMVC-servlet.xml

<!-- 1、读取国际化资源文件 == 资源文件在包里面,路径写全包名-->
<!-- 当国际化配置文件在WEB-INF下时使用org.springframework.context.support.ResourceBundleMessageSource -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
   <property name="basenames">
        <list>
            <!-- i18n下的文件名应该问messages_en,messages_zh等-->
            <value>classpath:resources/i18n/messages</value>
        </list>
   </property>
   <property name="cacheSeconds" value="3600" />
   <property name="defaultEncoding" value="UTF-8" />
   <property name="useCodeAsDefaultMessage" value="true" />
</bean>

<!-- 2、Session本地解析器专门用来预设服务器本地的session属性 -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
    <property name="defaultLocale" value="zh"></property>
    <property name="cookieMaxAge" value="3600"/> <!-- value=-1代表浏览器关闭后cookies失效 -->
    <!--property name="cookieName" value="clientlanguage"/--> 
</bean>

<!-- springmvc拦截器配置 -->
<mvc:interceptors>
     <mvc:interceptor>
     <!-- 拦截所有URL中包含/user/的请求 -->
     <mvc:mapping path="/user/s/**"/>
        <bean class="main.java.com.smart.interceptor.LoginInterceptor"/>
     </mvc:interceptor>
     <!-- 3、动态改变本地语言 -->
     <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
            <!-- property name="paramName" value=""/--><!-- 默认属性值为local,local的值为某语言 -->
     </bean>
</mvc:interceptors> 

<!-- 4、校验器(额外) -->
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/> 
    <property name="validationMessageSource" ref="messageSource"/>
</bean>

配置好1-3在view中可以通过spring标签进行messages文件的属性访问
栗子:

<spring:message code="title"></spring:message>

配置好4可以在java全局通过大括号引入messages文件的属性,在注解中也可以使用
栗子,”Pattern.user.phone”为messages文件下的一个属性名:

@Pattern(regexp = "[0-9]{11}",message = "{Pattern.user.phone}")
private String phone;

LocaleFilter.java,定义过滤规则

package main.java.com.smart.filter;

import java.io.IOException;
import java.util.Locale;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

import org.springframework.web.servlet.i18n.SessionLocaleResolver;

public class LocaleFilter implements Filter {

@Override
public void destroy() {

}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    String lang = "zh";//默认中文
    Cookie[] cookies = ((HttpServletRequest)request).getCookies();  //1、获取cookies
    if (cookies != null && cookies.length > 0) {                    //2、判断cookies数组是否为空
        for(Cookie cookie : cookies){
            if ("lang".equals(cookie.getName())) {                  
                lang = cookie.getValue();                           //3、获取浏览器本地改变的的cookie值
            }
        }
    }
    //4、更改请求的cookie属性传递给服务器,服务器根据请求的lang值response响应的内容
    ((HttpServletRequest)request).getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, new Locale(lang));
    System.out.println("change locale to " + lang);
    chain.doFilter(request, response);//5、进行过滤操作,将request传入的参数过滤后传递给服务器,服务器在response
}

@Override
public void init(FilterConfig arg0) throws ServletException {
    // TODO Auto-generated method stub

}

}


在web.xml下配置过滤器

<!-- 国际化配置过滤器 -->
  <filter>
    <filter-name>localeFilter</filter-name>
    <filter-class>main.java.com.smart.filter.LocaleFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>localeFilter</filter-name>
    <url-pattern>*.html</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>localeFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>

success.jsp页面自由进行国际语言的切换

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><spring:message code="title"></spring:message></title>
</head>
<body>
    <script type="text/javascript">
        function changeLocale(lang){
            var exdate = new Date();
            exdate.setDate(exdate.getDate() + 365);
            document.cookie="lang=" + lang + ";expires=" + exdate.toGMTString();
            location.reload();
        }
    </script>

    <h1><spring:message code="title"></spring:message></h1>
    <a href="javascript: changeLocale('zh')">中文</a>
    <a href="javascript: changeLocale('en')">英文</a>
        <div style="margin: 0 auto;margin-top: 100px; ">
            <spring:message code="desc"></spring:message>
        </div>
    <P><a href="user/doLogout.html">退出登录</a></P>
</body>
</html>

原创+转载,如有侵权请指出,代码后续会优化整合为一个完整项目

猜你喜欢

转载自blog.csdn.net/QQB67G8COM/article/details/81350350