springmvc学习指南 之---第24篇 国际化问题

writedby 张艳涛,今天一天就搞了一个这个问题,主要是下路,遇到springmvc-config.web的配置和拦截器的使用问题,

看了几天的spring发现都没讲拦截器,之前看了两天springmvc的源码,现在感觉不要看源码了,还是看spring的使用,

spring的拦截器都不会用,这可就不应该了,看来还是要买书学习springmvc.不能在看源码了,如何使用都不知道看源码有啥用?

如果前端是vue,那么国际化问题相当简单,引入包,使用$t('预定义变量名') 就可以了, 真是看两分钟就能解决了,但是使用spring+jsp 或者是themleaf等后端传值的实现就非常费劲

那么现在有一个非常常见简单的需求,

点击English就设置语言为英文,如果点击Chinese,页面就显示的为中文

基本方法就是点击按钮给url中传参数locale=zh_CN 

http://localhost:8080/SpringMVC_war_exploded/welcome.htm?locale=zh_CN  ==>对应中文

http://localhost:8080/SpringMVC_war_exploded/welcome.htm?language=en  ===>对应英文

使用一个 LocaleChangeInterceptor拦截器,这个拦截器就是看你的locale=zh_CN 或language=en 如果你有这个参数就会被拦截器拦截下来,然后调用 localeResolver 解析器的  resolveLocale方法

接着在跳转到jsp页面的时候.,locale已经变成了自己设定的 中国,或法国

那么这个主要是记录一下,web.xml的配置文件

mvc-dispatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="localeResolver"
        class="resolver.MyResolver">
<!--        <property name="defaultLocale" value="en" />-->
    </bean>

    <bean id="localeChangeInterceptor"
        class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="language" />
    </bean>
    
    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" >
        <property name="interceptors">
            <list>
                <ref bean="localeChangeInterceptor" />
            </list>
        </property>
    </bean>
    
    <!-- Register the bean -->
    <bean class="com.mkyong.common.controller.WelcomeController" />

    <!-- Register the welcome.properties -->
    <bean id="messageSource"
        class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="welcome" />
    </bean>

    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
        <property name="prefix">
            <value>/WEB-INF/pages/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>

</beans>

这里着重说一下,自定义locale解析器

package resolver;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;

public class MyResolver extends AcceptHeaderLocaleResolver {
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        return super.resolveLocale(request);
    }

    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {

    }
}

这里要说的自定义解析器,如果继承 AcceptHeaderLocaleResolver 不能调用父类的setLocale方法,否则报异常

可以直接继承 LocaleResolver,可是其实都没必要,直接使用spring给的cookie 和session就非常好,根本不用其他设置就直接实现

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

还有

<bean id="localeChangeInterceptor"
        class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="language" />
    </bean>
    
    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" >
        <property name="interceptors">
            <list>
                <ref bean="localeChangeInterceptor" />
            </list>
        </property>
    </bean>

项目的具体可以参考:https://mkyong.com/spring-mvc/spring-mvc-internationalization-example/

原文地址:https://www.cnblogs.com/zytcomeon/p/15072176.html