首页 > 代码库 > spring和springmvc国际化应用

spring和springmvc国际化应用

目的:

@1在视图层显示的文字显国际化

@2数据验证后显示国际化

@3通过超链接的参数,让客户自动选择国际化

    1:在spring.xml中配置国际化类,让容器管理国际化

    2:在页面显示国际化:可以使用spring的标签<st:message code="userName"></st:message>

    @2数据验证

    1: 代码层数据验证:自动装配 MessageSource source java代码层根据不同的区域获取不同语言的错误信息,并将错误信息添加至结果中

    2:属性类数据验证:使用自定义数据验证注解,在springmvc.xml中创建bean,l设置属性数据验证,并引用国际化messagesource,可以让数据验证达到国际化效果

    @3:使用LocaleChangeInterceptor拦截器,拦截指定参数的值,然后使用 SessionLocaleResolver 替代默认 将locale对应的值存放 session中

//spring.xml

<!--国际化 id必须为后两个单词,第一个单词小写 -->
    <bean id="messageSource"
        class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename">
            <value>/ui</value>
        </property>
    </bean>

//jsp

<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="http://www.springframework.org/tags/form"  prefix="s"%>    
<%@taglib uri="http://www.springframework.org/tags"  prefix="st"%>    


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Insert title here</title>
<script type="text/javascript">

  function $(name){
      return document.getElementsByName(name);
  }
  /*
       前端验证  在跳转到后台服务器之前进行验证 
        安全性差 减轻服务器压力
  
  */
  function checkForm(){
      var userName=$("userName")[0].value;
      /**
      if(userName==null || userName==‘‘){
          alert(‘请输入用户名‘);
          return;
      }**/
      document.forms[0].submit();
  }

</script>
</head>
<body>
<a href="http://www.mamicode.com/${pageContext.request.contextPath}/anation?request_locale=zh_CN">中文</a>
  <a href="http://www.mamicode.com/${pageContext.request.contextPath}/anation?request_locale=en_US">英文</a> 
  
  <form action="${pageContext.request.contextPath}/formValidate.action" method="post">
         
        <st:message code="userName"></st:message>:<input type="text" name="userName"/>
   <font color="red"><s:errors path="user.userName"></s:errors> </font><br/>
   
       <st:message code="phone"></st:message> <input type="text" name="phone"/>
        <font color="red"><s:errors path="user.phone"></s:errors> </font><br/>
    邮件 <input type="text" name="email"/>
        <font color="red"><s:errors path="user.email"></s:errors></font><br/>
  密码 <input type="password" name="password"/><s:errors path="user.password"></s:errors><br/>
 再次密码 <input type="password" name="repassword"/> <s:errors path="user.repassword"></s:errors><br/>
   <input type="button" onclick="checkForm()" value="http://www.mamicode.com/提交"/><br/>   
  </form>

</body>
</html>

@2:自动装配

package com.crazy.goods.tools.validator;

