Spring MVC 数据绑定流程
由WebDataBinder进行数据的类型转换,格式化,校验;
其属性ConversionService进行数据的类型转换,格式化,其属性validator进行数据的校验,绑定流程的错误会绑定到功能处理方法的形参BingResult对象中;
可进行细粒度的数据绑定,例如:
电话号码:<input type="text" name="phoneNumber.content"/><br/>
以上请求的URL映射的功能处理方法的形参是User类型的,其有一个PhoneNumber类型的名为phoneNumber属性,该属性有一个名为content的String类型的属性;
数据校验,使用BindingResult/Errors,必须紧跟对应的形参,绑定的结果会写进这个对象,要进行数据校验必须要导入hibernate-validator-5.2.2.Final.jar,validation-api-1.1.0.CR1.jar,涉及到报之间的兼容问题,要小心,以上两个是可行的;
@Entity @Table(name = "user") @NamedQueries({ @NamedQuery(name = "User.findByUsername", query = "SELECT o FROM User as o WHERE o.username = ?") }) public class User { @Column(name = "id") @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @NotNull @Column(name = "username") private String username; @NotNull @Column(name = "password") private String password; @Transient private PhoneNumber phoneNumber; @Transient private String address; // @NotNull(message = "{user.position.error}") @Column(name = "position") private String position; @NumberFormat(style=Style.NUMBER, pattern="#,###") private Integer asset; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public PhoneNumber getPhoneNumber() { return phoneNumber; } public void setPhoneNumber(PhoneNumber phoneNumber) { this.phoneNumber = phoneNumber; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getPosition() { return position; } public void setPosition(String position) { this.position = position; } public Integer getAsset() { return asset; } public void setAsset(Integer asset) { this.asset = asset; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((position == null) ? 0 : position.hashCode()); result = prime * result + ((username == null) ? 0 : username.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) obj; if (position == null) { if (other.position != null) return false; } else if (!position.equals(other.position)) return false; if (username == null) { if (other.username != null) return false; } else if (!username.equals(other.username)) return false; return true; } @Override public String toString() { return username; } }
其中 @NotNull 就是用于校验的注解,如果为null,Spring就会把错误绑定到BindingResult/Errors;
详细的源代码流程如下:
浙公网安备 33010602011771号