区域设置
Spring架构的大部分部分都支持国际化,就像Spring Web MVC框架一样。 DispatcherServlet
允许您通过使用客户端的区域设置自动解析消息。这是通过 LocaleResolver
对象完成的。
当请求到达时,DispatcherServlet
会查找区域解析器,如果找到了,它会尝试使用它来设置区域。通过使用 RequestContext.getLocale()
方法,您可以始终检索由区域解析器解析的区域设置。
除了自动区域解析外,您还可以将拦截器附加到处理程序映射(有关处理程序映射拦截器的更多信息,请参见 拦截)以根据特定情况(例如,基于请求中的参数)更改区域设置。
区域解析器和拦截器定义在 org.springframework.web.servlet.i18n
包中,并以正常方式在应用程序上下文中进行配置。Spring中包含以下选择的区域解析器。
时区
除了获取客户端的区域设置外,了解其时区通常也很有用。 LocaleContextResolver
接口为 LocaleResolver
提供了一个扩展,让解析器提供更丰富的 LocaleContext
,其中可能包含时区信息。
当可用时,用户的 TimeZone
可以通过使用 RequestContext.getTimeZone()
方法获取。时区信息会自动被注册到Spring的 ConversionService
中的任何日期/时间 Converter
和 Formatter
对象中。
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的可见性限制在站点的某个部分。当指定了 |
会话解析器
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>