第 5 章数据绑定和表单标签库

内容关键字  :
数据绑定预览
表单标签库
表单标签属性
input 标签
password 标签
hidden标签
text area 标签
checkbox 标签
radio button 标签
checkboxes 标签
radio buttons 标签
select 标签
option 标签
options 标签
errors 标签

Domain类

Controller类

Service类

授课老师 720科技 张森鹏
一:知识笔记

5.1 表单标签库

表单标签库中包含了可以用在JSP 页面中渲染 HTML 元素的标签。为了使用这些标签, 必须在 JSP 页面的开头处声明这个 taglib 指令。

<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

5.1 展示了表单标签库中的标签。

在接下来的小节中,将逐一介绍这些标签。5.3 节展示了一个范例应用程序,展示了数据绑定结合表单标签库的使用方法。

5.1   表单标签库中的标签

 

标签

描述

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 元素中渲染字段错误


 

5.1.1 表单标签

表单标签用于渲染HTML 表单。要使用渲染一个表单输入字段的任何其他标签,必须有一个 form 标签。表单标签的属性见表 5.2。

5.2 中的所有标签都是可选的。这个表中没有包含 HTML 属性,如 method action。

commandName 属性或许是其中最重要的属性,因为它定义了模型属性的名称,其中包含了一个表单支持对象(form backing object),其属性将用于填充所生成的表单。如果该属性存在,则必须在返回包含该表单的视图的请求处理方法中添加相应的模型属性。例如,在本章配套的 tags-demo 应用程序中,下列表单标签是在 BookAddForm.jsp 中定义的。

<form:form commandName="book" action="save-book" method="post">

...

</form:form>

 

5.2   表单标签的属性

 

属性

描述

acceptCharset

定义服务器接受的字符编码列表

commandName

暴露表单对象之模型属性的名称,默认为 command

cssClass

定义要应用到被渲染 form 元素的 CSS 类

cssStyle

定义要应用到被渲染 form 元素的 CSS 样式

htmlEscape

接受 true 或者 false,表示被渲染的值是否应该进行 HTML 转义

modelAttribute

暴露表单支持对象的模型属性名称,默认为 command

BookController 类中的 inputBook 方法,是返回 BookAddForm.jsp 的请求处理方法。下面就是 inputBook 方法。

@RequestMapping(value = "/input-book") public String inputBook(Model model) {

...

model.addAttribute("book", new Book());

return "BookAddForm";

}

此处用 book 属性创建了一个 Book 对象,并添加到 Model。如果没有 Model 属性,

BookAddForm.jsp 页面就会抛出异常,因为表单标签无法找到在其 commandName 属性中指定 form backing object。


 

此外,一般来说,仍然需要使用 action method 属性。这两个属性都是 HTML 属性, 因此不在表 5.2 之中。

 

5.1.2 input 标签

input 标签渲染<input type="text"/>元素。这个标签最重要的属性是 path,它将这个输入字段绑定到表单支持对象的一个属性。例如,若随附<form/>标签的 commandName 属性值为 book 并且input 标签的 path 属性值为 isbn,那么,input 标签将被绑定到 Book 对象的 isbn 属性。

5.3 展示了 input 标签的属性。表 5.3 中的属性都是可选的,其中不包含 HTML 属性。

5.3   input 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖

cssClass 属性值

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的值进行 HTML 转义

path

要绑定的属性路径

举个例子,下面这个 input 标签被绑定到表单支持对象的 isbn 属性。

<form:input id="isbn" path="isbn" cssErrorClass="errorBox"/>

它将会被渲染成下面的<input/>元素:

<input type="text" id="isbn" name="isbn"/>

cssErrorClass 属性不起作用,除非 isbn 属性中有输入验证错误,并且采用同一个表单重新显示用户输入,在这种情况下,input 标签就会被渲染成下面这个 input 元素。

<input type="text" id="isbn" name="isbn" class="errorBox"/>

input 标签也可以绑定到嵌套对象的属性。例如,下列的 input 标签绑定到表单支持对象的

