*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的校验器 -->
<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的校验器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- 校验器-->
<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>
<!-- 错误配置信息,注意不要写文件后缀studentValidationMessages.properties, 这个错误,害我调了两个多小时fuck 千万不要写 -->
<value>classpath:studentValidationMessages</value>
</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";
}
}
页面显示代码:
<form action="${pageContext.request.contextPath }/student/insert.action" method="post">
name<input type="text" name="name" value="${student.name }"><br/>
age:<input type="text" name="age" value="${student.age }"><br/>
<input type="submit" value="添加" >
<hr/>
</form>
打印校验信息
<c:forEach items="${errors}" var="err">
${err.defaultMessage }
</c: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源代码如下:*