springmvc注解开发-validation校验

使用注解的方式进行服务器端的数据校验。

Springmvc使用的是hibernate的校验框架validation(和hibernate没有任何关系)

1、校验思路:

页面提交请求的参数,请求到controller方法中,使用validation进行校验。如果校验出错,将错误信息展示到页面。

2、具体需求:

商品修改,添加校验(校验商品名称长度,生产日期非空校验),如果校验出错,在页面显示错误信息。

3、校验环境的搭建

Hibernate的校验框架所需要的jar包,下载地址:点击打开链接


4、配置校验器

springmvc的配置文件中添加配置校验器:

	<!-- 配置校验器 -->
	<!-- org.springframework.validation.beanvalidation.LocalValidatorFactoryBean为spring提供的一个校验接口,在这里面 除了可以指定hibernate的校验器之外,还可以指定其他的校验器;-->
	<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
		<!-- 使用hibernate提供的org.hibernate.validator.HibernateValidator校验器 -->
		<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">
		<!-- 资源文件名 为CustomValidationMessages.properties,因为这个歌basename,所以,配置文件中,不需要写后缀properties-->
		<property name="basenames">
			<list>
				<value>classpath:CustomValidationMessages</value>
			</list>
		</property>
		<!-- 资源文件编码格式 -->
		<property name="fileEncodings" value="utf-8"/>
		<!-- 对资源文件内容缓存时间,单位秒 -->
		<property name="cacheSeconds" value="120"/>
	</bean>

5、将校验器注入处理器适配器

	 <!-- validator=validator:在处理器适配器中注入校验器  方式一 -->
	<mvc:annotation-driven conversion-service="conversionService" validator="validator">
	</mvc:annotation-driven>

	<!-- 将校验器注入到适配器中方式二     -->
	<!-- 自定义webBinder -->
	<bean id="customBinder" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
		<property name="validator" ref="validator"/>
	</bean>
	<!-- 注解到适配器 -->
	<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
		<property name="webBindingInitializer" ref="customBinder"></property>
	</bean>

6、在pojo中添加校验规则

package com.sky.ssm.po;

import java.util.Date;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import com.sky.ssm.controller.validation.ValidGroup1;

public class Items {
    private Integer id;
    //校验名称长度在1~30之间,
    //message为 错误提示信息,{items.name.length.error}表示取配置文件中的信息
    //groups:将此校验划分至那个分组,groups可以定义多个分组
   <span style="background-color: rgb(255, 255, 102);"> @Size(min=1,max=30,message="{items.name.length.error}",groups={ValidGroup1.class})</span>
    private String name;
    private Double price;
    private String pic;
    //非空校验
   <span style="background-color: rgb(255, 255, 102);"> @NotNull(message="{items.createtime.isNull}")</span>
    private Date createtime;
<span style="white-space:pre">	</span>//省略....
}
在pojo中添加校验规则时,可以为其添加校验分组,groups,当不同的controller方法对一个pojo进行校验又需要不同的校验规则时,可以使用分组校验。

ValidGroup1.java

package com.sky.ssm.controller.validation;
/**
 * 校验分组
 * @author sk
 * 此分组只校验商品名称的长度
 */
public interface ValidGroup1 {
	//接口中不需要定义任何方法,仅是对不同的校验规则进行分组
}

7、编写错误信息提示文件

CustomValidationMessages.properties

#添加校验错误提示信息
items.name.length.error = 请输入1到30个字符的商品名称
items.createtime.isNull = 请输入商品的生产日期

8 捕获错误校验信息

	<span style="background-color: rgb(255, 255, 102);">//在需要校验的pojo前面添加@Validated,在需要校验的pojo后边添加BindingResult bindingResult接收校验出错信息
	//注意:@Validated和BindingResult是配对出现的,并且在形参里面的顺序是固定的(一前一后)
	//value={ValidGroup1.class}:指定使用ValidGroup1分组的校验</span>
	@RequestMapping("/editItemsSubmit")
	public String editItemsSubmit(Model model,HttpServletRequest request,Integer id,String name,
			<span style="background-color: rgb(255, 255, 102);">@Validated(value={ValidGroup1.class}) ItemsCustom itemsCustom,BindingResult bindingResult</span>) throws Exception{
		
		<span style="background-color: rgb(255, 255, 51);">//获取校验错误信息
		if(bindingResult.hasErrors()){//如果有错误
			//输出错误信息
			List<ObjectError> allErrors = bindingResult.getAllErrors();
			for (ObjectError objectError : allErrors) {
				//输出错误信息
				System.out.println(objectError.getDefaultMessage());
			}
			//将错误信息传到页面
			model.addAttribute("allErrors", allErrors);
			//出错后重新回到商品的修改页面
			return "items/editItems";<span style="color:#ffff66;">
		}</span></span>
		
		//调用service更新商品信息,页面需要将商品新传到此方法
		itemsService.updateItems(id, itemsCustom);
		
		//重定向到商品的查询列表
		return "redirect:queryItems.action";
	}

9 在页面显示校验错误信息

controller方法中将错误信息传到页面

页面显示错误信息

<!-- 显示错误信息 -->
<c:if test="${allErrors != null}">
	<c:forEach items="${allErrors }" var="error">
		${error.defaultMessage }</br>
	</c:forEach>
</c:if>

项目结构






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值