category 属性的 id 属性。

<form:input path="category.id"/>

 

5.1.3 password 标签

password 标签渲染<input type="password"/>元素,其属性见表 5.4。password 标签与 input

 

标签相似,只不过它有一个 showPassword 属性。

5.4   password 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的值进行 HTML 转义

path

要绑定的属性路径

showPassword

表示应该显示或遮盖密码,默认值为 false

5.4 中的所有属性都是可选的,这个表中不包含HTML 属性。下面是一个 password 标签的例子。

<form:password id="pwd" path="password" cssClass="normal"/>

 

5.1.4 hidden 标签

hidden 标签渲染<input type="hidden"/>元素,其属性见表 5.5。hidden 标签与 input 标签相似,只不过它没有可视的外观,因此不支持cssClass cssStyle 属性。

5.5   hidden 标签的属性

 

属性

描述

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的值进行 HTML 转义

path

要绑定的属性路径

5.5 中的所有属性都是可选的,其中不包含 HTML 属性。下面是一个 hidden 标签的例子。

<form:hidden path="productId"/>

 

5.1.5 textarea 标签

textarea 标签渲染一个 HTML  textarea 元素。Textarea 实际上就是支持多行输入的一个

input 元素。textarea 标签的属性见表 5.6。表 5.6 中的所有属性都是可选的,其中不包含 HTML

属性。


 

5.6   textarea 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的值进行 HTML 转义

path

要绑定的属性路径

例如,下面的 textarea 标签就是被绑定到表单支持对象的 note 属性。

<form:textarea path="note" tabindex="4" rows="5" cols="80"/>

 

5.1.6 checkbox 标签

checkbox 标签渲染<input type="checkbox"/>元素。checkbox 标签的属性见表 5.7。表 5.7

中的所有属性都是可选的,其中不包含HTML 属性。

5.7   checkbox 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义

label

要作为标签用于被渲染复选框的值

path

要绑定的属性路径

例如,下面的 checkbox 标签绑定到 outOfStock 属性:

<form:checkbox path="outOfStock" value="Out of Stock"/>

 

5.1.7 radiobutton 标签

radiobutton 标签渲染<input type="radio"/>元素。radiobutton 标签的属性见表 5.8。表 5.8

中的所有属性都是可选的,其中不包含HTML 属性。

例如,下列的 radiobutton 标签绑定到 newsletter 属性。


 

Computing Now <form:radiobutton path="newsletter" value="Computing Now"/>

<br/>

Modern Health <form:radiobutton path="newsletter" value="Modern Health"/>

5.8   radiobutton 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义

label

要作为标签用于被渲染复选框的值

path

要绑定的属性路径

 

5.1.8 checkboxes 标签

checkboxes 标签渲染多个<input type="checkbox"/>元素。checkboxes 标签的属性见表 5.9。表 5.9 中的属性都是可选的,其中不包含 HTML 属性。

例如,下面的 checkboxes 标签将 model 属性 categoryList 的内容渲染为复选框。checkboxes 标签允许进行多个选择。

<form:checkboxes path="category" items="${categoryList}"/>

5.9   checkboxes 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

delimiter

定义两个 input 元素之间的分隔符,默认没有分隔符

element

给每个被渲染的 input 元素都定义一个 HTML 元素,默认为“span”

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义

items

用于生成 input 元素的对象的 Collection、Map 或者 Array

itemLabel

item 属性中定义的 Collection、Map 或者 Array 中的对象属性,为每个 input 元素提供标签

itemValue

item 属性中定义的 Collection、Map 或者 Array 中的对象属性,为每个 input 元素提供值

path

要绑定的属性路径


 

5.1.9 radiobuttons 标签

radiobuttons 标签渲染多个<input type="radio"/>元素。radiobuttons 标签的属性见表 5.10。

例如,下面的 radiobuttons 标签将 model 属性 categoryList 的内容渲染为单选按钮。每次只能选择一个单选按钮。

<form:radiobuttons path="category" items="${categoryList}"/>

 

