在實際中,一般使用較可能是前端的校驗,好比頁面中js校驗,對於安全要求較高的建議在服務端也要進行校驗。服務端校驗能夠是在控制層conroller,也能夠是在業務層service,controller校驗頁面請求的參數的合法性,在服務端控制層conroller的校驗,不區分客戶端類型(瀏覽器、手機客戶端、遠程調用);service層主要校驗關鍵業務參數,僅限於service接口中使用的參數。這裏主要總結一下何如使用springmvc中後臺Model和controller(控制器)的校驗。css
一.環境準備前端
springmvc中咱們使用hibernate的校驗框架validation(注:和hibernate沒有任何關係),使用這個校驗框架的話,須要導入jar包,以下:
java
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>4.3.1.Final</version> </dependency> <!--validation api--> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.0.0.GA</version> </dependency>
二.配置檢驗器web
<!--包掃描器--> <context:component-scan base-package="day15"></context:component-scan> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean> <!--驗證器--> <bean id="myValidator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property> </bean> <!--註解驅動--> <mvc:annotation-driven validator="myValidator" ></mvc:annotation-driven>
三.在實體類中進行數據校驗spring
/** * 後臺數據校驗 */ public class UserInfo { public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } /* public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; }*/ /*@NotBlank 用於String @NotEmpty 用於集合類型 @NotNull 用於基本類型*/ @NotBlank(message = "用戶名不能夠爲空") @Size(min = 2,message = "用戶名必須大於2個字符") private String username; @NotNull(message = "年齡不能夠爲空") @Max(value = 100,message = "年齡不能超過100!") @Min(value = 0,message = "年齡不能小於0歲!") private Integer age; @NotEmpty(message = "郵箱不能夠爲空") @Pattern(regexp = "^\\w+@\\w+\\.\\w+$",message = "郵箱格式不正確") private String email; @NotEmpty(message = "電話不能夠爲空") @Pattern(regexp = "^1[3|8|5|9|7]\\d{9}$",message = "電話必須是十一位") private String phone; /* @NotEmpty(message = "出生日期不能夠爲空") @DateTimeFormat(pattern = "yyyy-MM-dd") private Date birthday;*/ }
四.捕獲校驗錯誤信息api
@Controller public class ValidatorCotroller { @RequestMapping("/first") /** * BindingResult和@Valid是須要一塊兒使用的 * 且Binding存在於@Valid以後 是用來存放校驗結果的 從中獲取錯誤信息 * */ public String doFirst(@Valid UserInfo info, BindingResult result, Model model){ //result.getErrCount>0是表明着有錯誤信息 if(result.getErrorCount()>0){ //獲取到頁面上的錯誤信息屬性值 FieldError username = result.getFieldError("username"); //聲明一個Model 將獲取到的UserINfo的屬性值經過addAttribute()放入model中 方便頁面上的值回顯 model.addAttribute("username",info.getUsername()); FieldError age = result.getFieldError("age"); model.addAttribute("age",info.getAge()); // FieldError birthday = result.getFieldError("birthday"); FieldError phone = result.getFieldError("phone"); model.addAttribute("phone",info.getPhone()); FieldError email = result.getFieldError("email"); model.addAttribute("email",info.getEmail()); /** * 若是獲取到的錯誤信息爲不等於空 */ if(username!=null){ //經過上邊獲取到的屬性的返回值變量去拿到錯誤信息 而後放入model 在Input文本框後邊顯示錯誤信息 String nameMessage = username.getDefaultMessage(); model.addAttribute("nameMessage",nameMessage); } if( age!=null){ String ageMessage = age.getDefaultMessage(); model.addAttribute("ageMessage",ageMessage); } if(phone!=null){ String phoneMessage = phone.getDefaultMessage(); model.addAttribute("phoneMessage",phoneMessage); } if(email!=null){ String emailMessage = email.getDefaultMessage(); model.addAttribute("emailMessage",emailMessage); } //若是有錯誤 就返回本頁面 return "student"; } //不然跳轉到成功的頁面 return "suecssful"; } }