除了前端的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來判斷是否存在錯誤。
