Spring3 MVC的最佳实践和理解(4)
个人学习参考所用,勿喷!
4.区域解析和外部化区域文本信息
4.1)区域解析。Spring MVC 有很多内置的实现了LocaleResolver(必须实现该接口才能用户区域)的区域解析器。
按照HTTP请求头标来解析的解析器AcceptHeaderLocaleResolver,由于这个解析器是浏览器根据其所在的操作系统的区域社会自来进行设置的,所以这个解析器也不能修改用户的区域。
根据回话属性解析区域:
<bean id="sessionLocaleResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"> <property name="defaulteLocale" valuezh" /> </bean>
根据Cookie解析区域:
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> <property name="cookieName" value="language" /> <property name="cookieMaxAge" value="3600" /> <property name="defaultLocale" value="en" /> </bean>
修改用户的区域需要调用区域修改拦截器 LocaleChangeInterceptor。如下所设定设定paramName属性来设定拦截请求中的特定参数(这里是language)确定区域。既然是拦截器那就需要注册到拦截器 Bean 中,这里是注册到了DefaultAnnotationHandlerMapping Bean中:
<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> <property name="paramName" value="language" /> </bean> <!-- Annotation handlers (Applied by default to ALL @controllers --> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="order" value="1" /> <!-- Interceptors are applied to all annotated controllers --> <property name="interceptors"> <list> <ref bean="measurementInterceptor" /> <ref bean="localeChangeInterceptor" /> </list> </property> </bean>
然后可以通过如下的连接方式来访问:
http://localhost:7070/Spring3MVC/welcome?language=en
http://localhost:7070/Spring3MVC/welcome?language=zh
4.2)外部化区域文本信息。
为了使用国际化信息源,Spring MVC 必须实现MessageSource接口。当然框架内部有许多内置的实现类。我们需要做的是注册一个MessageSource类型的Bean。Bean的名称必须为messageSource,从而方便DispatcherServlet自动检测它。每个DispatcherServlet只能注册一个信息源。例如:
<!-- Message .properties sources --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="messages" /> </bean>
然后我们需要在webapp工程classpath目录下(这里是src/main/resources)建立messages_zh.properties、messages_en.properties两个个分别代表中文、英文环境的信息源文件:
welcome.title=欢迎 welcome.title=Welcome
现在重写welcome.jsp,这里一定要加入<%@page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> ,来解决对中文乱码的解决:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <!-- 添加页面编码设置来解决编码问题 --> <%@page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> <html> <head> <title><spring:message code="welcome.title" text="Welcome" /></title> </head> <body> <h2><spring:message code="welcome.message" text="Welcome to Court Reservation System" /></h2> Today is <fmt:formatDate value="${today}" pattern="yyyy-MM-dd" />. <hr /> Handling time : ${handlingTime} ms <br /> Locale : ${pageContext.response.locale} </body> </html>
这是再使用 http://localhost:7070/Spring3MVC/welcome访问welcome.jsp,出现的是“欢迎体育中心订座系统”的中文信息(楼主在瓷国)。
参考:
juyon的blog:《spring3 MVC国际化支持之中文乱码》
Gary Mark等的书籍:《Spring Recipes》2ed