数据绑定和表单标签库
1. 数据绑定
在Spring mvc 框架中,数据绑定的含义有:
①绑定请求参数输入值到领域模型(Model);
②模型数据到视图的绑定(输入验证失败时:el表达式);
③模型数据到表单元素的绑定(如下拉列表选项值有控制器初始化)
数据绑定的优点:
① 有了数据绑定,不需要手动将HTTP请求中的String类型转换为模型需要的类型
② 当输入验证失败时,会重新生成一个HTML表单,无需重新填写输入字段(自动回填,例如当添加商品失败再回到添加页面时不需要重新输入之前输入过的信息)
2. 表单标签库
JSP 页面使用 Spring 表单标签库时,必须在 JSP 页面开头处声明 taglib 指令,如下:
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
表单标签库有:form、input、password、hidden、textarea、checkbox、checkboxes、radiobutton、radiobuttons、select、option、options、errors。
标签 | 作用 |
---|---|
form | 渲染表单元素 |
input | 渲染< input type=“text”/>元素 |
password | 渲染< input type=“password”/>元素 |
hidden | 渲染< input type=“hidden”/>元素 |
textarea | 渲染textarea元素 |
checkbox | 渲染一个< input type=“checkbox”/>元素 |
checkboxes | 渲染多个< input type=“checkbox”/>元素 |
radiobutton | 渲染一个< input type=“radio”/>元素 |
radiobuttons | 渲染多个< input type=“radio”/>元素 |
select | 渲染一个选择元素 |
option | 渲染一个选项元素 |
options | 渲染多个选项元素 |
errors | 在span元素中渲染字段错误 |
⑴form表单标签
<form:form modelAttribute="xxx" method="post" action="xxx">...</form:form>
modelAttribute:暴露form backing object 的模型属性名称,默认为command
@RequestMapping("/input")
public String inputUser(Model model){
...
model.addAttribute("user",new User());
return "useradd";
}
<!--useradd.jsp -->
<form:form modelAttribute="user" method="post" action="xxx">...</form:form>
注意:inputUser方法中如果没有Model属性user,useradd.jsp 页面就会抛出异常,因为表单标签无法找到在其modelAttribute属性中指定的form backing object。
⑵ input 标签
<form:input path="xxx"/>
path 属性将文本框输入值绑定到 form backing object 的一个属性。
<!-- 将输入值绑定到user对象的userName属性(实体类的属性名需和path属性值相同) -->
<form:form modelAttribute="user" method="post" action="xxx">
<form:input path="userName"/>
</form:form>
⑶ password 标签
<form:password path="xxx"/>
与 input 标签的使用方法一致
⑷ hidden 标签
<form:hidden path="xxx"/>
与 input 标签用法一致
⑸ textarea 标签
<form:textarea path="xxx"/>
textarea 标签就是一个支持多行输入的 input 元素,与 input 标签的使用方法一致
⑹ checkbox 标签
<form:checkbox path="xxx" value="xxx"/>
多个path相同的 checkbox 标签,他们是一个选项组,允许多选。选项值绑定到一个数组属性,其他用法与 input 标签一样
<form:checkbox path="friends" value="张三(数据库中)"/>张三(显示给用户)
<form:checkbox path="friends" value="李四"/>李四
<form:checkbox path="friends" value="王五"/>王五
<form:checkbox path="friends" value="赵六"/>赵六
<!-- 绑定到了一个字符串数组属性friends(String[] friends) -->
⑺ checkboxes 标签
<form:checkboxes items="xxx" path="xxx"/>
checkboxes 标签渲染多个复选框,是一个选项组,等价于多个path相同的checkbox标签,有三个属性:items、itemLabel、itemValue。
items:用于生成input元素的Collection、Map、Array。
itemLabel:items属性中指定的集合对象的属性,为每个input元素提供label。
itemValue:items属性中指定的集合对象的属性,为每个input元素提供value。
<!-- model.addAttribute("hobbys",hobbys);
将model属性hobbys的内容(集合元素)渲染为复选框。
itemLabel和itemValue默认情况下,如果集合是数组,复选框的label和value相同;
如果是Map集合,复选框的label是Map的值(value),复选框的value是Map的关键字(key)
-->
<form:checkboxes items="${hobbys }" path="hobby"/>
⑻ radiobutton 标签
<form:radiobutton path="xxx" value="xxx"/>
用法:多个path相同的 radiobutton 标签,它们是一个选项组,只允许单选。与checkbox类似
⑼ radiobuttons 标签
<form:radiobuttons path="xxx" items="xxx"/>
radiobuttons标签渲染多个radio标签,是一个选项组,等价于多个path相同的radiobutton标签,与checkboxes用法一致,但只允许单选。
⑽ select 标签
<form:select path="xxx" items="xxx" />
<!-- 或 -->
<from:select path="xxx" items="xxx">
<option value="xxx">xxx</option>
</form:select>
<!-- 或 -->
<form:select path="carrer">
<form:options items="${carrers }"/> <!-- items="${carrers } model 中的数据 -->
</form:select>
该标签的itemLabel 和 itemValue 属性与checkboxes标签的itemLabel和itemValue属性完全一样。
⑾ options 标签
options 标签生成一个select标签的选项列表。需要与select 标签一同使用,参考select 标签。
⑿ errors 标签
<form:errors path="*"/>
<!-- 或 -->
<form:errors path="xxx"/>
渲染一个或多个span元素,每个span元素包含一个错误信息。可以用于显示一个特定的错误信息,也可以显示所有的错误信息。其中 “*” 表示显示所有的错误信息;“xxx” 表示由 “xxx” 指定的错误信息。