区域设置
Spring 大部分架构都支持国际化,Spring Web MVC 框架也不例外。DispatcherServlet 允许你通过使用客户端的区域设置自动解析消息。这是通过 LocaleResolver 对象完成的。当请求到来时,DispatcherServlet 会查找一个区域设置解析器,如果找到,它会尝试使用它来设置区域设置。通过使用 RequestContext.getLocale() 方法,你总是可以检索到由区域设置解析器解析的区域设置。除了自动区域设置解析之外,你还可以将一个拦截器附加到处理程序映射(有关处理程序映射拦截器的更多信息,请参阅 拦截)以在特定情况下更改区域设置(例如,基于请求中的参数)。区域设置解析器和拦截器定义在 org.springframework.web.servlet.i18n 包中,并以常规方式在你的应用程序上下文中配置。Spring 中包含了以下区域设置解析器。
时区
除了获取客户端的区域设置之外,了解其时区也通常很有用。LocaleContextResolver 接口提供了 LocaleResolver 的一个扩展,允许解析器提供更丰富的 LocaleContext,其中可能包含时区信息。
如果可用,可以使用 RequestContext.getTimeZone() 方法获取用户的 TimeZone。时区信息由任何注册到 Spring ConversionService 的日期/时间 Converter 和 Formatter 对象自动使用。
Header 解析器
此区域设置解析器检查客户端(例如,Web 浏览器)发送的请求中的 accept-language 头。通常,此头字段包含客户端操作系统的区域设置。请注意,此解析器不支持时区信息。
Cookie 解析器
此区域设置解析器检查客户端上可能存在的 Cookie,以查看是否指定了 Locale 或 TimeZone。如果指定了,它将使用指定的详细信息。通过使用此区域设置解析器的属性,你可以指定 cookie 的名称以及最大年龄。以下示例定义了一个 CookieLocaleResolver:
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="cookieName" value="clientlanguage"/>
<!-- in seconds. If set to -1, the cookie is not persisted (deleted when browser shuts down) -->
<property name="cookieMaxAge" value="100000"/>
</bean>
下表描述了 CookieLocaleResolver 的属性:
| 属性 | 默认值 | 描述 |
|---|---|---|
|
类名 + LOCALE |
Cookie 的名称 |
|
Servlet 容器默认 |
Cookie 在客户端上持久化的最长时间。如果指定 |
|
/ |
将 cookie 的可见性限制到你网站的某个部分。当指定 |
Session 解析器
SessionLocaleResolver 允许你从可能与用户请求关联的会话中检索 Locale 和 TimeZone。与 CookieLocaleResolver 不同,此策略将本地选择的区域设置存储在 Servlet 容器的 HttpSession 中。因此,这些设置对每个会话都是临时的,并在每个会话结束时丢失。
请注意,这与外部会话管理机制(例如 Spring Session 项目)没有直接关系。SessionLocaleResolver 根据当前的 HttpServletRequest 评估和修改相应的 HttpSession 属性。
区域设置拦截器
你可以通过将 LocaleChangeInterceptor 添加到 HandlerMapping 定义之一来启用区域设置更改。它检测请求中的参数并相应地更改区域设置,调用调度程序应用程序上下文中 LocaleResolver 上的 setLocale 方法。下一个示例显示,对所有包含名为 siteLanguage 参数的 *.view 资源的调用现在会更改区域设置。因此,例如,对 URL www.sf.net/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>