SpringMVC的国际化操作(十)下

简介: SpringMVC的国际化操作(十)下

三. SessionLocaleResolver 实现全程国际化


上面那个,只能够根据浏览器设置的语言来决定,是由浏览器来控制的,并不是由服务器代码进行控制的。 如果使用者想更换语言,那么还得修改自己浏览器的使用语言。 而浏览器使用语言,是与浏览器息息相关的,在搜索时是这样,在邮箱时也是这样, 不能因为你这一个服务程序就更换整个浏览器的设置。


需要有一个链接之类的东西,可以动态的进行选择性改变。 如,根据前台的链接选项,来进行动态的改变语言。


三.一 前端页面添加 两个语言的链接


<body>
  <h2>两个蝴蝶飞,国际化的使用</h2>
  <label>选择语言:</label>
  <a href="toLogin.action?request_locale=zh_CN">中文</a>
  <a href="toLogin.action?request_locale=en_US">美国</a>
  <form:form commandName="user" action="login.action" method="post">
    <form:label path="name"><spring:message code="login.name"></spring:message>:</form:label>
    <form:input path="name"/><br/>
    <form:label path="age"><spring:message code="login.age"></spring:message>:</form:label>
    <form:input path="age"/><br/>
    <form:label path="description"><spring:message code="login.description"></spring:message>:</form:label>
    <form:textarea path="description"/><br/>
    <form:button><spring:message code="login.submit"></spring:message></form:button>
  </form:form>
</body>


可以设置成链接,但最好是设置成 select 选择框。当改变option时,进行访问toLogin方法。 为了简便,这里使用链接来说明。


三.二 springmvc.xml 配置文件,配置SessionLocaleResolver


  <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames">
      <value>login</value>
      <!-- 可依次写多个   <value>success</value>-->
    </property>
  </bean>
  <!-- 配置国际化的拦截器 -->
  <mvc:interceptors>
    <!-- 必须配置 -->
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
  </mvc:interceptors>
  <!-- 配置 SessionLocaleResolver 国际化bean,必须写 -->
  <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>


三.三 后端 toLogin() 方法时,设置 国际化语言


//转到登录的页面
  @RequestMapping(value="toLogin")
  public String toLogin(String request_locale,Model model,HttpServletRequest request){
    if(request_locale!=null&&!"".equals(request_locale)){
      Locale locale=null;
      if("zh_CN".equals(request_locale)){
        locale=new Locale("zh","CN");
        System.out.println("1");
      }else if("en_US".equals(request_locale)){
        locale=new Locale("en","US");
        System.out.println("2");
      }else{
        locale=LocaleContextHolder.getLocale();
        System.out.println("3");
      }
      request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,
          locale);
    }else{
      request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,
          LocaleContextHolder.getLocale());
    }
    model.addAttribute("user",new User());
    return "user/login";
  }
  //绑定到user对象。
  @RequestMapping(value="login") 
  public String login(@Validated User user,HttpServletRequest request,Model model){
    System.out.println("接收值:"+user.toString());
    model.addAttribute("user",user);
    return "user/list";
  }


要求使用 SessionLocaleResolver 类中的 LOCALE_SESSION_ATTRIBUTE_NAME 这个属性,来进行设置更改。


三.四 重启服务器,进行测试


浏览器环境是 英文的,


刚进去访问时:


微信图片_20211228220904.png


点击中文时,进行访问,页面上的国际化信息会改变


微信图片_20211228220935.png


点击英文时,进行访问,会改变。


微信图片_20211228220959.png


可以根据链接,进行随意的更改转换,与浏览器语言无关。


四. CookieLocaleResolver 国际化的使用


上面那个SessionLocaleResolver 可以通过链接进行改变,但在第一次进行访问的时候,没有传入参数值,是默认的英文。 当关闭浏览器时,再次访问,还是显示英文,即使上次保留的是中文。 Session在浏览器关闭时,被销毁了,这也是session的作用域。 没有办法将最后选择存储起来。 而Cookie 可以解决这一点,将国际化的信息放置在cookie 里面。


前端页面保持不变。


四.一 springmvc.xml 配置文件,配置CookieLocaleResolver


<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames">
      <value>login</value>
      <!-- 可依次写多个   <value>success</value>-->
    </property>
  </bean>
  <!-- 配置国际化的拦截器 -->
  <mvc:interceptors>
    <!-- 必须配置 -->
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
  </mvc:interceptors>
  <!-- 配置 SessionLocaleResolver 国际化bean,必须写 -->
  <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"></bean>


