详解SpringMVC学习系列之国际化

在系列(7)中我们讲了数据的格式化显示,Spring在做格式化展示的时候已经做了国际化处理,那么如何将我们网站的其它内容(如菜单、标题等)做国际化处理呢?这就是本篇要将的内容—>国际化。

一.基于浏览器请求的国际化实现:

首先配置我们项目的springservlet-config.xml文件添加的内容如下:

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
  <!-- 国际化信息所在的文件名 -->
  <property name="basename" value="messages" />
  <!-- 如果在国际化资源文件中找不到对应代码的信息,就用这个代码作为名称 -->
  <property name="useCodeAsDefaultMessage" value="true" />
</bean>

在com.demo.web.controllers包中添加GlobalController.java内容如下:

package com.demo.web.controllers;

import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.support.RequestContext;
import com.demo.web.models.FormatModel;

@Controller
@RequestMapping(value = "/global")
public class GlobalController {

  @RequestMapping(value="/test", method = {RequestMethod.GET})
  public String test(HttpServletRequest request,Model model){
    if(!model.containsAttribute("contentModel")){

      //从后台代码获取国际化信息
      RequestContext requestContext = new RequestContext(request);
      model.addAttribute("money", requestContext.getMessage("money"));
      model.addAttribute("date", requestContext.getMessage("date"));

      FormatModel formatModel=new FormatModel();

      formatModel.setMoney(12345.678);
      formatModel.setDate(new Date());

      model.addAttribute("contentModel", formatModel);
    }
    return "globaltest";
  }

}

这里展示模型还用系列(7)中的作为演示。

在项目中的源文件夹resources中添加messages.properties、messages_zh_CN.properties、messages_en_US.properties三个文件,其中messages.properties、messages_zh_CN.properties里面的"money", "date",为中文,messages_en_US.properties里面的为英文。

在views文件夹中添加globaltest.jsp视图,内容如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

  下面展示的是后台获取的国际化信息:<br/>
  ${money}<br/>
  ${date}<br/>

  下面展示的是视图中直接绑定的国际化信息:<br/>
  <spring:message code="money"/>:<br/>
  <spring:eval expression="contentModel.money"></spring:eval><br/>
  <spring:message code="date"/>:<br/>
  <spring:eval expression="contentModel.date"></spring:eval><br/>

</body>
</html>

运行测试:

更改浏览器语言顺序,刷新页面:

二.基于Session的国际化实现:

在项目的springservlet-config.xml文件添加的内容如下(第一种时添加的内容要保留):

<mvc:interceptors>
  <!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 -->
  <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
</mvc:interceptors> 

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

更改globaltest.jsp视图为如下内容:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
  <a href="test?langType=zh" rel="external nofollow" >中文</a> | <a href="test?langType=en" rel="external nofollow" >英文</a><br/>

  下面展示的是后台获取的国际化信息:<br/>
  ${money}<br/>
  ${date}<br/>

  下面展示的是视图中直接绑定的国际化信息:<br/>
  <spring:message code="money"/>:<br/>
  <spring:eval expression="contentModel.money"></spring:eval><br/>
  <spring:message code="date"/>:<br/>
  <spring:eval expression="contentModel.date"></spring:eval><br/>

</body>
</html>

更改GlobalController.java为如下内容:

package com.demo.web.controllers;

import java.util.Date;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import org.springframework.web.servlet.support.RequestContext;
import com.demo.web.models.FormatModel;

@Controller
@RequestMapping(value = "/global")
public class GlobalController {

  @RequestMapping(value="/test", method = {RequestMethod.GET})
  public String test(HttpServletRequest request,Model model, @RequestParam(value="langType", defaultValue="zh") String langType){
    if(!model.containsAttribute("contentModel")){

      if(langType.equals("zh")){
        Locale locale = new Locale("zh", "CN");
        request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale);
      }
      else if(langType.equals("en")){
        Locale locale = new Locale("en", "US");
        request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale);
      }
      else
        request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,LocaleContextHolder.getLocale());

      //从后台代码获取国际化信息
      RequestContext requestContext = new RequestContext(request);
      model.addAttribute("money", requestContext.getMessage("money"));
      model.addAttribute("date", requestContext.getMessage("date"));

      FormatModel formatModel=new FormatModel();

      formatModel.setMoney(12345.678);
      formatModel.setDate(new Date());

      model.addAttribute("contentModel", formatModel);
    }
    return "globaltest";
  }

}

运行测试:

三.基于Cookie的国际化实现:

把实现第二种方法时在项目的springservlet-config.xml文件中添加的

代码如下:

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

注释掉,并添加以下内容:

代码如下:

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

更改GlobalController.java为如下内容:

package com.demo.web.controllers;

