Java Spring局部解算器链接
是否可以链接区域设置解析程序 我想从以下位置获取区域设置值:Java Spring局部解算器链接,java,spring,spring-mvc,localization,internationalization,Java,Spring,Spring Mvc,Localization,Internationalization,是否可以链接区域设置解析程序 我想从以下位置获取区域设置值: 会话if使用我接受的语言映射 cookie if映射到我接受的语言 如果两者都不包含区域设置信息,则将其从accept语言中提取出来,并与我接受的区域设置进行最佳匹配 您将如何做到这一点?我认为您需要编写自己的代码来包装Spring的区域设置解析程序列表。一个接一个地调用它们,直到解析了Locale。如果列表未生成区域设置,则在LocaleResolver中提供默认行为 以下是一些您可能会发现有用的链接: 或者,如果您更喜欢从两个
您将如何做到这一点?我认为您需要编写自己的代码来包装Spring的区域设置解析程序列表。一个接一个地调用它们,直到解析了
Locale
。如果列表未生成区域设置
,则在LocaleResolver
中提供默认行为
以下是一些您可能会发现有用的链接:
或者,如果您更喜欢从两个链接查看:
package org.lds.stack.web.spring.i18n;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;
import org.springframework.web.servlet.i18n.FixedLocaleResolver;
/**
* This locale resolver provides the ability to define a list of resolvers from which to determine
* the locale. This allows us to give preference to certain locale resolution schemes by putting
* them earlier in the list.
* <p/>
*
* The order of resolvers from which to find the given locale (or set a specified locale) could be
* defined in the spring context file with something like:
*
* <pre>
* <bean id="localeResolver" class="org.lds.stack.web.spring.i18n.ChainedLocaleResolver">
* <property name="localeResolvers">
* <list>
* <bean class="org.lds.stack.web.spring.i18n.UrlLocaleResolver" />
* <bean class="org.lds.stack.web.spring.i18n.NoDefaultSessionLocaleResolver" />
* <bean class="org.lds.stack.web.spring.i18n.NoDefaultCookieLocaleResolver">
* <property name="cookieMaxAge" value="31536000"/>
* </bean>
* <bean class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver" />
* <bean class="org.springframework.web.servlet.i18n.FixedLocaleResolver" />
* </list>
* </property>
* </bean>
* </pre>
*
* This allows you to remove, or re-order the locale resolution schemes to meet your needs.
* Also note that the id of localeResolver is significant. The Spring Framework knows to use this
* resolver as the LocaleResolver by virtue of the id being "localeResolver".
* <p/>
*
* NOTE: If the default resolver order, shown above, will work for your application, then you can
* skip this verbose definition by utilizing the stack-web namespace handler, providing any exposed
* attribute values for minor customizations. The namespace handler is defined as follows:
*
* <pre>
* <stack-web:locale-resolver />
* </pre>
*
* Additionally, in order to change the locale based on a url parameter, you can configure a
* LocaleChangeInterceptor, which will call the set method of all of the locales in the chained
* resolver, so that they can be found when resolveLocale(...) is called on them.
* <p/>
*
* The interceptor configuration might look as follows:
* <pre>
* <mvc:interceptors>
* <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
* </mvc:interceptors>
* </pre>
*/
public class ChainedLocaleResolver implements LocaleResolver {
private List<LocaleResolver> localeResolvers;
public ChainedLocaleResolver() {
//if anything other than this default order or set is desired, the list of resolvers
//to be chained should be set up in the bean definition as shown above
localeResolvers = new ArrayList<LocaleResolver>();
//TODO: Is the Url resolver necessary if we have an interceptor that changes the locale from the url?
localeResolvers.add(new UrlLocaleResolver());
localeResolvers.add(new NoDefaultSessionLocaleResolver());
NoDefaultCookieLocaleResolver cookieLocaleResolver = new NoDefaultCookieLocaleResolver();
cookieLocaleResolver.setCookieMaxAge(31536000);
localeResolvers.add(cookieLocaleResolver);
//TODO: may need to create a NoDefault, but that seems difficult as the implementation is provided
//by the javax.servlet, ..., Also, maybe we could just remove the fixedLocaleResolver, as this one
//gets the default, and then if people did not use this one, they could add the fixed one back in.
localeResolvers.add(new AcceptHeaderLocaleResolver());
localeResolvers.add(new FixedLocaleResolver());
}
@Override
public Locale resolveLocale(HttpServletRequest request) {
Locale locale = null;
for (LocaleResolver resolver : getLocaleResolvers()) {
locale = resolver.resolveLocale(request);
if (locale != null) {
return locale;
}
}
return locale;
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
for (LocaleResolver resolver : getLocaleResolvers()) {
try {
resolver.setLocale(request, response, locale);
} catch (UnsupportedOperationException uoe) {}
}
}
public List<LocaleResolver> getLocaleResolvers() {
return localeResolvers;
}
public void setLocaleResolvers(List<LocaleResolver> localeResolvers) {
this.localeResolvers = localeResolvers;
}
}
package org.lds.stack.web.spring.i18n;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Locale;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入org.springframework.web.servlet.LocaleResolver;
导入org.springframework.web.servlet.i18n.acceptHeaderLocalerResolver;
导入org.springframework.web.servlet.i18n.FixedLocaleResolver;
/**
*此区域设置冲突解决程序提供了定义冲突解决程序列表的功能,从中可以确定
*地点。这使我们可以通过将
*他们在名单的前面。
*
*
*解析程序查找给定区域设置(或设置指定区域设置)的顺序可以是
*在spring上下文文件中定义,如下所示:
*
*
*bean id=“localeResolver”class=“org.lds.stack.web.spring.i18n.ChainedLocaleResolver”
*property name=“localeresolver”
*名单
*bean class=“org.lds.stack.web.spring.i18n.UrlLocaleResolver”/
*bean class=“org.lds.stack.web.spring.i18n.nodeFaultSessionLocalerResolver”/
*bean class=“org.lds.stack.web.spring.i18n.NoDefaultCookieLocaleResolver”
*property name=“cookieMaxAge”value=“31536000”/
*/豆
*bean class=“org.springframework.web.servlet.i18n.AcceptHeaderLocalerResolver”/
*bean class=“org.springframework.web.servlet.i18n.FixedLocaleResolver”/
*/列表
*/属性
*/豆
*
*
*这允许您删除或重新排序区域设置解析方案以满足您的需要。
*还请注意,localeResolver的id是重要的。Spring框架知道如何使用它
*由于id为“LocaleResolver”,因此解析程序为LocaleResolver。
*
*
*注意:如果上面显示的默认解析器顺序适用于您的应用程序,那么您可以
*通过使用堆栈web命名空间处理程序跳过此详细定义,提供任何公开的
*次要自定义的属性值。命名空间处理程序的定义如下:
*
*
*堆栈web:区域设置解析器/
*
*
*此外,为了根据url参数更改区域设置,您可以配置
*LocaleChangeInterceptor,它将调用链接中所有区域设置的set方法
*解析程序,以便在对它们调用resolveLocale(…)时可以找到它们。
*
*
*拦截器配置可能如下所示:
*
*mvc:拦截器
*bean id=“localeChangeInterceptor”class=“org.springframework.web.servlet.i18n.localeChangeInterceptor”/
*/mvc:拦截器
*
*/
公共类ChainedLocaleResolver实现LocaleResolver{
私有列表本地解决方案;
public ChainedLocaleResolver(){
//如果需要此默认顺序或集合以外的任何内容,则会显示冲突解决程序列表
//要链接的对象应该在bean定义中设置,如上所示
localeResolvers=newarraylist();
//TODO:如果我们有一个拦截器可以从Url更改语言环境,那么Url解析器是必要的吗?
添加(新的URLLOCALERESOLVERS());
添加(新的nodeFaultSessionLocalerResolver());
NoDefaultCookieLocaleResolver cookieLocaleResolver=新的NoDefaultCookieLocaleResolver();
cookieLocaleResolver.setCookieMaxAge(31536000);
添加(cookieLocaleResolver);
//TODO:可能需要创建一个NoDefault,但由于提供了实现,这似乎很困难
//通过javax.servlet,…,也许我们可以删除fixedLocaleResolver,就像这个一样
//获取默认值,然后如果用户未使用此值,则可以将固定值添加回。
添加(新的AcceptHeaderLocalerResolver());
添加(新的FixedLocaleResolver());
}
@凌驾
公共区域设置resolveLocale(HttpServletRequest请求){
Locale=null;
for(LocaleResolver解析程序:getlocaleresolver()){
locale=resolver.resolveLocale(请求);
if(区域设置!=null){
返回区域设置;
}
}
返回区域设置;
}
@凌驾
public void setLocale(HttpServletRequest请求、HttpServletResponse响应、Locale){
for(LocaleResolver解析程序:getlocaleresolver()){
试一试{
setLocale(请求、响应、区域设置);
}捕获(不支持操作异常uoe){}
}
}
公共列表getLocaleResolver(){
返回本地解算器;
}
public void setLocaleresolver(列出Localeresolver){
this.localeResolvers=localeResolvers;
}
}
第二个链接给出404。这个代码是包的一部分吗?(希望是一个Maven软件包)在其中分发许可证?@Daniele:fixed@Michael:代码和JavaDoc在我的答案中。这些链接仅供参考