四.二 后端 toLogin() 方法时,设置 国际化语言


  @RequestMapping(value="toLogin")
  public String toLogin(String request_locale,Model model,HttpServletRequest request,
      HttpServletResponse response){
    CookieLocaleResolver cookieResolver=new CookieLocaleResolver();
    Cookie [] cookies=request.getCookies();
    Cookie newCookie=getCookieByName(cookies,"locale");
    if(newCookie==null){
      //没有这个cookie,则设置为当前的。 默认是没有的,当点击那两个链接之后,就有了。
      if(request_locale!=null&&!"".equals(request_locale)){
        newCookie=new Cookie("locale",request_locale);
        newCookie.setMaxAge(60*60*24*7);
        newCookie.setPath("/SpringMVC06"); //设置项目名
        response.addCookie(newCookie);
        Locale locale=null;
        if("zh_CN".equals(request_locale)){
          locale=new Locale("zh","CN");
        }else if("en_US".equals(request_locale)){
          locale=new Locale("en","US");
        }else{
          locale=LocaleContextHolder.getLocale();
        }
        cookieResolver.setLocale(request, response, locale);
      }else{
        cookieResolver.setLocale(request, response, LocaleContextHolder.getLocale());
      }
    }else{
      if(request_locale!=null&&!"".equals(request_locale)){
        Locale locale=null;
        if("zh_CN".equals(request_locale)){
          locale=new Locale("zh","CN");
        }else if("en_US".equals(request_locale)){
          locale=new Locale("en","US");
        }else{
          locale=LocaleContextHolder.getLocale();
        }
        if(newCookie!=null){
          newCookie=new Cookie("locale",request_locale);
          newCookie.setValue(request_locale);
          newCookie.setMaxAge(60*60*24*7);
          newCookie.setPath("/SpringMVC06");
        }
        response.addCookie(newCookie);
        cookieResolver.setLocale(request, response, locale);
      }else{
        String value=newCookie.getValue(); 
        Locale locale=null;
        if("zh_CN".equals(value)){
          locale=new Locale("zh","CN");
        }else if("en_US".equals(value)){
          locale=new Locale("en","US");
        }else{
          locale=LocaleContextHolder.getLocale();
        }
        cookieResolver.setLocale(request, response, locale);
      }
    }
    model.addAttribute("user",new User());
    return "user/login";
  }
  private Cookie getCookieByName(Cookie []cookies,String name){
    if(cookies!=null){
      for(int i=0;i<cookies.length;i++){
        if(cookies[i].getName().equals(name)){
          return cookies[i];
        }
      }
    }
    return null;
  }
  //绑定到user对象。
  @RequestMapping(value="login") 
  public String login(@Validated User user,HttpServletRequest request,Model model){
    System.out.println("接收值:"+user.toString());
    model.addAttribute("user",user);
    return "user/list";
  }


设置的是 CookieLocaleResolver .


四.三 重启服务器,进行验证。


还是浏览器是英文的状态下。


第一次访问时:


微信图片_20211228221221.png


点击中文的链接,设置成中文之后,页面变成了中文,添加了cookie.


微信图片_20211228221257.png


关闭浏览器。


再次进行访问时:


微信图片_20211228221355.png


可知,可以保留上次的cookie值。


SpringMVC 设置的默认的cookie 名为 : org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE, 但不知道怎么使用的。


谢谢!!!


相关文章
|
6月前
|
XML 前端开发 Java
SpringMVC中资源国际化使用实践
SpringMVC中资源国际化使用实践
83 0
|
10月前
|
Java
SpringMVC-国际化
SpringMVC-国际化
38 0
|
8月前
|
Java Spring
springmvc-国际化&中英文切换&文件上传&下载
springmvc-国际化&中英文切换&文件上传&下载
|
10月前
|
编解码 前端开发 Java
springMVC--数据验证以及国际化
springMVC--数据验证以及国际化
98 0
|
前端开发 Java 应用服务中间件
Spring MVC-08循序渐进之国际化(基于Session-SessionLocaleResolver)
Spring MVC-08循序渐进之国际化(基于Session-SessionLocaleResolver)
49 0
|
前端开发 IDE Java
Spring MVC-08循序渐进之国际化(AcceptHeaderLocaleResolver)
Spring MVC-08循序渐进之国际化(AcceptHeaderLocaleResolver)
91 0
|
前端开发 Java 数据库连接
SpringMVC的数据验证和JSR 303国际化显示(十一)下
SpringMVC的数据验证和JSR 303国际化显示(十一)下
318 0
SpringMVC的数据验证和JSR 303国际化显示(十一)下
|
前端开发 Java 数据库连接
SpringMVC的数据验证和JSR 303国际化显示(十一)中
SpringMVC的数据验证和JSR 303国际化显示(十一)中
194 0
SpringMVC的数据验证和JSR 303国际化显示(十一)中
|
前端开发 JavaScript Java
SpringMVC的数据验证和JSR 303国际化显示(十一)上
SpringMVC的数据验证和JSR 303国际化显示(十一)上
201 0
SpringMVC的数据验证和JSR 303国际化显示(十一)上
|
前端开发 Java Spring
SpringMVC的国际化操作(十)上
SpringMVC的国际化操作(十)上
262 0
SpringMVC的国际化操作(十)上