import java.util.Date;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
//import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import org.springframework.web.servlet.support.RequestContext;

import com.demo.web.models.FormatModel;

@Controller
@RequestMapping(value = "/global")
public class GlobalController {

  @RequestMapping(value="/test", method = {RequestMethod.GET})
  public String test(HttpServletRequest request, HttpServletResponse response, Model model, @RequestParam(value="langType", defaultValue="zh") String langType){
    if(!model.containsAttribute("contentModel")){

      /*if(langType.equals("zh")){
        Locale locale = new Locale("zh", "CN");
        request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale);
      }
      else if(langType.equals("en")){
        Locale locale = new Locale("en", "US");
        request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale);
      }
      else
        request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,LocaleContextHolder.getLocale());*/

      if(langType.equals("zh")){
        Locale locale = new Locale("zh", "CN");
        //request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale);
        (new CookieLocaleResolver()).setLocale (request, response, locale);
      }
      else if(langType.equals("en")){
        Locale locale = new Locale("en", "US");
        //request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale);
        (new CookieLocaleResolver()).setLocale (request, response, locale);
      }
      else
        //request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,LocaleContextHolder.getLocale());
        (new CookieLocaleResolver()).setLocale (request, response, LocaleContextHolder.getLocale());

      //从后台代码获取国际化信息
      RequestContext requestContext = new RequestContext(request);
      model.addAttribute("money", requestContext.getMessage("money"));
      model.addAttribute("date", requestContext.getMessage("date"));

      FormatModel formatModel=new FormatModel();

      formatModel.setMoney(12345.678);
      formatModel.setDate(new Date());

      model.addAttribute("contentModel", formatModel);
    }
    return "globaltest";
  }

}

运行测试:

关于<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />3个属性的说明(可以都不设置而用其默认值):

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
  <!-- 设置cookieName名称,可以根据名称通过js来修改设置,也可以像上面演示的那样修改设置,默认的名称为 类名+LOCALE(即:org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE-->
  <property name="cookieName" value="lang"/>
  <!-- 设置最大有效时间,如果是-1,则不存储,浏览器关闭后即失效,默认为Integer.MAX_INT-->
  <property name="cookieMaxAge" value="100000">
  <!-- 设置cookie可见的地址,默认是“/”即对网站所有地址都是可见的,如果设为其它地址,则只有该地址或其后的地址才可见-->
  <property name="cookiePath" value="/">
</bean>

四.基于URL请求的国际化的实现:

首先添加一个类,内容如下:

import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.LocaleResolver;

public class MyAcceptHeaderLocaleResolver extends AcceptHeaderLocaleResolver {

  private Locale myLocal;

  public Locale resolveLocale(HttpServletRequest request) {
    return myLocal;
  } 

  public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
    myLocal = locale;
  }

}

然后把实现第二种方法时在项目的springservlet-config.xml文件中添加的

代码如下:

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

注释掉,并添加以下内容:

<bean id="localeResolver" class="xx.xxx.xxx.MyAcceptHeaderLocaleResolver"/>

“xx.xxx.xxx”是刚才添加的MyAcceptHeaderLocaleResolver 类所在的包名。

保存之后就可以在请求的URL后附上 locale=zh_CN 或 locale=en_US 如 http://xxxxxxxx?locale=zh_CN 来改变语言了,具体这里不再做演示了。

国际化部分的内容到此结束。

