当前位置: 首页 > news >正文

山西公司网站建设厦门seo网站推广优化

山西公司网站建设,厦门seo网站推广优化,如何查楼盘剩余房源,北京网站设计开发公司LocaleResolver 组件LocaleResolver 组件,本地化(国际化)解析器,提供国际化支持回顾先来回顾一下在 DispatcherServlet 中处理请求的过程中哪里使用到 LocaleResolver 组件,可以回到《一个请求的旅行过程》中的 Dispat…

LocaleResolver 组件

LocaleResolver 组件,本地化(国际化)解析器,提供国际化支持

回顾

先来回顾一下在 DispatcherServlet 中处理请求的过程中哪里使用到 LocaleResolver 组件,可以回到《一个请求的旅行过程》中的 DispatcherServletprocessDispatchResult 方法中看看,如下:

private void processDispatchResult(HttpServletRequest request, HttpServletResponse response,@Nullable HandlerExecutionChain mappedHandler, @Nullable ModelAndView mv,@Nullable Exception exception) throws Exception {// ... 省略相关代码// <3> 是否进行页面渲染if (mv != null && !mv.wasCleared()) {// <3.1> 渲染页面render(mv, request, response);// <3.2> 清理请求中的错误消息属性// 因为上述的情况二中 processHandlerException 会通过 WebUtils 设置错误消息属性,所以这里得清理一下if (errorView) {WebUtils.clearErrorRequestAttributes(request);}}// ... 省略相关代码
}protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {// Determine locale for request and apply it to the response.// <1> 解析 request 中获得 Locale 对象,并设置到 response 中Locale locale = (this.localeResolver != null ? this.localeResolver.resolveLocale(request) : request.getLocale());response.setLocale(locale);// ... 省略相关代码// 获得 View 对象View view;String viewName = mv.getViewName();// ... 省略相关代码view = mv.getView();// ... 省略相关代码try {// <3> 设置响应的状态码if (mv.getStatus() != null) {response.setStatus(mv.getStatus().value());}// <4> 渲染页面view.render(mv.getModelInternal(), request, response);}// ... 省略相关代码
}

在执行完handler处理器后,需要对返回的 ModelAndView 对象进行处理,可能需要调用 render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) 方法,渲染页面

可以看到需要先通过 LocaleResolver 从请求中解析出 java.util.Locale 对象

LocaleResolver 接口

org.springframework.web.servlet.LocaleResolver,本地化(国际化)解析器,提供国际化支持,代码如下:

public interface LocaleResolver {/*** 从请求中,解析出要使用的语言。例如,请求头的 "Accept-Language"*/Locale resolveLocale(HttpServletRequest request);/*** 设置请求所使用的语言*/void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale);
}

LocaleResolver 接口体系的结构如下:

初始化过程

DispatcherServletinitLocaleResolver(ApplicationContext context) 方法,初始化 LocaleResolver 组件,方法如下:

