• 使用Spring MVC 实现 国际化



    使用Spring MVC 实现 国际化

        博客分类: Spring

     

    1、 版本 Spring 3.1

     

    2、 配置 LocaleResolver

     

     

    LocaleResolver 是指用什么策略来检测请求是哪一种Local, Spring 提供以下几种策略:

     

    2.1、AcceptHeaderLocaleResolver

    根据浏览器Http Header中的accept-language域判定(accept-language域中一般包含了当前操作系统的语言设定,可通过HttpServletRequest.getLocale方法获得此域的内容)。 改变Local 是不支持的,即不能调用LocaleResolver接口的 setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale); 方法设置Local.
    2.2、SessionLocaleResolver
        根据用户本次会话过程中的语言设定决定语言种类(如:用户登录时选择语言种类,则此次登录周期内统一使用此语言设定)。

    2.3、CookieLocaleResolver
    根据Cookie判定用户的语言设定(Cookie中保存着用户前一次的语言设定参数)。

     

    2.4、FixedLocaleResolver 一直使用固定的Local, 改变Local 是不支持的 见(2.1)

     

    如果需要使用哪一种策略,只需在DispatcherServlet 指定的Spring配置文件中配置就行, 例如需要使用CookieLocalResolver , 在配置文件如下配置:

     

    < bean id = "localeResolver" class = "org.springframework.web.servlet.i18n.CookieLocaleResolver" ></ bean >

     

    DispatchServlet 将在初始化的时候, 会调用initLocaleResolver(context) 方法去配置文件中找名字为“localeResolver" bean. 如果有就用配置文件配置的localResolver. 如果没有配置将用默认的localResolver " AcceptHeaderLocaleResolver".

     

    3、使用Spring MVC时,  controller如何得到请求的 Local

     

    DispatchServlet 会在 processRequest(HttpServletRequest request, HttpServletResponse response) 方法中设置LocaleContext, 把LocalContext 和当前线程关联起来. 代码如下:

     

    LocaleContextHolder.setLocaleContext (buildLocaleContext(request), this. threadContextInheritable );

     

    DispatchServlet 中buildLocalContext代码如下:

     

     

    protected LocaleContext buildLocaleContext( final HttpServletRequest request) {

            return new LocaleContext() {

                public Locale getLocale() {

                    return localeResolver .resolveLocale(request);

                }

                @Override

                public String toString() {

                    return getLocale().toString();

                }

            };

    }

     

    这里的Local通过localResolver 解析得到,  localResolver 即是从Spring 配置文件配置的localResolver, 默认是"AcceptHeaderLocaleResolver".

     

    如果你想要在 controller 中得到当前请求的Local,  代码可以如下写:

     Locale locale = LocaleContextHolder.getLocale();

     

    或者你可以用Spring 中的RequestContextUtils 类方法getLocal得到 request 中保存的localResolver, 并用localResolver 解析得到Local.   代码如下:

     

     

    public static Locale getLocale (HttpServletRequest request) {

            LocaleResolver localeResolver = getLocaleResolver (request);

            if (localeResolver != null ) {

                return localeResolver.resolveLocale(request);

            }

            else {

                return request.getLocale();

            }

    }

     

    localResolver 会在DispatcherServlet的doService 方法中,将localResolver保存到request 属性中 代码如下:

     

    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);

     

     

    4、LocaleChangeInterceptor 的使用:

     

    如果想要用户能改变Local, 我们需要配置 LocaleChangeInterceptor, 这个拦截器将检查传入的请求,如果请求中有“local" 的参数(参数可以配置),如http://localhost:8080/test?local=zh_CN. 该Interceptor将使用localResolver改变当前用户的

    Local, 代码如下:

     

     

    String newLocale = request.getParameter( this . paramName );

    if (newLocale != null ) {

      LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver (request);

      if (localeResolver == null ) {

          throw new IllegalStateException( "No LocaleResolver found: not in a ..." );

      }

        //改变当前的Local

      localeResolver.setLocale (request, response, StringUtils.parseLocaleString (newLocale));

    }

     

    要使得LocaleChangeInterceptor 有效果,在Spring 的配置文件加入即可:

     

     

    < mvc:interceptors >

         < bean class = "org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/ >

    </ mvc:interceptors >


  • 相关阅读:
    Two Sum
    Longest Common String
    Maximum Subarray
    Copy List with Random Pointer
    Convert Binary Search Tree to Doubly Linked List
    Fast Power
    Centos7安装ELK Cyrus
    IPv6实验 OSPFv3
    IPv6笔记和实验 RIPng
    IPv6 ICMPv6笔记
  • 原文地址:https://www.cnblogs.com/wlf-919874006/p/4811306.html
Copyright © 2020-2023  润新知