SpringMVC 的 Validation 校验

南楼画角 提交于 2021-02-11 12:47:18

1、maven配置文件引入架包:

 <!-- SpringMVC -->
 <dependency>
     ...
 </dependency>
 <!-- SpringMVC中用到了Hibernate的Validator包 -->
 <dependency>
     <groupId>org.hibernate</groupId>
     <artifactId>hibernate-validator</artifactId>
     <version>5.1.3.Final</version>
 </dependency>

 

2、常用Bean对象的注释

     @NotBlank 不为空或空字符串

     @NotNull 不为空

     @Size(min, max) 字符串长度

     @Email 邮箱格式

     @Pattern(regexp) 正则表达式匹配

    注释用法:

 public class LoginParam {
     private String user;
     private String password;
     
     @NotBlank(message = "用户不能为空")
     @Size(min = 5, max = 20, message = "用户长度范围为5-20个字符")
     public String getUser() {
         return user;
     }
     
     public void setUser(String user) {
         this.user = user;
     }

     @NotBlank(message = "密码不能为空")
     @Size(min = 5, max = 30, message = "密码长度范围为5-30个字符")
     public String getPassword() {
         return password;
     }
 
     public void setPassword(String password) {
         this.password = password;
     }
 }

 

3、后台处理

 @RequestMapping(value = "/login", method = RequestMethod.GET)
 public ModelAndView login(LoginParam param) {
     return new ModelAndView("user/login");
 }

 @RequestMapping(value = "/login", method = RequestMethod.POST)
 public ModelAndView loginSubmit(@Valid LoginParam param, BindingResult valid) {
     if (valid.hasErrors()) {
         return new ModelAndView("user/login");
     }
     return new ModelAndView("redirect:/");
 }

    (1) 提交方法,要在参数上添加 @Valid 注释,紧挨着参数后添加 BindingResult参数。

    (2) 页面访问方法,LoginParam参数必须,要不会报错,找不到model。

 

4、前台处理,jstl标签的使用

 <%@taglib prefix="f" uri="http://www.springframework.org/tags/form"%>
 ......
 <f:form method="post" modelAttribute="loginParam">
     <f:errors path="*" style="color:red" />
     <div>
         <label>用户名</label>
         <f:input path="user" />
     </div>
     <f:errors path="user" style="color:red" />
     <div>
         <label>密码</label>
         <f:password path="password" />
     </div>
     <f:errors path="password" style="color:red" />
     <div>
         <button type="submit">登录</button>
     </div>
 </f:form>

     (1) <f:form> 中的 modelAttribute="loginParam" 值要和后台参数的类名相同。

     (2) <f:errors> 重的path="*" 是匹配全部错误,path="user" 值匹配 user的错误。


5、向 BindingResult 中添加自己的错误信息

     一般用的有两种:

          (1) ObjectError 不对应到字段,可以被<f:errors path="*" />获取到。

          (2) FieldError 对应到字段的,构造方法有两种:

 new FieldError(String objectName, String field, String defaultMessage);
 /* 建议是这种,这种可以把值 rejectedValue 传回到前台 */
 new FieldError(String objectName, String field, Object rejectedValue,
                 boolean bindingFailure, String[] codes, Object[] arguments, String defaultMessage);

     例子:

 @RequestMapping(value = "/login", method = RequestMethod.POST)
 public ModelAndView loginSubmit(@Valid LoginParam param, BindingResult valid) {
     
     valid.addError(new FieldError("loginParam", "user", param.getUser(), false, null, null,"手工添加的字段错误"));

     valid.addError(new ObjectError("loginParam", "手工添加的通用错误"));
     
     if (valid.hasErrors()) {
         return new ModelAndView("user/login");
     }
     return new ModelAndView("redirect:/");
 }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!