将表单绑定到模型上
- Sping的表单绑定JSP标签库与原生的HTML标签库的区别在于他们会绑定模型中的一个对象,能够根据模型中对象的属性填充值。
- 使用表单绑定库,需要在JSP页面声明:
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
- 一个注册页面的示例
<h1>Regiter</h1>
<sf:form method="post" commandName="spitter">
First Name: <sf:input path="firstName" /><br>
Last Name: <sf:input path="lastName" /><br>
User Name: <sf:input path="userName" /><br>
Password: <sf:input path="password" /><br>
<input type="submit" value="Regiter">
</sf:form>
<sf:form>会渲染一个HTML<form>标签,但它会通过commandName属性构建针对某个模型对象的上下文信息。在其他的表单绑定标签中,会引用这个模型对象的属性。
因为上面的代码中,commandName属性设置为spitter,因此,在模型中必须要有一个key为spitter的对象,否则的话,表单不能正常渲染(会出现JSP错误)。于是必须修改一下SpitterController:
@RequestMapping(value = "/register", method = RequestMethod.GET)
public String showRegistrationForm(Model model) {
model.addAttribute(new Spitter());
return "registerForm";
}
展现错误
- 在输入域的旁边展示错误信息
<sf:form method="post" commandName="spitter">
First Name: <sf:input path="firstName" />
<sf:errors path="firstName" cssClass="error"/> <br>
...
</sf:form>
path属性设置成firstName,也就指定了要显示Spitter模型中哪个属性的错误。通过设置cssClass属性可以修改错误的样式。
- 将所有错误信息在同一个地方显示
移除每个输入域上的 <sf:errors>元素,并将其放到表单的顶部。
<sf:form method="post" commandName="spitter">
<sf:errors path="*" element="div" cssClass="errors" />
...
</sf:form>
此处path被设置为“*”,这是一个通配符选择器,会告诉<sf:errors>展现所有属性的错误。
- 着重显示需要修正的输入域
通过为每个输入域设置cssErrorClass属性,也可以将label都替换为<sf:label>,并设置它的cssErrorClass属性。
<sf:form method="post" commandName="spitter">
<sf:errors path="*" element="div" cssClass="errors" />
<sf:label path="firstName"
cssClass="error">First Name:</sf:label>
<sf:input path="firstName" cssClass="error"/><br/>
...
</sf:form>
- 为了能够让这些错误信息更加易懂,可以在Spitter类的校验注解上设置message属性。
@NotNull
@Size(min = 2, max = 30, message = "{firstName.size}")
private String firstName;
@NotNull
@Size(min = 2, max = 30, message = "{lastName.size}")
private String lastName;
@NotNull
@Size(min = 5, max = 16, message = "{userName.size}")
private String userName;
@NotNull
@Size(min = 2, max = 25, message = "{password.size}")
private String password;
将上面每个域@Size注解的message设置为一个字符串,如果没有用大括号括起来的话,message中的值将会作为展现给用户的错误信息。但是使用了大括号之后,我们使用的就是属性文件中的某一个信息,给属性包含了实际的信息。
接下来需要创建一个ValidationMessages.properties的文件,并将其放在根类路径下:
firstName.size=First name must be between {min} and {max} characters long.
lastName.size=Last name must be between {min} and {max} characters long.
userName.size=userName must be between {min} and {max} characters long.
password.size=Password must be between {min} and {max} characters long.
ValidationMessages.properties文件中的每条信息的Key值对应于注解中message属性占位符的值。同时最大和最小长度没有硬编码在ValidationMessages.properties文件中,也是用了占位符——{max}和{min},他们会引用@Size注解上所设置的max和min属性。
可以创建任意数量的ValidationMessages.properties文件,来涵盖所支持的语言和地区。
网友评论