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="${pageContext.request.contextPath}/anation?request_locale=zh_CN">中文</a>
  <a href="${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="提交"/><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="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";
    }

}
时间: 2024-10-25 09:40:05

spring和springmvc国际化应用的相关文章

基于session 的springMvc 国际化

项目中采用springMvc的框架,需要动态切换语言,找了一些资料,最后决定采用基于session的动态切换,实现动态切换中文,英文,韩文,其实就是把中文翻译成其他语言显示 springMvc国际化包括两个方面,一个是前台页面的国际化,spring有自己的标签可以去实现,非常方便,另一个是后台java代码种涉及中文的国际化. 1.项目总体结构 有关bean的主要配置在spring-mvc.xml里配置,messages文件夹里放的是需要翻译的内容格式如下:key  =  value 的格式 英文

spring和springMVC整合注解版helloworld

整合的之前需要从官网上下载spring完整的jar包,我下载的是spring-framework-3.2.2.RELEASE.整合步骤如下: 1.在eclipse中新建一个web项目,将下载的spring的jar包拷入lib目录下,但是spring启动的时候依赖一个commons-logging-1.1.jar的jar包,你需要额外的下载. 2.编写web.xml,配置spring的分发器和spring配置文件的位置.具体内容如下: <servlet> <servlet-name>

Initializing Spring FrameworkServlet &#39;SpringMVC&#39;的解决

Apache Tomcat启动时候出现过好几次:Initializing Spring FrameworkServlet 'SpringMVC',然后程序卡在哪儿不会动了. 解决办法有两个: 一是:在MyEclipse菜单栏上找到Project菜单,打开选择clean,清理当前项目: 二是:如果是用Maven管理的项目,就在项目上右键,选择Run As-Maven Clean: 还有一个原因也会导致出现这种情况(这个原因应该占的概率还比较大),那就是mybatis的mapper文件里面的sql写

logback与Spring、SpringMVC结合使用教程

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要介绍了如何在spring.springMVC中使用logback 一.logback与Spirng结合使用 1.maven添加引用: <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.versio

Spring与SpringMVC的容器关系分析

Spring和SpringMVC作为Bean管理容器和MVC层的默认框架,已被众多WEB应用采用,而实际使用时,由于有了强大的注解功能,很多基于XML的配置方式已经被替代,但是在实际项目中,同时配置Spring和SpringMVC时会出现一些奇怪的异常,比如Bean被多次加载,多次实例化,或者依赖注入时,Bean不能被自动注入,但是明明你已经将该Bean注册了的.找原因还是要看问题的根源,我们从容器说起. 在Spring整体框架的核心概念中,容器是核心思想,就是用来管理Bean的整个生命周期的,

走进spring之springmvc

走进spring之springmvc 在动手之前,我们需要了解下springnvc.这里先献上一张springmvc的流程图及讲解. Spring的MVC框架是一个基于DispatcherServlet的MVC框架,主要由DispatcherServlet.处理器映射.处理器.视图解析器.视图组成.每一个请求最先访问的都是DispatcherServlet,DispatcherServlet负责转发每一个Request请求给相应的Handler,Handler处理以后再返回相应的视图(View)

【转】Spring+Mybatis+SpringMVC+Maven+MySql搭建实例

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了如何使用Maven来搭建Spring+Mybatis+SpringMVC+MySql的搭建实例,文章写得很详细,有代码有图片,最后也带有运行的效果. 本文工程免费下载 一.准备工作 1. 首先创建一个表: CREATE TABLE `t_user` ( `USER_ID` int(11) NOT NULL AUTO_INCREMENT, `USER_NAME` char(3

Spring和SpringMVC父子容器关系初窥

一.背景 最近由于项目的包扫描出现了问题,在解决问题的过程中,偶然发现了Spring和SpringMVC是有父子容器关系的,而且正是因为这个才往往会出现包扫描的问题,我们在此来分析和理解Spring和SpringMVC的父子容器关系并且给出Spring和SpringMVC配置文件中包扫描的官方推荐方式. 二.概念理解和知识铺垫 在Spring整体框架的核心概念中,容器是核心思想,就是用来管理Bean的整个生命周期的,而在一个项目中,容器不一定只有一个,Spring中可以包括多个容器,而且容器有上

Spring+Mybatis+SpringMVC+Maven+MySql搭建实例

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了如何使用Maven来搭建Spring+Mybatis+SpringMVC+MySql的搭建实例,文章写得很详细,有代码有图片,最后也带有运行的效果. 一.准备工作 1. 首先创建一个表: CREATE TABLE `t_user` ( `USER_ID` int(11) NOT NULL AUTO_INCREMENT, `USER_NAME` char(30) NOT NU