目录
Spring MVC地区信息(LocaleResolver)
地区信息
Spring的架构中的很多层面都提供了对国际化的支持,同样支持Spring MVC框架也能提供。DispatcherServlet提供了自动使用用户的地区信息来解析消息的能力。而这是通过LocaleResolver对象来完成的
一个请求进入处理时,DispatcherServlet会查找一个地区解析器。如果找到,就尝试使用它来设置地区相关的信息。通过调用RequestContext.getLocale()就能取到地区解析器所解析到的地区信息。此外,如果需要自动解析地区信息,可以在处理器映射前加一个拦截器,并用它来根据条件或环境不同,比如,根据请求中某个参数值,来更改地区信息
为了让Web应用程序支持国际化,必须识别每个用户的首选区域,并根据这个区域显示内容。
在Spring MVC应用程序中,用户的区域是通过区域解析器来识别的,它必须实现LocaleResolver接口。Spring MVC提供了几个LocaleResolver实现,可以按照不同的条件来解析区域。除此之外,还可以实现这个接口,创建自己的区域解析器
要定义一个区域解析器,只需在web应用程序上下文中注册一个LocaleResolver类型的Bean就可以了。必须将区域解析器的Bean名称设置为localeResolver,这样DispatcherServlet才能自动侦测到它
注意:DispatcherServlet只能注册一个区域解析器。
获取地区信息
除了获取客户端的地区信息外,有时他们所在的时区信息也非常有用。LocaleContextResolver接口为LocaleResolver提供了拓展点,允许解析器在LocaleContext中提供更多的信息,这里面就可以包含时区信息
如果用户的时区信息能被解析到,那么可以通过RequestContext.getTimeZone()方法获得。时区信息会自动被SpringConversionService下注册的日期/时间转换器Converter及格式化对象Formatter所使用
1.Accept请求头解析器
AcceptHeaderLocaleResolver解析器会检查客户端(比如,浏览器,等)所发送的请求中是否携带accept-language请求头。通常,该请求头字段中包含了客户端操作系统的地区信息
注意:该解析器不支持时区信息的解析
Spring采用的默认区域解析器是AcceptHeaderLocaleResolver。通过检验HTTP请求的accept-language头部来解析区域。这个头部是由用户的web浏览器根据底层操作系统的区域设置进行设定
注意:这个区域解析器无法改变用户的区域,因为它无法修改用户操作系统的区域设置
2.Cookie解析器
CookieLocaleResolver解析会检查客户端是否有Cookie,里面可能存放了地区Locale或时区TimeZone信息。如果检查到相应的值,解析器就使用它们。通过该解析器的属性,可以指定cookie的名称和其最大的存活时间
用CookieLocaleResolver来解析区域。如果Cookie不存在,它会根据accept-language HTTP头部确定默认区域
如何定义一个CookieLocaleResolver
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="cookieName" value="clientlanguage"/>
<!-- 单位为秒。若设置为-1,则cookie不会被持久化(客户端关闭浏览器后即被删除)-->
<property name="cookieMaxAge" value="100000">
</bean>
CookieLocaleResolver支持的属性
属性 | 默认值 | 描述 |
---|---|---|
cookieName | classname + LOCALE | cookie名 |
cookieMaxAge | Integer.MAX_INT | cookie被保存在客户端的最长时间。如果该值为-1,那么cookie将不会被持久化,在客户端浏览器关闭之后就失效了 |
cookiePath | / | 限制了cookie仅对站点下的某些特定路径可见。如果指定了cookiePath,那么cookie将仅对该路径及其子路径下的所有站点可见 |
3.Session解析器
SessionLocaleResolver允许从session中取得可能与用户请求相关联的地区Locale和时区TimeZone信息。与CookieLocaleResolver不同,这种存取策略仅将Servlet容器的HttpSession中相关的地区信息存取到本地。因此,这些设置仅会为该会话(session)临时保存,session结束后,这些设置就会失效
注意:该解析器与其他外部session管理机制,比如Spring的Session项目等,并没有直接联系。该SessionLocaleResolver仅会简单地从与当前请求HttpServletRequest相关的HttpSession对象中,取出对应的属性,并修改其值,仅此而已
解析区域的另一种方法是通过SessionLocaleResolver。它通过检验用户会话中预置的属性来解析区域。如果该会话属性不存在,它会根据accept-language HTTP头部确定默认区域。
<bean id="localeResolver" class="org.springframewrok.web.servlet.i18n.SessionLocaleResolver">
<property name="defaultLocale" value="en"/>
</bean>
如果会话属性不存在,可以为这个解析器设置defaultLocale属性。请注意,通过修改保存该区域的会话属性,这个区域解析器可以改变用户的区域设置
地区更改拦截器
可以在处理器映射前添加一个LocaleChangeInterceptor拦截器来更改地区信息。它能检测请求中的参数,并根据其值相应地更新地区信息。它通过调用LocaleResolver的setLocale()方法来更改地区。
下面的代码配置展示了如何为所有请求*.view路径并且携带了siteLanguage参数的资源请求更改地区
举个例子,一个URL为http://www.test.com/home.view?siteLanguage=nl的请求将会将站点语言更改为荷兰语
<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="siteLanguage"/>
</bean>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="localeChangeInterceptor"/>
</list>
</property>
<property name="mappings">
<value>/**/*.view=someController</value>
</property>
</bean>