5.10   radiobuttons 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

delimiter

定义两个 input 元素之间的分隔符,默认没有分隔符

element

给每一个被渲染的 input 元素都定义一个 HTML 元素,默认为“span”

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义

items

用于生成 input 元素的对象的 Collection、Map 或者 Array

itemLabel

item 属性中定义的 Collection、Map 或者 Array 中的对象属性,为每个 input 元素提供标签

itemValue

item 属性中定义的 Collection、Map 或者 Array 中的对象属性,为每个 input 元素提供值

path

要绑定的属性路径

 

5.1.10 select 标签

select 标签渲染一个HTML select 元素。被渲染元素的选项可能来自赋予其 items 属性的一个 Collection、Map、Array,或者来自一个嵌套的 option 或者 options 标签。select 标签的属性见表 5.11。表 5.11 中的所有属性都是可选的,其中不包含 HTML 属性。

items 属性特别有用,因为它可以绑定到对象的 Collection、Map、Array,为 select 元素生成选项。

例如,下面的 select 标签绑定到表单支持对象的 category 属性的 id 属性。它的选项来自

model 属性 categories。每个选项的值均来自 categories collection/map/array id 属性,它的标签来自 name 属性。

<form:select id="category" path="category.id"


 

items="${categories}" itemLabel="name" itemValue="id"/>

5.11   select 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义

items

用于生成 input 元素的对象的 Collection、Map 或者 Array

itemLabel

item 属性中定义的 Collection、Map 或者 Array 中的对象属性,为每个 input 元素提供标签

itemValue

item 属性中定义的 Collection、Map 或者 Array 中的对象属性,为每个 input 元素提供值

path

要绑定的属性路径

 

5.1.11 option 标签

option 标签渲染 select 元素中使用的一个HTML option 元素,其属性见表 5.12。表 5.12

中的所有属性都是可选的,其中不包含HTML 属性。

例如,下面是一个 option 标签的范例。

5.12   option 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义

 

<form:select id="category" path="category.id" items="${categories}" itemLabel="name" itemValue="id">

<option value="0">-- Please select --</option>

</form:select>

这个代码片断是渲染一个 select 元素,其选项来自 model 属性 categories,以及 option

标签。


 

5.1.12 options 标签

options 标签生成一个 HTML option 元素列表,其属性见表 5.13,其中不包含 HTML

属性。

tags-demo 应用程序展示了一个 options 标签的范例。

5.13   options 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义

items

用于生成 input 元素的对象的 Collection、Map 或者 Array

itemLabel

item 属性中定义的 Collection、Map 或者 Array 中的对象属性,为每个 input 元素提供标签

itemValue

item 属性中定义的 Collection、Map 或者 Array 中的对象属性,为每个 input 元素提供值

 

5.1.13 errors 标签

errors 标签渲染一个或者多个 HTML 的span 元素,每个 span 元素中都包含一个字段错误。这个标签可以用于显示一个特定的字段错误,或者所有字段错误。

errors 标签的属性见表 5.14。表 5.14 中的所有属性都是可选的,其中不包含可能在 HTML

span 元素中出现的HTML 属性。

例如,下面这个 errors 标签显示了所有字段错误。

<form:errors path="*"/>

下面的 errors 标签显示了一个与表单支持对象的 author 属性相关的字段错误。

<form:errors path="author"/>

 

5.14   errors 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式


 

续表

属性

描述

Delimiter

分隔多个错误消息的分隔符

element

定义一个包含错误消息的 HTML 元素

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义

path

要绑定的错误对象路径

5.2 数据绑定范例

在表单标签库中利用标签进行数据绑定的例子,参见 tags-demo 应用程序。这个范例围绕

domain  Book 进行。这个类中有几个属性,包括一个类型为 Category  category 属性。

Category id name 两个属性。

这个应用程序允许列出书目、添加新书,以及编辑书目。

5.2.1 目录结构

5.1 中展示了 tags-demo 的目录结构。

5.1   tags-demo 的目录结构

