最近弄个国际化测试,终于弄出来了,期间遇到了各种问题,在这里总结下,希望可以帮助农民朋友们绕开弯路
第一步:在web.xml中配置servlet
<!-- 上下文参数(第一启动),指定其他spring配置文件路径 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext-*.xml
</param-value>
</context-param>
<!-- spring监听器(第二启动),监听springMvc环境 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- springMvc编码拦截器(第三启动),springMvc内置的编码拦截器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- springMvc前置总控制器(第四启动),在分发其它的控制器前都要经过这个总控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 这里必须在springmvc-servlet.xml文件中加入<context:component-scan base-package="***"/>和 <mvc:annotation-driven /> -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:springmvc-servlet.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 拦截所有 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
第二步:在项目中添加springmvc-servlet.xml文件
并在applicationContext-common.xml文件中配置如下:
<!-- 国际化 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 国际化信息所在的文件名 -->
<property name="basename" value="messages" />
<!-- 如果在国际化资源文件中找不到对应代码的信息,就用这个代码作为名称 -->
<property name ="useCodeAsDefaultMessage" value="true"/>
</bean>
<!-- 方式一 session域 -->
<bean name="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
</bean>
<!-- 方式二 cookie域 -->
<!-- <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="cookieMaxAge" value="604800"/>
<property name="defaultLocale" value="zh_CN"/>
<property name="cookieName" value="Language"></property>
</bean> -->
在springmvc-servlet.xml文件配置:
<?xml version="1.0" encoding="UTF-8"?>
<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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<!-- 启动时扫描所有的controller -->
<context:component-scan base-package="test.action"></context:component-scan>
<!--必须 配置mvc 访问静态资源 ,配置后可以进入@Controller控制器文件-->
<mvc:default-servlet-handler/>
<!--配置MVC 访问动态资源
主要作用于@Controller,激活该模式,下面是一种简写形式,完全可以手动配置替代这种简写形式,它会自动注册DefaultAnnotationHandlerMapping与
AnnotationMethodHandlerAdapter,是spring MVC为@Controllers分发请求所必须的 -->
<mvc:annotation-driven />
<!-- 配置js,css等静态文件直接映射到对应的文件夹,不被DispatcherServlet处理 ,但是测试没效果 和 <mvc:default-servlet-handler/> 效果等同-->
<!-- <mvc:resources mapping="/*/script/**" location="/script/"/>
<mvc:resources mapping="/*/css/**" location="/css/"/>
<mvc:resources mapping="/*/images/**" location="/images/"/> -->
<!-- jsp页面解析器 -->
<bean id="internalResourceViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 (视图文件存放路径)-->
<property name="prefix" value="/jsp/"/>
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
<!-- 装配拦截器 -->
<mvc:interceptors>
<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang" />
</bean>
</mvc:interceptors>
第三步:在项目中添加国际化文件:
messages_en_GB.properties文件配置:
messages_zh_CN.properties文件配置:
自动转化为Unicode码
第四步:添加测试文件:
添加it8n.jsp视图文件
it8n.jsp视图文件内容:
添加控制器文件:
文件内容:
package test.action;
@Controller
@RequestMapping("/mvc")
public class MvcController {
SessionLocaleResolver localeResolver;
// CookieLocaleResolver localeResolver;
//method one 注意再国际化中必须使用转发才会有效果
@RequestMapping(value="changeLanguage")
public ModelAndView language(HttpServletRequest request,HttpServletResponse response,String language) throws Exception{
language = LocaleContextHolder.getLocale().getLanguage().toLowerCase();
if(language==null||language.equals("")){
}else{
if(language.contains("zh")){
localeResolver.setLocale(request, response, Locale.UK );
}else if(language.contains("en")){
localeResolver.setLocale(request, response, Locale.SIMPLIFIED_CHINESE );
}else{
localeResolver.setLocale(request, response, Locale.SIMPLIFIED_CHINESE );
}
}
// return new ModelAndView("redirect:/jsp/it8n.jsp"); //重定向没有效果
return new ModelAndView("forward:/jsp/it8n.jsp"); //转发
}
//method two
/* @RequestMapping(value="/changeLanguage")
public String language(HttpServletRequest request,String language) throws Exception{
//获取方式一
Locale loc =(Locale)request.getSession().getAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME);
//获取方式二
// Locale loc = LocaleContextHolder.getLocale();
if(loc != null){
language = loc.getLanguage();
}
if(language==null||language.equals("")){
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,LocaleContextHolder.getLocale());
}else{
if(language.contains("zh")){
Locale locale = new Locale("en", "GB");
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale);
}else if(language.contains("en")){
Locale locale = new Locale("zh", "CN");
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale);
}else{
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,LocaleContextHolder.getLocale());
}
}
return "it8n";
}*/
}
测试效果:
进入到it8n.jsp文件中:
点击“切换语言”后:
在springmvc-servlet.xml文件配置: