`
jaesonchen
  • 浏览: 313518 次
  • 来自: ...
社区版块
存档分类
最新评论

SpringMVC学习系列(8) 之 国际化

 
阅读更多

在系列(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>
复制代码

运行测试:

1

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

2

 

二.基于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">中文</a> | <a href="test?langType=en">英文</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";
    }
    
}
复制代码

运行测试:

3

4

 

三.基于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";
    }
    
}
复制代码

运行测试:

5

6

关于<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 来改变语言了,具体这里不再做演示了。

 

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

分享到:
评论

相关推荐

    超级详细SpringMVC学习资料

    6. 国际化:通过LocaleResolver和MessageSource实现多语言支持。 五、实战应用 1. 创建MVC项目:搭建SpringMVC环境,编写Controller,配置视图解析。 2. 搭建RESTful服务:创建RESTful API,处理GET、POST等请求。 ...

    springMvc学习相关jar包

    在这个"springMvc学习相关jar包"中,包含了一系列与 Spring MVC 开发相关的 jar 包,这些 jar 包是构建和运行 Spring MVC 应用的基础。下面我们将详细探讨 Spring MVC 的核心概念和关键组件。 1. **...

    springMVC资料

    在"springMVC3.2中英文手册"中,你将找到SpringMVC 3.2版本的详细文档,涵盖了许多主题,如配置、注解驱动的开发、数据绑定、异常处理、国际化、视图解析器、模型AndView对象的使用,以及与Spring其他模块(如AOP、...

    尚硅谷SpringMVC部分全套教学文档笔记

    8. **国际化**: - SpringMVC支持国际化,通过MessageSource接口提供多语言消息支持。 - 使用localeResolver来处理不同地区的用户请求,结合messages.properties文件实现不同语言的资源文件。 9. **文件上传**: ...

    一个简单的springMVC入门项目

    9. **国际化与本地化**:SpringMVC支持多语言环境,可以通过配置文件实现不同地区的消息显示。 10. **单元测试**:SpringMVC项目通常使用JUnit和Mockito等工具进行单元测试,确保代码质量。 压缩包中的“springMVC...

    SpringMVC后台

    SpringMVC允许开发者轻松实现应用的国际化和本地化,通过ResourceBundle和LocaleResolver处理不同语言环境下的显示内容。 13. **模板引擎**: SpringMVC可以配合模板引擎如Thymeleaf,简化视图渲染,动态生成HTML...

    jetbrick-springmvc jar包(包含源码)

    6. **国际化**:内置了便捷的国际化支持,可以轻松实现多语言环境下的应用开发。 7. **RESTful支持**:对RESTful风格的HTTP请求提供了良好的支持,包括HTTP方法、路径变量和查询参数的处理。 8. **拦截器**:扩展...

    springmvc 学习指南 源码 app01-app05

    这个"springmvc 学习指南 源码 app01-app05"压缩包包含了一系列的应用示例,帮助开发者从实践角度深入理解Spring MVC的工作原理和使用方式。 1. **Spring MVC 概述** Spring MVC是Spring框架的一部分,它负责处理...

    springMVC 学习参考第二版

    9. **国际化与本地化**:Spring MVC提供了强大的支持,允许根据用户请求的locale设置来展示不同语言的文本。 10. **Maven或Gradle构建**:大多数现代Spring MVC项目使用Maven或Gradle作为构建工具,它们管理依赖...

    springmvc完整的练习

    这个"springmvc完整的练习"应该包含了一系列用于学习和实践Spring MVC的代码和配置文件,帮助开发者深入理解其工作原理和最佳实践。下面将详细阐述Spring MVC的关键知识点。 1. **DispatcherServlet**: Spring MVC...

    SpringMVC 学习总结

    此外,SpringMVC 还提供了一系列的功能支持,如数据验证、数据绑定、国际化等。 #### SpringMVC参数绑定6种方式 1. **基本类型参数绑定**: 可以直接通过方法参数接受请求中的参数值,例如: ```java public ...

    springmvc课堂笔记

    - **强大的功能**:支持各种数据类型绑定、自动数据类型转换、国际化支持等。 - **易于测试**:提供了丰富的工具来支持单元测试和集成测试。 #### 二、SpringMVC核心组件解析 SpringMVC的工作流程涉及多个核心组件...

    跟开涛学SpringMVC(6.2)SpringMVC3强

    9. **国际化与本地化**: SpringMVC支持根据用户请求的locale参数提供多语言支持。通过`ResourceBundleMessageSource`和`LocaleResolver`,我们可以轻松地实现内容的国际化和本地化。 10. **上传下载支持**: ...

    springmvc 学习指南 源码 app06-app12

    9. **国际化与本地化**:Spring MVC 支持动态根据用户的语言环境来显示相应的消息。通过 `LocaleResolver` 和 `MessageSource`,你可以学习如何实现多语言支持。 10. **单元测试与集成测试**:为了确保 Spring MVC ...

    Java实训教程 Java软件开发实战 Java开发框架介绍 SpringMVC_8_标签库 共39页.pptx

    ### Java实训教程知识点...通过这份详细的教程,读者不仅能够系统地学习SpringMVC的基本原理和使用方法,还能够深入了解一些高级特性,如国际化、文件上传和拦截器等。这对于Java Web开发者来说是一份非常宝贵的资料。

    SpringMVC架构

    14. **国际化与本地化**:SpringMVC支持国际化和本地化,可以根据用户的语言和地区提供不同的消息和视图。 这个"SpringMVC简易架构"资源可能包含了以上提及的一些示例代码、配置文件、教程文档等,帮助开发者快速...

    springmvc基础框架(有示例)

    这个"springmvc基础框架(有示例)"的压缩包应该包含了从创建项目、配置环境、编写 Controller、实现数据绑定到处理异常的完整示例,非常适合初学者进行学习和实践。通过这些实例,你可以深入理解 Spring MVC 的工作...

Global site tag (gtag.js) - Google Analytics