代码下载:SpringMVCi18n_jb51.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java SpringMVC实现国际化整合案例分析(i18n)

    所谓国际化就是支持多种语言,web应用在不同的浏览环境中可以显示出不同的语言,比如说汉语.英语等.下面我将以具体的实例来举例说明: (1)新建动态Java web项目,并导入几个SpringMVC必需的几个jar包,项目结构图和所需jar包如下: (2)配置web.xml: <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-ins

  • 学习SpringMVC——国际化+上传+下载详解

    一个软件,一个产品,都是一点点开发并完善起来的,功能越来越多,性能越来越强,用户体验越来越好--这每个指标的提高都需要切切实实的做点东西出来,好比,你的这个产品做大了,用的人多了,不仅仅再是上海人用,北京人用,还有印度人用,法国人用等等,可以说这个产品已经走上了国际化的大舞台.当印度的哥们输入url访问产品时,界面上弹出"欢迎您,三哥",估计哥们当场就蒙圈了.而这个时候,国际化就应运而生了. 要做国际化这道菜,真的没有想象中的那么复杂,反而很简单,不信你看-- 1. 注入Resourc

  • Spring MVC的国际化实现代码

    Spring MVC的国际化是建立在Java国际化的基础上的,其一样是通过提供不同国家的语言环境的消息资源.通过ResourceBundle加载Locale对应的资源文件.再取得该资源文件中指定Key对应的消息. 步骤: 1.给系统加载国际化资源 2.输出国际化.Spring MVC输出国际化消息有两种方式. 在页面上输出国际化消息.需要使用Spring MVC的标签库. 在Controller的处理方法中输出国际化消息.需要使用org.springframework.web.servlet.s

  • 详解SpringMVC学习系列之国际化

    在系列(7)中我们讲了数据的格式化显示,Spring在做格式化展示的时候已经做了国际化处理,那么如何将我们网站的其它内容(如菜单.标题等)做国际化处理呢?这就是本篇要将的内容->国际化. 一.基于浏览器请求的国际化实现: 首先配置我们项目的springservlet-config.xml文件添加的内容如下: <bean id="messageSource" class="org.springframework.context.support.ResourceBun

  • 详解SpringMVC学习系列(6) 之 数据验证

    在系列(4).(5)中我们展示了如何绑定数据,绑定完数据之后如何确保我们得到的数据的正确性?这就是我们本篇要说的内容 -> 数据验证. 这里我们采用Hibernate-validator来进行验证,Hibernate-validator实现了JSR-303验证框架支持注解风格的验证.首先我们要到http://hibernate.org/validator/下载需要的jar包,这里以4.3.1.Final作为演示,解压后把hibernate-validator-4.3.1.Final.jar.jb

  • 详解SpringMVC的url-pattern配置及原理剖析

    xml里面配置标签: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> &

  • 详解SpringMVC从基础到源码

    认识SpringMVC SpringMVC 框架是以请求为驱动,围绕 Servlet 设计,将请求发给控制器,然后通过模型对象,分派器来展示请求结果视图.其中核心类是 DispatcherServlet,它是一个 Servlet,顶层是实现的Servlet接口. SpringMVC 处理请求过程 客户端发起请求,会首先经过前端控制器 DispatcherServlet 进行转发,转发到 Handler Mapping DispatcherServlet 从 Handler Mapping 查找处

  • 详解SpringMVC中的异常处理

    1. SpringMVC默认三个异常处理类 ExceptionHandlerExceptionResolver:处理@ExceptionHandler注解 ResponseStatusExceptionResolver:处理@ResponseStatus注解 DefaultHandlerExceptionResolver:处理SpringMVC自带的异常 如果以上3个异常解析器都无法处理,会上抛给tomcat,处理异常内部的默认工作流程:所有异常解析器依次尝试解析,解析完成进行后续操作,解析失败

  • 详解SpringMVC常用注解功能及属性

    目录 1.@RequestMapping注解 1.1@RequestMapping注解的功能 1.2@RequestMapping注解的位置 1.3@RequestMapping注解的value属性 1.4@RequestMapping注解的method属性 1.5@RequestMapping注解的params属性(了解) 1.6@RequestMapping注解的headers属性(了解) 1.7SpringMVC支持路径中的占位符(@PathVariable)(重点) 2.SpringMV

  • 实例详解SpringMVC入门使用

    MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Controller).通过分层使开发的软件结构更清晰,从而达到开发效率的提高,可维护性和扩展性得到提高.Spring提供的MVC框架是在J2EE Web开发中对MVC模式的一个实现,本文通过实例讲解一下Spring MVC 的使用. 先来看一个HTTP request在Spring的MVC框架是怎么被处理的:(图片来源于Spring

  • 详解SpringMVC HandlerInterceptor拦截器的使用与参数

    目录 拦截器概念: 拦截器VS过滤器 自定义拦截器开发过程: 拦截器配置项: 多拦截器配置: 拦截器概念: 拦截器( Interceptor)是一种动态拦截方法调用的机制,请求处理过程解析 核心原理: AOP思想 拦截器链:多个拦截器按照一定的顺序,对原始被调用功能进行增强 作用: 在指定的方法调用前后执行预先设定后的的代码 阻止原始方法的执行 拦截器VS过滤器 归属不同: 过滤器属于Servlet技术, 拦截器属于SpringMVC技术拦截内容不同: 过滤器对所有访问进行增强, 拦截器仅针对S

  • 详解SpringMVC的拦截器参数及拦截器链配置

    目录 一.拦截器参数 二.拦截器链配置 一.拦截器参数 前置处理 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle..."); return true; } 参数: ■ request:请求对象 ■ response:响应对象 ■ handle

  • 详解SpringMVC中拦截器的概念及入门案例

    目录 一.拦截器概念 二.拦截器入门案例 一.拦截器概念 拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行 作用: 在指定的方法调用前后执行预先设定的代码 阻止原始方法的执行 拦截器与过滤器区别  归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术 拦截内容不同:Filter对所有的访问进行增强,Interceptor仅针对SpringMVC的访问进行增强 二.拦截器入门案例 1.声明拦截器的

随机推荐