zoukankan      html  css  js  c++  java
  • Spring MVC基础知识整理➣数据校验与格式化

    概述

      将view中Form的数据提交到后台之后,后台如何验证数据的有效性?在这里Spring MVC提供了相应的Hibernate类包(hibernate-validator-4.3.1.Final.jar、jboss-logging-3.1.0.jar、validation-api-1.0.0.GA.jar)来校验数据的有效性。通过实体注解的方式,添加实体的有效属性。

    数据校验

      将上面需要的三个包文件添加到项目WEB-INF下的Lib之后,需要配置springservletconfig.xml文件,添加下面内容:

      <mvc:annotation-driven validator="validator" conversion-service="conversion-service" />    
        <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
            <property name="providerClass"  value="org.hibernate.validator.HibernateValidator"/>
            <!--不设置则默认为classpath下的 ValidationMessages.properties -->
            <property name="validationMessageSource" ref="validatemessageSource"/>
        </bean>
        <bean id="conversion-service" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />
        <bean id="validatemessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">  
            <property name="basename" value="classpath:validatemessages"/>  
            <property name="fileEncodings" value="utf-8"/>  
            <property name="cacheSeconds" value="120"/>  
        </bean>

    XML解析如下:

      SpringMVC的注解驱动,采用org.springframework.validation.beanvalidation.LocalValidatorFactoryBean类包进行数据校验,验证的错误信息提示读取当前项目下的 validatemessageSource.properties。采用org.springframework.format.support.FormattingConversionServiceFactoryBean类包进行数据格式转换;

    添加验证实体

    import org.hibernate.validator.constraints.NotEmpty;
    import org.hibernate.validator.constraints.Email;
    import org.hibernate.validator.constraints.Range;
    
    public class PersonModel {
    
        /** 
        * @Fields name : 姓名
        */ 
        
        @NotEmpty(message="{name.not.empty}")
        private String name;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        /** 
        * @Fields email : 邮箱 
        */ 
        @NotEmpty(message="{email.not.empty}")
        @Email(message="{email.not.correct}")
        private String email;
        public String getEmail() {
            return email;
        }
        public void setEmail(String email) {
            this.email = email;
        }
        /** 
        * @Fields age : 年龄 
        */ 
        @Range(min=0,max=100,message="{age.not.inrange}")
        private int age;
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
    }

    验证属性采用注解的方式,message读取validatemessageSource.properties设置的key值。

    添加validatemessageSource.properties文件,追加内容如下,和上面model设置的message保存同步

    name.not.empty=姓名不能为空
    age.not.inrange=年龄不是有效范围
    email.not.correct=邮箱格式不正确
    email.not.empty=有效不能为空

    添加From表单

      Jsp头需要添加<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>才能启用Spring的控件

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>数据校验</title>
    </head>
    <body>
        <form:form modelAttribute="contentModel" method="post">                                
            name:<form:input path="name" /><br/>
            <form:errors path="name"></form:errors><br/>        
            age:<form:input path="age" /><br/>
            <form:errors path="age"></form:errors><br/>        
            email:<form:input path="email" /><br/>
            <form:errors path="email"></form:errors><br/>
            <input type="submit" value="Submit" />        
        </form:form>  
    </body>
    </html> 

    添加Controller接受和校验数据

      @RequestMapping(value="/test", method = {RequestMethod.POST})
        public String Perstest(Model model,@Valid @ModelAttribute("contentModel") PersonModel permodel,BindingResult result)
        {
            if(result.hasErrors())
            {
                return Perstest(model);
            }
            else
            {
                return "validate/ValidSucc";
            }
        }

    其中@Valid表示添加数据校验注解,BindingResult获取绑定验证后台结果;

    数据格式化

      MVC-Spring格式采用的方式有2中,第一种采用注解的方式,第二种采用代码后台转换,借助Joda-Time包。

    Model注解格式

      需要在Model中添加格式化属性,比如@DateTimeFormat等

      @NumberFormat(style=Style.CURRENCY)
      private double money;
    @DateTimeFormat(pattern
    ="yyyy-MM-dd HH:mm:ss") private Date BirthData

      在View中需要采用<spring:eval>这样的转换方式获取。记得引用<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>

    <%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>    
        <spring:eval expression="FUser.UserName "></spring:eval> <br/>    
        <spring:eval expression="FUser.UBalace "></spring:eval>
        <spring:eval expression="FUser.UBirthData "></spring:eval>    
    </body>
    </html>

    采用Joda-Time包数据转换,FormattingConversionService和DefaultFormattingConversionService来完成对象的解析和格式化。

    使用FormattingConversionService,实例如下:

         CurrencyFormatter currencyFormatter=new CurrencyFormatter();
            currencyFormatter.setFractionDigits(2);
            currencyFormatter.setRoundingMode(RoundingMode.HALF_UP);
            DateFormatter dateFormatter=new DateFormatter();
            dateFormatter.setPattern("yyyy-MM-dd HH:mm:ss");
         Locale locale=LocaleContextHolder.getLocale();
            UserModel.setMoney(currencyFormatter.print(12345.678, locale));
            UserModel.setDate(dateFormatter.print(new Date(), locale));   

    使用DefaultFormattingConversionService,实例如下:

          FormatModel formatModel=new FormatModel();
             CurrencyFormatter currencyFormatter = new CurrencyFormatter();  
             currencyFormatter.setFractionDigits(2);//保留2位小数
             currencyFormatter.setRoundingMode(RoundingMode.HALF_UP);            
             DateFormatter dateFormatter=new DateFormatter();
             dateFormatter.setPattern("yyyy-MM-dd HH:mm:ss");            
             DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();  
             conversionService.addFormatter(currencyFormatter); 
             conversionService.addFormatter(dateFormatter);             
             UserModel.setMoney(conversionService.convert(12345.678, String.class));
             UserModel.setDate(conversionService.convert(new Date(), String.class));   

     格式化Formate格式如下:

    名称 功能
    NumberFormatter 实现Number与String之间的解析与格式化
    CurrencyFormatter 实现Number与String之间的解析与格式化(带货币符号)
    PercentFormatter 实现Number与String之间的解析与格式化(带百分数符号)
    DateFormatter 实现Date与String之间的解析与格式化
    NumberFormatAnnotationFormatterFactory @NumberFormat注解,实现Number与String之间的解析与格式化,可以通过指定style来指示要转换的格式(Style.Number/Style.Currency/Style.Percent),当然也可以指定pattern(如pattern=“#.##”(保留2位小数) ),这样pattern指定的格式会覆盖掉Style指定的格式
    JodaDateTimeFormatAnnotationFormatterFactory @DateTimeFormat注解,实现日期类型与String之间的解析与格式化这里的日期类型包括Date、
  • 相关阅读:
    int 类型 占多少字节是由什么决定的
    layer.js漂亮的弹出框
    jquery分页点击后页面置顶
    动态请求页面生成静态页
    弹出ifame页面(jquery.reveal.js)
    Request.QueryString["id"] 、Request.Params["id"] 的强大
    为什么现在改用int.TryParse了
    时间格式(例如:2015-11-09)
    返回前一页
    sql获得某个时间段的数据
  • 原文地址:https://www.cnblogs.com/xibei666/p/6649513.html
Copyright © 2011-2022 走看看