下面是完成校验过程的总结:

需求:如果修改信息时,需要修改id不为0或者各种信息。那么再前端修改后,传回来信息时需要一个检验这个id是否为0,所以就用到了检验信息。

1.导入校验框架所需要的包

2.在xml文件中配置检验信息

       配置检验错误信息配置文件

<!-- 校验错误信息配置文件 ,当检验出来问题时,出错提示信息从这个classpath:CustomValidationMessage定义的信息提取-->
	<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
		<!-- 资源文件名 -->
		<property name="basenames">
			<list>
				<value>classpath:CustomValidationMessage</value>
			</list>
		</property>
		<!-- 资源文件编码格式 -->
		<property name="fileEncodings" value="utf-8"/>
		<!-- 对资源文件内容缓存时间,单位秒 -->
		<property name="cacheSeconds" value="120"/>
	</bean>

     2.2配置校验器

<!-- 配置校验器 -->
	<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
		<!-- 校验器,使用hibernate校验器 -->
		<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
		<!-- 指定校验使用的资源文件,在文件中配置校验错误信息,如果不指定则默认使用classpath下面的ValidationMessages.properties文件 -->
		<property name="validationMessageSource" ref="messageSource"/>
	</bean>

    2.3需要在适配器中注册校验功能

<mvc:annotation-driven validator="validator">
	</mvc:annotation-driven>

   

3接下来再pojo类型中添加校验


  假设现在检验name传回来时长度是否超标

@Size(min=1,max=30,message="{items.name.length.error}")
    private String name;

message里的信息,是从检验错误信息配置文件提取出来的,

CustomValidationMessage.properties文件内容如下
#配置错误提示信息
items.name.length.error=请输入1到30个字符的商品名称

4.再controller中捕获校验错误信息

假设这个name属性再pojo类型itemsCustoms中,因为传回来时是通过形参绑定数据的方法传回,那么需要再形参中加上注解,来完成捕获校验信息

