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:/"); }