Springmvc国际化自动配置代码实现
在springmvc中通过LocalResover获取区域信息对象Local(对语言信息、国家代码等的封装),进行国际化配置,在springboot为我们提供了默认的区域信息解析器
@Configuration(
proxyBeanMethods=false
)
@ConditionalOnWebApplication(
type=Type.SERVLET
)
@ConditionalOnClass({Servlet.class,DispatcherServlet.class,WebMvcConfigurer.class})
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class,TaskExecutionAutoConfiguration.class,ValidationAutoConfiguration.class})
publicclassWebMvcAutoConfiguration{
publicstaticfinalStringDEFAULT_PREFIX="";
publicstaticfinalStringDEFAULT_SUFFIX="";
privatestaticfinalString[]SERVLET_LOCATIONS=newString[]{"/"};
@Bean
@ConditionalOnMissingBean//容器中没有LocaleResolver时
@ConditionalOnProperty(
prefix="spring.mvc",
name={"locale"}
)
publicLocaleResolverlocaleResolver(){//如果属性中指定用固定的就用固定的FixedLocaleResolver区域化信息解析器
if(this.mvcProperties.getLocaleResolver()==org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties.LocaleResolver.FIXED){
returnnewFixedLocaleResolver(this.mvcProperties.getLocale());
}else{//否则使用AcceptHeaderLocaleResolver区域化信息解析器
AcceptHeaderLocaleResolverlocaleResolver=newAcceptHeaderLocaleResolver();
localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
returnlocaleResolver;
}
}
AcceptHeaderLocaleResolver在request请求头中获取到区域信息
publicclassAcceptHeaderLocaleResolverimplementsLocaleResolver{
privatefinalListsupportedLocales=newArrayList(4);
publicLocaleresolveLocale(HttpServletRequestrequest){
LocaledefaultLocale=this.getDefaultLocale();
if(defaultLocale!=null&&request.getHeader("Accept-Language")==null){
returndefaultLocale;
}else{
LocalerequestLocale=request.getLocale();
ListsupportedLocales=this.getSupportedLocales();
if(!supportedLocales.isEmpty()&&!supportedLocales.contains(requestLocale)){
LocalesupportedLocale=this.findSupportedLocale(request,supportedLocales);
if(supportedLocale!=null){
returnsupportedLocale;
}else{
returndefaultLocale!=null?defaultLocale:requestLocale;
}
}else{
returnrequestLocale;
}
}
}
默认就是更具请求头带来的区域信息获取Local进行国际化
我们可以通过定义自己的区域化解析器生成区域化信息
publicclassMyLocaleResolverimplementsLocaleResolver{
@Override
publicLocaleresolveLocale(HttpServletRequestrequest){
Stringl=request.getParameter("l");
Localelocale=Locale.getDefault();
if(!StringUtils.isEmpty(l)){
String[]split=l.split("_");
locale=newLocale(split[0],split[1]);
}
returnlocale;
}
@Override
publicvoidsetLocale(HttpServletRequestrequest,HttpServletResponseresponse,Localelocale){
}
}
@Configuration
publicclassMyMvcConfigextendsWebMvcConfigurerAdapter{
@Bean
publicLocaleResolverlocaleResolver(){
returnnewMyLocaleResolver();
}
}
量变引起质变,这就是我所理解的因果。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。