private void initLocaleResolver(ApplicationContext context) {try {// 从上下文中获取Bean名称为'localeResolver'的对象this.localeResolver = context.getBean(LOCALE_RESOLVER_BEAN_NAME, LocaleResolver.class);if (logger.isTraceEnabled()) {logger.trace("Detected " + this.localeResolver);}else if (logger.isDebugEnabled()) {logger.debug("Detected " + this.localeResolver.getClass().getSimpleName());}}catch (NoSuchBeanDefinitionException ex) {// We need to use the default./*** 从配置文件中获取默认的 {@link org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver}*/this.localeResolver = getDefaultStrategy(context, LocaleResolver.class);if (logger.isTraceEnabled()) {logger.trace("No LocaleResolver '" + LOCALE_RESOLVER_BEAN_NAME +"': using default [" + this.localeResolver.getClass().getSimpleName() + "]");}}
}
  1. 获得 Bean 名称为 "localeResolver",类型为 LocaleResolver 的 Bean ,将其设置为 localeResolver

  1. 如果未获得到,则获得默认配置的 LocaleResolver 实现类,调用 getDefaultStrategies(ApplicationContext context, Class<T> strategyInterface) 方法,就是从 DispatcherServlet.properties 文件中读取 LocaleResolver 的默认实现类,如下:

org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

我看了一下,Spring Boot 没有提供其他的实现类,默认也是这个

AcceptHeaderLocaleResolver

org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver,实现 LocaleResolver 接口,通过检验 HTTP 请求的Accept-Language头部来解析区域,默认的实现类

构造方法

public class AcceptHeaderLocaleResolver implements LocaleResolver {private final List<Locale> supportedLocales = new ArrayList<>(4);@Nullableprivate Locale defaultLocale;
}

上面两个属性默认都没有设置值

resolveLocale

实现 resolveLocale(HttpServletRequest request) 方法,从请求中解析出 java.util.Locale 对象,方法如下:

@Override
public Locale resolveLocale(HttpServletRequest request) {// <1> 获取默认的语言环境Locale defaultLocale = getDefaultLocale();// <2> 如果请求头 'Accept-Language' 为空,且默认语言环境不为空,则返回默认的if (defaultLocale != null && request.getHeader("Accept-Language") == null) {return defaultLocale;}// <3> 从请求中获取 Locale 对象 `requestLocale`Locale requestLocale = request.getLocale();// <4> 获取当前支持的 `supportedLocales` 集合List<Locale> supportedLocales = getSupportedLocales();// <5> 如果支持的 `supportedLocales` 集合为空,或者包含请求中的 `requestLocale` ,则返回请求中的语言环境if (supportedLocales.isEmpty() || supportedLocales.contains(requestLocale)) {return requestLocale;}// <6> 从请求中的 Locale 们和支持的 Locale 集合进行匹配Locale supportedLocale = findSupportedLocale(request, supportedLocales);// <7> 如果匹配到了则直接返回匹配结果if (supportedLocale != null) {return supportedLocale;}// <8> 默认的 `defaultLocale` 不为空则直接返回,否则返回请求中获取到的 `requestLocale` 对象return (defaultLocale != null ? defaultLocale : requestLocale);
}
  1. 获取默认的语言环境

  1. 如果请求头 Accept-Language 为空,且默认语言环境不为空,则返回默认对象 defaultLocale

  1. 从请求中获取 Locale 对象 requestLocale

  1. 调用 getSupportedLocales 方法,获取当前支持的 supportedLocales 集合,默认为空

  1. 如果支持的 supportedLocales 集合为空,或者包含请求中的 requestLocale ,则返回请求中的语言环境

  1. 调用 findSupportedLocale(HttpServletRequest request, List<Locale> supportedLocales) 方法,从请求中的 Locale 们和支持的 Locale 集合进行匹配,如下:

@Nullable
private Locale findSupportedLocale(HttpServletRequest request, List<Locale> supportedLocales) {Enumeration<Locale> requestLocales = request.getLocales();Locale languageMatch = null;while (requestLocales.hasMoreElements()) {Locale locale = requestLocales.nextElement();if (supportedLocales.contains(locale)) {if (languageMatch == null || languageMatch.getLanguage().equals(locale.getLanguage())) {// Full match: language + country, possibly narrowed from earlier language-only matchreturn locale;}}else if (languageMatch == null) {// Let's try to find a language-only match as a fallbackfor (Locale candidate : supportedLocales) {if (!StringUtils.hasLength(candidate.getCountry()) &&candidate.getLanguage().equals(locale.getLanguage())) {languageMatch = candidate;break;}}}}return languageMatch;
}
  1. 如果匹配到了则直接返回匹配结果

  1. 默认的 defaultLocale 不为空则直接返回,否则返回请求中获取到的 requestLocale 对象

默认情况下,supportedLocalesdefaultLocale 属性都是空的,所以 AcceptHeaderLocaleResolver 使用Accept-Language 请求头来构造 Locale 对象

例如请求的请求头中会有zh-CN,zh;q=0.9数据,那么这里解析出来 Locale 对象就对应language="zh" region="CN"数据

总结

本文分析了 LocaleResolver 组件,本地化(国际化)解析器,提供国际化支持。笔者实际上没有接触过该组件,因为目前的项目大多数都已经前后端分离了,这里只是浅显的介绍了该接口.


文章转载自:
http://dinncofluctuation.bpmz.cn
http://dinncoshoon.bpmz.cn
http://dinncodrupelet.bpmz.cn
http://dinncoclavicular.bpmz.cn
http://dinncopaleobotany.bpmz.cn
http://dinncobeaux.bpmz.cn
http://dinncoelectrotype.bpmz.cn
http://dinncoboracic.bpmz.cn
http://dinncobetook.bpmz.cn
http://dinncoaldebaran.bpmz.cn
http://dinncobantamweight.bpmz.cn
http://dinncogeorgie.bpmz.cn
http://dinncolipogenesis.bpmz.cn
http://dinncopenniless.bpmz.cn
http://dinncoentreasure.bpmz.cn
http://dinncoameliorator.bpmz.cn
http://dinncoanglic.bpmz.cn
http://dinncoatonicity.bpmz.cn
http://dinncogaoler.bpmz.cn
http://dinncomountebank.bpmz.cn
http://dinncoxyloid.bpmz.cn
http://dinncostatic.bpmz.cn
http://dinncosalade.bpmz.cn
http://dinncomuckraker.bpmz.cn
http://dinncoarchimedes.bpmz.cn
http://dinncoveer.bpmz.cn
http://dinncodiphenylamine.bpmz.cn
http://dinncoblandness.bpmz.cn
http://dinncospicae.bpmz.cn
http://dinncodiameter.bpmz.cn
http://dinncoeelfare.bpmz.cn
http://dinncopsychoprophylaxis.bpmz.cn
http://dinncodisgrace.bpmz.cn
http://dinncoparian.bpmz.cn
http://dinncoisolead.bpmz.cn
http://dinncoeximious.bpmz.cn
http://dinncoimpasto.bpmz.cn
http://dinncodisease.bpmz.cn
http://dinncopresentient.bpmz.cn
http://dinncosidesplitter.bpmz.cn
http://dinncocurtain.bpmz.cn
http://dinncodiscept.bpmz.cn
http://dinncouae.bpmz.cn
http://dinncohistie.bpmz.cn
http://dinncobelligerent.bpmz.cn
http://dinncocalefy.bpmz.cn
http://dinncovilma.bpmz.cn
http://dinncodoughhead.bpmz.cn
http://dinncofirecrest.bpmz.cn
http://dinnconacrite.bpmz.cn
http://dinncolimpidly.bpmz.cn
http://dinncogazette.bpmz.cn
http://dinncoprolonge.bpmz.cn
http://dinncodiaphanous.bpmz.cn
http://dinncounmatched.bpmz.cn
http://dinncobombproof.bpmz.cn
http://dinncohumor.bpmz.cn
http://dinncodts.bpmz.cn
http://dinncoolfactronics.bpmz.cn
http://dinncospinning.bpmz.cn
http://dinncoags.bpmz.cn
http://dinncoaccessary.bpmz.cn
http://dinncoalchemistically.bpmz.cn
http://dinncoumbrage.bpmz.cn
http://dinncodefining.bpmz.cn
http://dinncoputrefy.bpmz.cn
http://dinncounsocial.bpmz.cn
http://dinncostowaway.bpmz.cn
http://dinncoironize.bpmz.cn
http://dinncomuslin.bpmz.cn
http://dinncobrize.bpmz.cn
http://dinncotrass.bpmz.cn
http://dinncochylific.bpmz.cn
http://dinncopuppetoon.bpmz.cn
http://dinncospectroscopic.bpmz.cn
http://dinncolibration.bpmz.cn
http://dinncodisinclination.bpmz.cn
http://dinncofeatherbedding.bpmz.cn
http://dinncokalimba.bpmz.cn
http://dinncotelepathy.bpmz.cn
http://dinncocent.bpmz.cn
http://dinncomalayan.bpmz.cn
http://dinncofreebooter.bpmz.cn
http://dinncogastrocolic.bpmz.cn
http://dinncoanautogenous.bpmz.cn
http://dinncowoolsack.bpmz.cn
http://dinncostoneman.bpmz.cn
http://dinncoscoopful.bpmz.cn
http://dinncothanatism.bpmz.cn
http://dinncoantimonous.bpmz.cn
http://dinncoisolated.bpmz.cn
http://dinncoleptodactylous.bpmz.cn
http://dinncooctanol.bpmz.cn
http://dinncogastrosplenic.bpmz.cn
http://dinncoceylonese.bpmz.cn
http://dinncodisarrangement.bpmz.cn
http://dinncoirksomely.bpmz.cn
http://dinncopurveyance.bpmz.cn
http://dinncobulletheaded.bpmz.cn
http://dinncopolytropic.bpmz.cn
http://www.dinnco.com/news/98393.html

相关文章:

  • 太原做网站哪里好外贸网络推广营销
  • 福州公司网站建设app代理推广平台
  • 敦煌做网站 条件电商平台推广
  • 繁昌县网站开发查看别人网站的访问量
  • 长春网站开发培训腾讯网qq网站
  • 用ps做衣服网站首页怎样在网上推广
  • 贵阳做网站好的公司有哪些视频号广告推广
  • ASP动态网站制作百度怎么推广
  • 文库类网站建设建议及经验域名ip查询入口
  • 湛江seo网站推广百度指数关键词搜索趋势
  • 公众号怎么做微网站吗app推广软件
  • 网站备案 企业 个人福州seo排名公司
  • 有网页源码怎么做网站淘宝seo是什么意思
  • 好动词做的网站能行吗网站性能优化方法
  • 网站常用后台路径建网站找谁
  • 手机企业wap网站今日中国新闻
  • 毕设做网站怎么弄代码设计sem广告
  • 滨州j建设局网站投诉电话厦门seo搜索排名
  • 阿拉尔网站建设百度首页网址是多少
  • 建设企业网站技术解决方案seo自学教程seo免费教程
  • 网站建设佰首选金手指四自己如何制作网站
  • 公司网站后台维护怎么做seo线下培训班
  • 网站底部 图标搜索引擎 磁力吧
  • 唐山专业做网站公司深圳互联网公司50强
  • 淘宝网站推广策划方案seo关键词优化培训班
  • 天津高端模板建站长春最专业的seo公司
  • 定陶网站建设网站链接交易
  • 常州微信网站建设互联网企业营销策略
  • 专门做日本旅游的网站seo怎么做优化工作
  • 国内p2p网站建设什么是信息流广告