*springmvc使用JSR-303校验规范,JSR-303是javaEE6的规范。
springmvc具体使用hibernate-validator校验框架(和hibernate的ORM没有关系),基于的bean的属性校验。*
所以需要导入jar包:
1.1注解用法:具体可以参考:hibernate官方文档:http://docs.jboss.org/hibernate/validator/4.2/reference/zh-CN/html_single/#validator-usingvalidator
简单介绍下:
1.2使用bean校验,需要的配置,需要在springmvc中配置:
如果不使用配置文件直接在注解中写入错误信息,需要配置校验器
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
bean>
然后在mvc注解驱动中引用即可
<mvc:annotation-driven validator="validator"/>
<context:component-scan base-package="com.leige.controler" />
如果使用错误配置文件需要在注解中使用占位符,替换错误信息
配置如下:
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
<property name="validationMessageSource" ref="messageSource" />
bean>
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:studentValidationMessagesvalue>
list>
property>
<property name="fileEncodings" value="utf-8" />
<property name="cacheSeconds" value="120" />
bean>
然后引用即可:
<mvc:annotation-driven validator="validator"/>
<context:component-scan base-package="com.leige.controler" />
在bean字段上使用注解校验,这里一起综合讲一下,分组校验,配置文件校验,还希望大家能接受:
public class Student {
private Integer sid;
/**
* 数据校验的错误信息可以直接写在注解中如(@NotNull(message="name不可为空")
@Size(min=3,max=15,message="名字必须在3-15之间"))
* ,也可以写在配置文件中如( @NotNull(message="${student.error.age.null}")),使用占位符替代
* 前提是首先要springmvc中加载配置文件,读取错误信息
*
*/
@NotNull(message="{student.name.null}",groups=(Validation1.class))
@Size(min=3,max=15,message="{student.name.size}",groups=(Validation1.class))
private String name;
@NotNull(message="{student.age.null}",groups=(Validation1.class))
private Integer age;
setter..
getter...
}
分组校验使用接口区分,不能使用类,接口中什么都不需要写,只是起到区分的作用,表示该校验规则使用哪个组,groups也可以同时指定多个分组
controler中应用校验规则
/**
* @param model
* @param student
* @param bindingResult
* @Validated和bindingResult是配对使用,
* 位置要固定,@Validated在校验的po对象的前边,
* bindingResult用于接收校验错误信息,要放在被校验对象的后边。
* @Validated(value=(Validation1.class)指定适用于哪个组
*/
@RequestMapping("/insert.action")
public String insertStudent(@Validated(value=(Validation1.class)) Student student,BindingResult bindingResult,Model model){
if(bindingResult.hasErrors()){//如果校验出错,则显示错误信息,并且回显
model.addAttribute("errors", bindingResult.getAllErrors());
//返回原页面
return "insert";
}else{
studentService.insert(student);
//成功返回success页面
return "success";
}
}
页面显示代码:
打印校验信息
forEach items="${errors}" var="err">
${err.defaultMessage }
forEach>
package com.leige.exception;
public class StudentException extends Exception {
//接收异常信息
public StudentException(String message) {
super(message);
}
}
2.2创建自定义异常的异常处理器
package com.leige.exception.handler;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import com.leige.exception.StudentException;
/**
* @author 自定义异常处理器需要实现springmvc异常处理接口HandlerExceptionResolver
*
*
*/
public class StudentExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
// TODO Auto-generated method stub
//判断异常类型
ModelAndView modelAndView=new ModelAndView();
if(ex instanceof StudentException){
StudentException studentException=(StudentException) ex;
//处理自定义异常
modelAndView.addObject("error",studentException.getMessage());
}else{
//如果是runtime异常,提示异常信息,例如:网站忙,请稍后连接
modelAndView.addObject("error","网站忙,请稍后连接");
}
//设置异常页面
modelAndView.setViewName("WEB-INF/jsp/error");
return modelAndView;
}
}
2.3创建异常页面就不用说了
2.4在springmvc中配置异常处理器,只需要加入如下配置即可:
<bean class="com.leige.exception.handler.StudentExceptionHandler">bean>
测试大家可以自己测试,这里就不在演示了,异常处理机制和struts2的有很多地方都是类似的\
注意注意
*异常处理器可以配置多个
配置多个异常处理器的目的是针对不同的异常类型分别进行处理,并且springmvc在执行异常处理器时是按配置的顺序去执行的,但是需要注意的是除最后一个异常处理器返回ModelAndView外,其它的异常处理器返回null,springmvc源代码如下:*