授课老师 720科技 张森鹏

一:知识笔记

5.1 数据绑定概览

基于 HTTP 的特性,所有 HTTP 请求参数的类型均为字符串。在前面的章节中,为了获取正确的产品价格,不得不将字符串解析成BigDecimal 类型。为了便于复习,这里把第 4 章中ProductController 类的 saveProduct 方法的部分代码复制过来了。

@RequestMapping(value="save-product")

public String saveProduct(ProductForm productForm, Model model) {

logger.info("saveProduct called");

// no need to create and instantiate a ProductForm

// create Product

Product product = new Product(); product.setName(productForm.getName()); product.setDescription(productForm.getDescription()); try {

product.setPrice(new BigDecimal(productForm.getPrice()));

} catch (NumberFormatException e) {

}

之所以需要解析  ProductForm  中的  price  属性,是因为它是一个  String,却需要用

BigDecimal 来填充  Product   price 属性。有了数据绑定,就可以用下面的代码取代上面的

saveProduct 方法部分。

@RequestMapping(value="save-product")

public String saveProduct(Product product, Model model)

有了数据绑定,就不再需要 ProductForm 类,也不需要解析Product 对象的 price 属性了。数据绑定的另一个好处是:当输入验证失败时,它会重新生成一个 HTML 表单。手工编

HTML 代码时,必须记着用户之前输入的值,重新填充输入字段。有了 Spring 的数据绑定

和表单标签库后,它们就会替你完成这些工作。

5.1 表单标签库

表单标签库中包含了可以用在JSP 页面中渲染 HTML 元素的标签。为了使用这些标签, 必须在 JSP 页面的开头处声明这个 taglib 指令。

<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

5.1 展示了表单标签库中的标签。

在接下来的小节中,将逐一介绍这些标签。5.3 节展示了一个范例应用程序,展示了数据绑定结合表单标签库的使用方法。

5.1   表单标签库中的标签

 

标签

描述

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 元素中渲染字段错误


 

5.1.1 表单标签

表单标签用于渲染HTML 表单。要使用渲染一个表单输入字段的任何其他标签,必须有一个 form 标签。表单标签的属性见表 5.2。

5.2 中的所有标签都是可选的。这个表中没有包含 HTML 属性,如 method action。

commandName 属性或许是其中最重要的属性,因为它定义了模型属性的名称,其中包含了一个表单支持对象(form backing object),其属性将用于填充所生成的表单。如果该属性存在,则必须在返回包含该表单的视图的请求处理方法中添加相应的模型属性。例如,在本章配套的 tags-demo 应用程序中,下列表单标签是在 BookAddForm.jsp 中定义的。

<form:form commandName="book" action="save-book" method="post">

...

</form:form>

 

5.2   表单标签的属性

 

属性

描述

acceptCharset

定义服务器接受的字符编码列表

commandName

暴露表单对象之模型属性的名称,默认为 command

cssClass

定义要应用到被渲染 form 元素的 CSS 类

cssStyle

定义要应用到被渲染 form 元素的 CSS 样式

htmlEscape

接受 true 或者 false,表示被渲染的值是否应该进行 HTML 转义

modelAttribute

暴露表单支持对象的模型属性名称,默认为 command

BookController 类中的 inputBook 方法,是返回 BookAddForm.jsp 的请求处理方法。下面就是 inputBook 方法。

@RequestMapping(value = "/input-book") public String inputBook(Model model) {

...

model.addAttribute("book", new Book());

return "BookAddForm";

}

此处用 book 属性创建了一个 Book 对象,并添加到 Model。如果没有 Model 属性,

BookAddForm.jsp 页面就会抛出异常,因为表单标签无法找到在其 commandName 属性中指定 form backing object。


 

此外,一般来说,仍然需要使用 action method 属性。这两个属性都是 HTML 属性, 因此不在表 5.2 之中。

 

5.1.2 input 标签

input 标签渲染<input type="text"/>元素。这个标签最重要的属性是 path,它将这个输入字段绑定到表单支持对象的一个属性。例如,若随附<form/>标签的 commandName 属性值为 book 并且input 标签的 path 属性值为 isbn,那么,input 标签将被绑定到 Book 对象的 isbn 属性。

5.3 展示了 input 标签的属性。表 5.3 中的属性都是可选的,其中不包含 HTML 属性。

5.3   input 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖

cssClass 属性值

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的值进行 HTML 转义

path

要绑定的属性路径

举个例子,下面这个 input 标签被绑定到表单支持对象的 isbn 属性。

<form:input id="isbn" path="isbn" cssErrorClass="errorBox"/>

它将会被渲染成下面的<input/>元素:

<input type="text" id="isbn" name="isbn"/>

cssErrorClass 属性不起作用,除非 isbn 属性中有输入验证错误,并且采用同一个表单重新显示用户输入,在这种情况下,input 标签就会被渲染成下面这个 input 元素。

<input type="text" id="isbn" name="isbn" class="errorBox"/>

input 标签也可以绑定到嵌套对象的属性。例如,下列的 input 标签绑定到表单支持对象的

category 属性的 id 属性。

<form:input path="category.id"/>

 

5.1.3 password 标签

password 标签渲染<input type="password"/>元素,其属性见表 5.4。password 标签与 input

 

标签相似,只不过它有一个 showPassword 属性。

5.4   password 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的值进行 HTML 转义

path

要绑定的属性路径

showPassword

表示应该显示或遮盖密码,默认值为 false

5.4 中的所有属性都是可选的,这个表中不包含HTML 属性。下面是一个 password 标签的例子。

<form:password id="pwd" path="password" cssClass="normal"/>

 

5.1.4 hidden 标签

hidden 标签渲染<input type="hidden"/>元素,其属性见表 5.5。hidden 标签与 input 标签相似,只不过它没有可视的外观,因此不支持cssClass cssStyle 属性。

5.5   hidden 标签的属性

 

属性

描述

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的值进行 HTML 转义

path

要绑定的属性路径

5.5 中的所有属性都是可选的,其中不包含 HTML 属性。下面是一个 hidden 标签的例子。

<form:hidden path="productId"/>

 

5.1.5 textarea 标签

textarea 标签渲染一个 HTML  textarea 元素。Textarea 实际上就是支持多行输入的一个

input 元素。textarea 标签的属性见表 5.6。表 5.6 中的所有属性都是可选的,其中不包含 HTML

属性。


 

5.6   textarea 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的值进行 HTML 转义

path

要绑定的属性路径

例如,下面的 textarea 标签就是被绑定到表单支持对象的 note 属性。

<form:textarea path="note" tabindex="4" rows="5" cols="80"/>

 

5.1.6 checkbox 标签

checkbox 标签渲染<input type="checkbox"/>元素。checkbox 标签的属性见表 5.7。表 5.7

中的所有属性都是可选的,其中不包含HTML 属性。

5.7   checkbox 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义

label

要作为标签用于被渲染复选框的值

path

要绑定的属性路径

例如,下面的 checkbox 标签绑定到 outOfStock 属性:

<form:checkbox path="outOfStock" value="Out of Stock"/>

 

5.1.7 radiobutton 标签

radiobutton 标签渲染<input type="radio"/>元素。radiobutton 标签的属性见表 5.8。表 5.8

中的所有属性都是可选的,其中不包含HTML 属性。

例如,下列的 radiobutton 标签绑定到 newsletter 属性。


 

Computing Now <form:radiobutton path="newsletter" value="Computing Now"/>

<br/>

Modern Health <form:radiobutton path="newsletter" value="Modern Health"/>

5.8   radiobutton 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义

label

要作为标签用于被渲染复选框的值

path

要绑定的属性路径

 

5.1.8 checkboxes 标签

checkboxes 标签渲染多个<input type="checkbox"/>元素。checkboxes 标签的属性见表 5.9。表 5.9 中的属性都是可选的,其中不包含 HTML 属性。

例如,下面的 checkboxes 标签将 model 属性 categoryList 的内容渲染为复选框。checkboxes 标签允许进行多个选择。

<form:checkboxes path="category" items="${categoryList}"/>

5.9   checkboxes 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

delimiter

定义两个 input 元素之间的分隔符,默认没有分隔符

element

给每个被渲染的 input 元素都定义一个 HTML 元素,默认为“span”

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义

items

用于生成 input 元素的对象的 Collection、Map 或者 Array

itemLabel

item 属性中定义的 Collection、Map 或者 Array 中的对象属性,为每个 input 元素提供标签

itemValue

item 属性中定义的 Collection、Map 或者 Array 中的对象属性,为每个 input 元素提供值

path

要绑定的属性路径


 

5.1.9 radiobuttons 标签

radiobuttons 标签渲染多个<input type="radio"/>元素。radiobuttons 标签的属性见表 5.10。

例如,下面的 radiobuttons 标签将 model 属性 categoryList 的内容渲染为单选按钮。每次只能选择一个单选按钮。

<form:radiobuttons path="category" items="${categoryList}"/>

 

5.10   radiobuttons 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

delimiter

定义两个 input 元素之间的分隔符,默认没有分隔符

element

给每一个被渲染的 input 元素都定义一个 HTML 元素,默认为“span”

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义

items

用于生成 input 元素的对象的 Collection、Map 或者 Array

itemLabel

item 属性中定义的 Collection、Map 或者 Array 中的对象属性,为每个 input 元素提供标签

itemValue

item 属性中定义的 Collection、Map 或者 Array 中的对象属性,为每个 input 元素提供值

path

要绑定的属性路径

 

5.1.10 select 标签

select 标签渲染一个HTML select 元素。被渲染元素的选项可能来自赋予其 items 属性的一个 Collection、Map、Array,或者来自一个嵌套的 option 或者 options 标签。select 标签的属性见表 5.11。表 5.11 中的所有属性都是可选的,其中不包含 HTML 属性。

items 属性特别有用,因为它可以绑定到对象的 Collection、Map、Array,为 select 元素生成选项。

例如,下面的 select 标签绑定到表单支持对象的 category 属性的 id 属性。它的选项来自

model 属性 categories。每个选项的值均来自 categories collection/map/array id 属性,它的标签来自 name 属性。

<form:select id="category" path="category.id"


 

items="${categories}" itemLabel="name" itemValue="id"/>

5.11   select 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义

items

用于生成 input 元素的对象的 Collection、Map 或者 Array

itemLabel

item 属性中定义的 Collection、Map 或者 Array 中的对象属性,为每个 input 元素提供标签

itemValue

item 属性中定义的 Collection、Map 或者 Array 中的对象属性,为每个 input 元素提供值

path

要绑定的属性路径

 

5.1.11 option 标签

option 标签渲染 select 元素中使用的一个HTML option 元素,其属性见表 5.12。表 5.12

中的所有属性都是可选的,其中不包含HTML 属性。

例如,下面是一个 option 标签的范例。

5.12   option 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义

 

<form:select id="category" path="category.id" items="${categories}" itemLabel="name" itemValue="id">

<option value="0">-- Please select --</option>

</form:select>

这个代码片断是渲染一个 select 元素,其选项来自 model 属性 categories,以及 option

标签。


 

5.1.12 options 标签

options 标签生成一个 HTML option 元素列表,其属性见表 5.13,其中不包含 HTML

属性。

tags-demo 应用程序展示了一个 options 标签的范例。

5.13   options 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义

items

用于生成 input 元素的对象的 Collection、Map 或者 Array

itemLabel

item 属性中定义的 Collection、Map 或者 Array 中的对象属性,为每个 input 元素提供标签

itemValue

item 属性中定义的 Collection、Map 或者 Array 中的对象属性,为每个 input 元素提供值

 

5.1.13 errors 标签

errors 标签渲染一个或者多个 HTML 的span 元素,每个 span 元素中都包含一个字段错误。这个标签可以用于显示一个特定的字段错误,或者所有字段错误。

errors 标签的属性见表 5.14。表 5.14 中的所有属性都是可选的,其中不包含可能在 HTML

span 元素中出现的HTML 属性。

例如,下面这个 errors 标签显示了所有字段错误。

<form:errors path="*"/>

下面的 errors 标签显示了一个与表单支持对象的 author 属性相关的字段错误。

<form:errors path="author"/>

 

5.14   errors 标签的属性

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式


 

续表

属性

描述

Delimiter

分隔多个错误消息的分隔符

element

定义一个包含错误消息的 HTML 元素

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义

path

要绑定的错误对象路径

5.2 数据绑定范例

在表单标签库中利用标签进行数据绑定的例子,参见 tags-demo 应用程序。这个范例围绕

domain  Book 进行。这个类中有几个属性,包括一个类型为 Category  category 属性。

Category id name 两个属性。

这个应用程序允许列出书目、添加新书,以及编辑书目。

5.2.1 目录结构

5.1 中展示了 tags-demo 的目录结构。

5.1   tags-demo 的目录结构


5.1.1 Domain 类

Book 类和 Category 类是这个应用程序中的 domain 类,它们分别如清单 5.1 和清单 5.2 所示。

 

清单 5.1 Book 类

package domain;

import java.math.BigDecimal; import java.io.Serializable;

 

public class Book implements Serializable {

 

private static final long serialVersionUID = 1L private long id;

private String isbn; private String title; private Category category; private String author;

 

public Book() {

}

 

public Book(long id, String isbn, String title,

Category category, String author, BigDecimal price) { this.id = id;

this.isbn = isbn; this.title = title; this.category = category; this.author = author; this.price = price;

}

 

// get and set methods not shown

 

}

清单 5.2 Category 类

package domain;

 

import java.io.Serializable;

 

public class Category implements Serializable { private static final long serialVersionUID = 1L; private int id;

private String name;

 

public Category() {

}

 

public Category(int id, String name) {


 

this.id = id; this.name = name;

}

 

// get and set methods not shown

}

 

5.1.2 Controller 类

下面的范例为 Book 提供了一个控制器:BookController 类。它允许用户创建新书目、更新书的详细信息,并在系统中列出所有书目。清单 5.3 中展示了 BookController 类。

清单 5.3 BookController 类package controller; import java.util.List;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import domain.Book;

import domain.Category; import service.BookService;

 

@Controller

public class BookController {

 

@Autowired

private BookService bookService;

 

private static final Log logger = LogFactory.getLog(BookController.class);

 

@RequestMapping(value = "/input-book ") public String inputBook(Model model) {

List<Category> categories = bookService.getAllCategories(); model.addAttribute("categories", categories); model.addAttribute("book", new Book());

return "BookAddForm";

}

@RequestMapping(value = "/edit-book/{id}")


 

public String editBook(Model model, @PathVariable long id) { List<Category> categories = bookService.getAllCategories(); model.addAttribute("categories", categories);

Book book = bookService.get(id); model.addAttribute("book", book); return "BookEditForm";

}

@RequestMapping(value = "/save-book")

public String saveBook(@ModelAttribute Book book) { Category category =

bookService.getCategory(book.getCategory().getId()); book.setCategory(category);

bookService.save(book); return "redirect:/list-book";

}

 

@RequestMapping(value = "/update-book")

public String updateBook(@ModelAttribute Book book) { Category category =

bookService.getCategory(book.getCategory().getId()); book.setCategory(category);

bookService.update(book); return "redirect:/list-book";

}

 

@RequestMapping(value = "/list-book") public String listBooks(Model model) {

logger.info("listBooks");

List<Book> books = bookService.getAllBooks(); model.addAttribute("books", books);

return "BookList";

}

}

 

BookController 依赖 BookService 进行一些后台处理。@Autowired 注解用于给 Book

Controller 注入一个 BookService 实现。

@Autowired

private BookService bookService;

 

5.1.3 Service 类

清单 5.4 和清单 5.5 分别展示了 BookService 接口和 BookServiceImpl 类。顾名思义,

BookServiceImpl 就是实现BookService。


 

清单 5.4 BookService 接口

package service; import java.util.List; import domain.Book;

import domain.Category;

 

public interface BookService { List<Category> getAllCategories(); Category getCategory(int id); List<Book> getAllBooks();

Book save(Book book); Book update(Book book); Book get(long id);

long getNextId();

}

 

清单 5.5 BookServiceImpl 类

package service;

import java.util.ArrayList; import java.util.List;

import org.springframework.stereotype.Service; import domain.Book;

import domain.Category;

 

@Service

public class BookServiceImpl implements BookService {

 

/*

* this implementation is not thread-safe

*/

private List<Category> categories; private List<Book> books;

 

public BookServiceImpl() {

categories = new ArrayList<Category>();

Category category1 = new Category(1, "Computer"); Category category2 = new Category(2, "Travel"); Category category3 = new Category(3, "Health"); categories.add(category1); categories.add(category2);


 

categories.add(category3);

 

books = new ArrayList<Book>(); books.add(new Book(1L, "9781771970273",

"Servlet & JSP: A Tutorial (2nd Edition)",

category1, "Budi Kurniawan", new BigDecimal("54.99")); books.add(new Book(2L, "9781771970297",

"C#: A Beginner's Tutorial (2nd Edition) ", category1, "Jayden Ky", new BigDecimal("39.99")));

}

 

@Override

public List<Category> getAllCategories() { return categories;

}

 

@Override

public Category getCategory(int id) {

for (Category category : categories) { if (id == category.getId()) {

return category;

}

}

return null;

}

 

@Override

public List<Book> getAllBooks() { return books;

}

 

@Override

public Book save(Book book) { book.setId(getNextId()); books.add(book);

return book;

}

 

@Override

public Book get(long id) { for (Book book : books) {

if (id == book.getId()) { return book;

}

}

return null;


 

}

 

@Override

public Book update(Book book) { int bookCount = books.size();

for (int i = 0; i < bookCount; i++) { Book savedBook = books.get(i);

if (savedBook.getId() == book.getId()) { books.set(i, book);

return book;

}

}

return book;

}

 

@Override

public long getNextId() {

// needs to be locked long id = 0L;

for (Book book : books) {

long bookId = book.getId(); if (bookId > id) {

id = bookId;

}

}

return id + 1;

}

}

 

BookServiceImpl 类中包含了一个 Book 对象的 List 和一个 Category 对象的 List。这两个

List 都是在实例化类时生成的。这个类中还包含了获取所有书目、获取单个书目,以及添加和更新书目的方法。


重要内容:

 

属性

描述

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

delimiter

定义两个 input 元素之间的分隔符,默认没有分隔符

element

给每个被渲染的 input 元素都定义一个 HTML 元素,默认为“span”

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义

items

用于生成 input 元素的对象的 Collection、Map 或者 Array

itemLabel

item 属性中定义的 Collection、Map 或者 Array 中的对象属性,为每个 input 元素提供标签

itemValue

item 属性中定义的 Collection、Map 或者 Array 中的对象属性,为每个 input 元素提供值

path

要绑定的属性路径

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义

label

要作为标签用于被渲染复选框的值

path

要绑定的属性路径

 

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义

label

要作为标签用于被渲染复选框的值

path

要绑定的属性路径

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的值进行 HTML 转义

path

要绑定的属性路径

cssClass

定义要应用到被渲染 input 元素的 CSS 类

cssStyle

定义要应用到被渲染 input 元素的 CSS 样式

cssErrorClass

定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass

属性值

htmlEscape

接受 true 或者 false,表示是否应该对被渲染的值进行 HTML 转义

path

要绑定的属性路径

showPassword

表示应该显示或遮盖密码,默认值为 false

三:学习参考
Spring MVC 学习指南 第二版



阅读更多

没有更多推荐了,返回首页