SpringMVC源码--LocaleResolver

LocaleResolver

public interface LocaleResolver {
    Locale resolveLocale(HttpServletRequest var1);

    void setLocale(HttpServletRequest var1, @Nullable HttpServletResponse var2, @Nullable Locale var3);
}

     它的作用是使用request解析出Locale,结构图如下所示:

  • AcceptHeaderLocaleResolver直接使用了Header里的“acceptlanguage”的值,不可以在程序中修改;
  • FixedLocaleResolver用于解析出固定的Locale,也就是说在创建好了就不能修改了;
  • SessionLocaleResolver用于将Locale保存到Session中;
  • CookieLocaleResolver用于将Locale保存到Cookie中;

其中在AbstractLocaleContextResolver下的子类添加了对TimeZone时区的支持。

1. AcceptHeaderLocaleResolver

    public Locale resolveLocale(HttpServletRequest request) {
        Locale defaultLocale = this.getDefaultLocale(); //查找默认的Locale
        if (defaultLocale != null && request.getHeader("Accept-Language") == null) {
            return defaultLocale;
        } else {
            //请求中的Locale
            Locale requestLocale = request.getLocale();
            //获取能支持的Locale
            List<Locale> supportedLocales = this.getSupportedLocales();
            if (!supportedLocales.isEmpty() && !supportedLocales.contains(requestLocale)) {                
                //两者匹配匹配成功
                Locale supportedLocale = this.findSupportedLocale(request, supportedLocales);
                if (supportedLocale != null) {
                    return supportedLocale;
                } else {
                    return defaultLocale != null ? defaultLocale : requestLocale;
                }
            } else {
                return requestLocale;
            }
        }
    }

     public void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale) {
        throw new UnsupportedOperationException("Cannot change HTTP accept header - use a different locale resolution strategy");
    }

2.FixedLocaleResolver

public class FixedLocaleResolver extends AbstractLocaleContextResolver {
    public FixedLocaleResolver() {
        this.setDefaultLocale(Locale.getDefault());
    }

    public FixedLocaleResolver(Locale locale) {
        this.setDefaultLocale(locale);
    }

    public FixedLocaleResolver(Locale locale, TimeZone timeZone) {
        this.setDefaultLocale(locale);
        this.setDefaultTimeZone(timeZone);
    }

    public Locale resolveLocale(HttpServletRequest request) {
        Locale locale = this.getDefaultLocale();
        if (locale == null) {
            //使用默认值
            locale = Locale.getDefault();
        }

        return locale;
    }

    public LocaleContext resolveLocaleContext(HttpServletRequest request) {
        //使用默认的值Locale和TimeZone
        return new TimeZoneAwareLocaleContext() {
            @Nullable
            public Locale getLocale() {
                return FixedLocaleResolver.this.getDefaultLocale();
            }

            public TimeZone getTimeZone() {
                return FixedLocaleResolver.this.getDefaultTimeZone();
            }
        };
    }

    public void setLocaleContext(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable LocaleContext localeContext) {
        throw new UnsupportedOperationException("Cannot change fixed locale - use a different locale resolution strategy");
    }
}

3.SessionLocaleResolver

       这个和FixedLocaleResolver的实现差不多,只不过把默认值改成了从Session中获取,如果获取不到还是从默认值谋取,另外这里支持对LocaleContext的修改。

     public Locale resolveLocale(HttpServletRequest request) {
        //首先从session中获取
        Locale locale = (Locale)WebUtils.getSessionAttribute(request, this.localeAttributeName);
        if (locale == null) {
            //获取不到获取默认值
            locale = this.determineDefaultLocale(request);
        }

        return locale;
    }    
    public LocaleContext resolveLocaleContext(final HttpServletRequest request) {
        return new TimeZoneAwareLocaleContext() {
            public Locale getLocale() {
                Locale locale = (Locale)WebUtils.getSessionAttribute(request, SessionLocaleResolver.this.localeAttributeName);
                if (locale == null) {
                    locale = SessionLocaleResolver.this.determineDefaultLocale(request);
                }

                return locale;
            }

            @Nullable
            public TimeZone getTimeZone() {
                TimeZone timeZone = (TimeZone)WebUtils.getSessionAttribute(request, SessionLocaleResolver.this.timeZoneAttributeName);
                if (timeZone == null) {
                    timeZone = SessionLocaleResolver.this.determineDefaultTimeZone(request);
                }

                return timeZone;
            }
        };
    }

    public void setLocaleContext(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable LocaleContext localeContext) {
        Locale locale = null;
        TimeZone timeZone = null;
        if (localeContext != null) {
            locale = localeContext.getLocale();
            if (localeContext instanceof TimeZoneAwareLocaleContext) {
                timeZone = ((TimeZoneAwareLocaleContext)localeContext).getTimeZone();
            }
        }

        WebUtils.setSessionAttribute(request, this.localeAttributeName, locale);
        WebUtils.setSessionAttribute(request, this.timeZoneAttributeName, timeZone);
    }

 4.CookieLocaleResolver

            它和SessionLocaleResolver类似,只是将Session编程Cookie来保存属性了额,只是为了处理Cookie继承了CookieGenerator,所以就没有继承AbstractLocaleContextResolver了,不过任然会提供保存默认的Locale和TimeZone的属性。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值