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/