public String editItemsSubmit(Model model, HttpServletRequest request,
			Integer id,
			@Validated   //再需要校验的pojo前加入注解,说明这个pojo需要校验
                        ItemsCustom itemsCustom,
			BindingResult bindingResult,
//再需要校验的pojo后加入 BindingResult bindingResult,这是用来存放校验结果,获取校验错误信息


//他们必须成对出现throws Exception { 
// 获取校验错误信息if (bindingResult.hasErrors()) { 
// 输出错误信息List<ObjectError> allErrors = bindingResult.getAllErrors();for (ObjectError objectError : allErrors) { System.out.println(objectError.getDefaultMessage());} 
// 将错误信息传到页面model.addAttribute("allErrors", allErrors);}

5.jsp中输出错误信息

再jsp页面中获取allErrors错误信息并输出,jsp页面前加一个判断如果有错误信息,输出错误信息,跳转到原页面(再controller中返回这个页面就行)

分组校验:

需要:如果我给pojo的两个属性都设置了校验规则

@NotNull(message="{items.createtime.isNull}")
    private Date createtime;
    @Size(min=1,max=30,message="{items.name.length.error}")
    private String name;

然而我的某个controller只想用一个name属性不为空的校验即可。那么就要用到分组校验

1.定义一个接口,有几个组就可以定义几个接口

package ssm.controller.validation;

public interface ValidGroup1 {
	
	//接口中不需要定义任何方法,仅仅是对不同的校验规则进行分组
	//此分组只校验商品名称长度

}





 2.在pojo的name属性的注解改为如下

@Size(min=1,max=30,message="{items.name.length.error}",groups={ValidGroup1.class})//相当于给这个校验设置了一个组,组名就是接口名+.class


3.在controller中

public String editItemsSubmit(Model model, HttpServletRequest request,
			Integer id,
			@Validated(value = { ValidGroup1.class }) ItemsCustom itemsCustom,//在controller中调用设置它调用的分组即可
			BindingResult bindingResult, 
		
			throws Exception {




由于这位博主总结的太详细,太好,直接转载过来看


这一篇博文主要总结一下springmvc中对数据的校验。在实际中,通常使用较多是前端的校验,比如页面中js校验,对于安全要求较高的建议在服务端也要进行校验。服务端校验可以是在控制层conroller,也可以是在业务层service,controller校验页面请求的参数的合法性,在服务端控制层conroller的校验,不区分客户端类型(浏览器、手机客户端、远程调用);service层主要校验关键业务参数,仅限于service接口中使用的参数。这里主要总结一下何如使用springmvc中controller的校验。

1. 环境准备

springmvc中我们使用hibernate的校验框架validation(注:和hibernate没有任何关系),使用这个校验框架的话,需要导入jar包(下载地址),如下: 

springmvc 验证list对象入参 springmvc校验_校验器

2. 配置校验器

在springmvc.xml配置文件中配置一下校验器,如下:

<!-- 配置校验器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <!-- 校验器,使用hibernate校验器 -->
    <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
    <!-- 指定校验使用的资源文件,在文件中配置校验错误信息,如果不指定则默认使用classpath下面的ValidationMessages.properties文件 -->
    <property name="validationMessageSource" ref="messageSource"/>
</bean>
<!-- 校验错误信息配置文件 -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <!-- 资源文件名 -->
    <property name="basenames">
        <list>
            <value>classpath:CustomValidationMessage</value>
        </list>
    </property>
    <!-- 资源文件编码格式 -->
    <property name="fileEncodings" value="utf-8"/>
    <!-- 对资源文件内容缓存时间,单位秒 -->
    <property name="cacheSeconds" value="120"/>
</bean>


配置规则就是bean和property属性,别把class和文件名写错了就行,这里有个配置是资源文件名,这个文件中我们将会配置一些错误信息。配置好了校验器后,需要将校验器注入到处理器适配器中,还是在springmvc.xml文件中,将我们配好的validator注入进去,如下: 

springmvc 验证list对象入参 springmvc校验_校验器_02

 

  这样校验器就配置好了。

3. 在pojo中添加校验

hibernate校验框架提供了很多注解校验,我先简单罗列一下:

注解

运行时检查

@AssertFalse

被注解的元素必须为false

@AssertTrue

被注解的元素必须为true

@DecimalMax(value)

被注解的元素必须为一个数字,其值必须小于等于指定的最小值

@DecimalMin(Value)

被注解的元素必须为一个数字,其值必须大于等于指定的最小值

@Digits(integer=, fraction=)

被注解的元素必须为一个数字,其值必须在可接受的范围内

@Future

被注解的元素必须是日期,检查给定的日期是否比现在晚

@Max(value)

被注解的元素必须为一个数字,其值必须小于等于指定的最小值

@Min(value)

被注解的元素必须为一个数字,其值必须大于等于指定的最小值

@NotNull

被注解的元素必须不为null

@Null

被注解的元素必须为null

@Past(java.util.Date/Calendar)

被注解的元素必须过去的日期,检查标注对象中的值表示的日期比当前早

@Pattern(regex=, flag=)

被注解的元素必须符合正则表达式,检查该字符串是否能够在match指定的情况下被regex定义的正则表达式匹配

@Size(min=, max=)

被注解的元素必须在制定的范围(数据类型:String, Collection, Map and arrays)

@Valid

递归的对关联对象进行校验, 如果关联对象是个集合或者数组, 那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验

@CreditCardNumber

对信用卡号进行一个大致的验证

@Email

被注释的元素必须是电子邮箱地址

@Length(min=, max=)

被注解的对象必须是字符串的大小必须在制定的范围内

@NotBlank

被注解的对象必须为字符串,不能为空,检查时会将空格忽略

@NotEmpty

被注释的对象必须为空(数据:String,Collection,Map,arrays)

@Range(min=, max=)

被注释的元素必须在合适的范围内 (数据:BigDecimal, BigInteger, String, byte, short, int, long and 原始类型的包装类 )

@URL(protocol=, host=, port=, regexp=, flags=)

被注解的对象必须是字符串,检查是否是一个有效的URL,如果提供了protocol,host等,则该URL还需满足提供的条件

上面我简单罗列了一些校验的注解,不同的注解的具体使用方法可以参考官方文档或者网上资料,这里我选择两个注解来说明如何使用这个hibernate验证框架。首先在自己的pojo中需要验证的属性上添加相应的验证注解: 

springmvc 验证list对象入参 springmvc校验_错误信息_03

 

  我们看到注解中可以指定message,那么这个message中的内容是错误消息配置文件中对应的key,取出来的就是对应的错误消息,所以针对这两个错误消息,我们写一下配置文件: 

springmvc 验证list对象入参 springmvc校验_校验器_04

4. 捕获校验错误信息

上面已经将校验相关的配置都配好了,接下来就需要在controller的方法中捕获校验结果中的错误信息,然后将这些错误信息传到前台去显示。那么controller的方法中该如何去捕获呢?如下: 

springmvc 验证list对象入参 springmvc校验_错误信息_05


  可以看出,在需要校验的pojo前边添加@Validated,在需要校验的pojo后边添加BindingResult bindingResult来接收校验出错信息。值得注意的是:@Validated和BindingResult bindingResult是配对出现,并且形参顺序是固定的(一前一后)。这样就可以顺利接收到错误信息了。关于前台的东西,我就不写了。

5. 分组校验

上面已经能完成springmvc的校验功能了,但是有个问题:刚刚是在pojo中定义了校验规则,但是pojo是被多个controller使用的,现在假如两个不同的controller使用的校验规则是不一样的,简单来说,一个controller不需要去校验生产日期,只要校验一下商品名称即可,另一个controller两个都要校验,这样就没法做了,因为两个controller都使用同一个pojo。 
  为了解决这个问题,我们可以定义多个校验分组(其实是一个java接口),分组中定义有哪些规则,每个controller方法使用不同的校验分组即可。看一下下面的例子就明白了: 
  首先定义一个校验分组:

public interface ValidGroup1 {

    //接口中不需要定义任何方法,仅仅是对不同的校验规则进行分组
    //此分组只校验商品名称的长度

}

然后我们在刚刚的pojo中,添加这个分组,如下: 

springmvc 验证list对象入参 springmvc校验_spring_06

 

  再看一下想要校验这个name字段的controller中是如何配置的: 

springmvc 验证list对象入参 springmvc校验_spring_07


  这样该controller就不会去校验生产日期的字段了,通过这种方式可以解决不同的controller校验不同字段的问题。