import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class ValdAction {
    
    
    @Autowired
    private MessageSource source;
    /**
     * 当@Valid注解标示的实体 验证失败后
     * 所有的错误消息都被注入到BindingResult对象中
     * 还可以在jsp上使用${userInfo.name}获取到对象的值
     * 
     * 显示错误时 springmvc标签的path 由对象名(类名第一个字母小写).属性名
     *    @ModelAttribute("user") 可以单独使用,无需和@valid一起使用 可以修改对象名  在页面上使用对象的属性获取值 是放在request区域内
     *    @  sessionAttribute           存在session区域内,一般不用
     *    3种方法可以将数据传递到模型中
     *    1:new ModelAndView("vald/suc",map)
     *    2:Model.addAttribute()
     *    3:ModelMap.put() 他是hashmap的子类
     * 
     * @param user
     * @param result
     * @return
     * @Valid  注解 :当经过springmvc调用时,看到参数有这个注解,就会跑到属性类进行验证,如果验证失败,会将失败的信息放在BindingResult类里面
     * @Valid UserInfo user 如果前面不加@ModelAttribute(name="user") 那么对象的名字为第一个字母小写 userInfo
     */
    @RequestMapping(value="/formValidate")
    public String user(@ModelAttribute(name="user") @Valid UserInfo user,BindingResult result,Locale locale){
        if(!user.getPassword().equals(user.getRepassword())){
        //根据不同的区域获取不同语言的错误信息,并将错误信息添加至结果中 String errorMsg
=source.getMessage("passwordError", null, locale); result.addError(new FieldError("user", "repassword", errorMsg)); } if(result.hasErrors()){ return "vald/form"; } return "vald/suc"; } @RequestMapping(value="/formValidate1") public String uploadpage() { return "vald/form"; } /** * 演示无耦合的方式传递数据 * request.setAttribute() 耦合 * //Model传递的键值对 实际上还是存放request.setAttribute("sex", "男"); * @param user * @param result * @return */ @RequestMapping(value="/model") public ModelAndView model(HttpServletRequest request){ //request.setAttribute("sex", "男"); Map map=new HashMap(); map.put("age", 100); map.put("sex", "男"); ModelAndView mav=new ModelAndView("vald/suc",map);//Model传递的键值对 实际上还是存放request.setAttribute("sex", "男"); return mav; } /** * 演示无耦合的方式传递数据 * request.setAttribute() 耦合 * * @param user * @param result * @return */ @RequestMapping(value="/model1") public String model(Model model,ModelMap mm){ //request.setAttribute("sex", "男"); model.addAttribute("age", 100); model.addAttribute("sex", "男"); mm.put("name", "zs"); return "vald/suc"; } }

@2。2//springmvc.xml 设置属性数据验证,并引用国际化messagesource,可以让数据验证达到国际化效果

<!-- springmvc默认的验证 就是实例化了 一个LocalValidatorFactoryBean的实例 其中没有实现国际化 手工创建一个该类的实例 
        并且注入 messageSouce 才能国际化 -->
    <bean id="myvlidat"
        class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="validationMessageSource" ref="messageSource"></property>
    </bean>

  

@3

<!-- 如果引用这个类,那么i18n拦截器获取到的值会调用 AcceptHeaderLocaleResolver 存储 不支持 存储 setLocale 
        使用 SessionLocaleResolver 替代默认 将locale对应的值存放 session中 -->
    <bean id="localeResolver"
        class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
    <mvc:interceptors>
        <!-- 定义i18n拦截器 用于获取请求头中的 locale对象 zh_CN 默认获取到了 request_locale的值 会调用 AcceptHeaderLocaleResolver 
            存储 不支持 存储 setLocale 使用 SessionLocaleResolver 替代默认 将locale对应的值存放 session中 -->
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
            <property name="paramName" value="http://www.mamicode.com/request_locale"></property>
        </bean>

    </mvc:interceptors> -->

//action

package com.crazy.goods.tools.validator;

import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class ValdAction {
    
    
    @Autowired
    private MessageSource source;
    /**
     * 当@Valid注解标示的实体 验证失败后
     * 所有的错误消息都被注入到BindingResult对象中
     * 还可以在jsp上使用${userInfo.name}获取到对象的值
     * 
     * 显示错误时 springmvc标签的path 由对象名(类名第一个字母小写).属性名
     *    @ModelAttribute("user") 可以单独使用,无需和@valid一起使用 可以修改对象名  在页面上使用对象的属性获取值 是放在request区域内
     *    @  sessionAttribute           存在session区域内,一般不用
     *    3种方法可以将数据传递到模型中
     *    1:new ModelAndView("vald/suc",map)
     *    2:Model.addAttribute()
     *    3:ModelMap.put() 他是hashmap的子类
     * 
     * @param user
     * @param result
     * @return
     * @Valid  注解 :当经过springmvc调用时,看到参数有这个注解,就会跑到属性类进行验证,如果验证失败,会将失败的信息放在BindingResult类里面
     * @Valid UserInfo user 如果前面不加@ModelAttribute(name="user") 那么对象的名字为第一个字母小写 userInfo
     */
    @RequestMapping(value="/formValidate")
    public String user(@ModelAttribute(name="user") @Valid UserInfo user,BindingResult result,Locale locale){
        if(!user.getPassword().equals(user.getRepassword())){
            String errorMsg=source.getMessage("passwordError", null, locale);
            result.addError(new FieldError("user", "repassword", errorMsg));
        }
        if(result.hasErrors()){
            return "vald/form";
        }
        return "vald/suc";
    }
    
    @RequestMapping(value="/formValidate1")
    public  String  uploadpage() {
        return "vald/form";
    }
    
    /**
     * 演示无耦合的方式传递数据
     *    request.setAttribute() 耦合
     * //Model传递的键值对 实际上还是存放request.setAttribute("sex", "男");
     * @param user
     * @param result
     * @return
     */
    @RequestMapping(value="/model")
    public ModelAndView model(HttpServletRequest request){
        //request.setAttribute("sex", "男");
        Map map=new HashMap();
        map.put("age", 100);
        map.put("sex", "男");
        ModelAndView mav=new ModelAndView("vald/suc",map);//Model传递的键值对 实际上还是存放request.setAttribute("sex", "男");
        return mav;
    }
    
    
    
    /**
     * 演示无耦合的方式传递数据
     *    request.setAttribute() 耦合
     * 
     * @param user
     * @param result
     * @return
     */
    @RequestMapping(value="/model1")
    public String model(Model model,ModelMap mm){
        //request.setAttribute("sex", "男");
        model.addAttribute("age", 100);
        model.addAttribute("sex", "男");
        mm.put("name", "zs");
        return "vald/suc";
    }
    
    
    
}

 

spring和springmvc国际化应用