除了前端的js验证,服务端也可加入数据验证,springmvc中有两种方式可以验证输入
- 利用spring自带的验证框架
- 利用jsr303实现
jsr303实现数据校验
jsr303是java为bean数据合法性校验所提供的标准框架。jsr303不需要编写验证器,它定义了一套可标注在成员变量、属性方法上的校验注解。
springmvc支持jsr303标准的校验框架,spring的DataBinder在进行数据绑定时,可同时调用校验框架来完成数据校验工作,非常方便。
spring本身没有提供jsr303的实现,hibernate validator实现了jsr303,所以必须在项目中加入来自hibernate validator库的jar文件,复制hibernate-validator-4.3.2.Final-dist.zip中的三个jar文件即可,spring将会自动加载并装配
- hibernate-validator-4.3.2.Final.jar
- jboss-logging-3.1.0.CR2.jar
- validator-api-1.0.0.GA.jar
package edu.cn.pojo; import org.hibernate.validator.constraints.Length; import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import javax.validation.constraints.Past; import java.util.Date; public class User { @NotEmpty(message = "用户编码不能为空") private String userCode; @NotEmpty(message = "用户名称不能为空") private String userName; @NotNull(message = "密码不能为null") @Length(min = 6, max = 10, message = "用户密码长度为6-10") private String userPassword; @Past(message = "必须是一个过去的时间") @DateTimeFormat(pattern = "yyyy-MM-dd") private Date birthday; //省略... }
在上述代码中,@Length 表示被注释的字符串的大小必须在指定范围内,这是hibernate validator提供的扩展注解
下一步就需要在controller中使用注解所声明的限制规则来进行数据的校验。由于<mvc:annotation-driven/>会默认装配好一个LocalValidatorFactoryBean,通过在controller的处理方法的入参上标注@Valid注解即可让springmvc在完成数据绑定之后,指定数据校验的工作。代码如下
@RequestMapping(value = "/add.html", method = RequestMethod.POST) public String addSave(@Valid User user, BindingResult bindingResult, HttpSession session){ if (bindingResult.hasErrors()){ return "user/useradd"; } user.setCreatedBy(((User)session.getAttribute("userSession")).getId()); user.setCreationDate(new Date()); if (userService.add(user)){ return "redirect:/user/userlist.html"; } return "user/useradd"; }
@Valid注解在validator-api依赖下,BindResult接口在spring-context依赖下
在上述代码中,在入参对象user前标注了@Valid注解,也就意味着将会调用校验框架,根据注解声明的校验规则实施校验,校验的结果存入后面紧跟的入参中,并且这个入参必须是BindingResult或者Error类型。在该方法体内,首先根据BindingResult来判断是否存在错误。