本文将讲述spring form的一些常用标签,以及基于org.hibernate.validator和javax.validation 的javabean数据校验。
1 在views/home/下面建一个index.jsp 在jsp头部引入 <%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form"%> 然后写一个form表单。该表单每个标签下面都有一个 <sf:errors path="" /> 标签 这个标签是用来接收该属性的错误信息的
<sf:form method="POST" action="login" commandName="user">
用户名:<sf:input path="name" />
<sf:errors path="name" /><br/>
密码:<sf:password path="password" />
<sf:errors path="password" /><br/>
年龄:<sf:input path="age" />
<sf:errors path="age" /><br/>
邮箱:<sf:input path="email" type="email"/>
<sf:errors path="email" /><br/>
博客:<sf:input path="blogUrl"/>
<sf:errors path="blogUrl" /><br/>
<input type="submit" value="提交">
</sf:form>
注意 form表单有一个commandName 属性,这个属性必须与跳转到views/home/index.jsp的controller中的model的其中一个属性key一致.这句话有点绕。我将贴出代码详细讲解。假如我是在下面的controller跳转到views/home/index.jsp这个页面的。(读一些代码中的注释)
@RequestMapping("/")
public String home(Model model){
model.addAttribute("user", new User());
//这里的key "user" 与下面返回的jsp页面form表单的commandName属性对应,那么该form表单将展示 new User() 的数据
//如果jsp页面表单的commandName属性在此model中找不到对应的key则jsp页面将会报错
return "home/index";
}
public class User {
@NotBlank(message="用户名不能为空")//此注解来自于org.hibernate.validator
@Length(min=0,max=15,message="用户名必须介于0-15位")//此注解来自于org.hibernate.validator
private String name;
@NotNull(message="密码不能为空")//此注解来自于javax.validation
@Size(min=6,max=12,message="密码必须介于6-12位")//此注解来自于javax.validation
private String password;
@NotNull(message="年龄不能为空")
@Digits(fraction = 0, integer = 2,message="年龄不能超过两位数,且不能是小数")
@Min(value=0,message="年龄不能小于0")
@Max(value=99,message="年龄不能大于99")
private int age;
@Email(message="邮箱格式不正确")//此注解来自于org.hibernate.validator
@NotNull
private String email;//邮箱
@URL(message="博客地址不正确")//此注解来自于org.hibernate.validator
private String blogUrl;//博客地址
//省略setter 和 getter
//将下面三个方法的重写交给org.apache.commons.lang3.builder这个包
@Override
public boolean equals(Object that) {
return EqualsBuilder.reflectionEquals(this, that,"password","name");
}
@Override
public int hashCode(){
return HashCodeBuilder.reflectionHashCode(this,"password","name");
}
@Override
public String toString(){
return ReflectionToStringBuilder.toString(this);
}
}
3 新建一个接收form表单数据的controller
@RequestMapping("login")
public String login(@Valid User user,Errors errors){//这里user要用@valid注解
if(errors.hasErrors()){ //如果验证有错,在控制台打印所有错误信息 并返回原表单页面
List<ObjectError> list = errors.getAllErrors();
for(ObjectError oe : list){
System.out.println(oe.getDefaultMessage());
}
System.out.println(errors.getAllErrors());
return "home/index";
}
return "home/other";
}
4:验证结果 输入表单信息,点击提交 ,返回错误信息
当然 这些错误信息还可以做的更完美,即结合国际化去设置错误信息,国际化这个知识点将在以后的文章中提到。