• 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";
        }
        
        
        
    }
  • 相关阅读:
    设计模式学习
    rabbitMQ topic实现广播
    rabbitMQ direct实现广播
    rabbitMQ fanout 实现广播
    rabbitMQ 生产者消费者
    python select 实现IO异步
    python gevent 爬虫
    python gevent socket
    python 协程
    python 进程池
  • 原文地址:https://www.cnblogs.com/wdx330616/p/7134292.html
Copyright © 2020-2023  润新知