Domain类
Controller类
Service类
表单标签库中包含了可以用在JSP 页面中渲染 HTML 元素的标签。为了使用这些标签, 必须在 JSP 页面的开头处声明这个 taglib 指令。
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
在接下来的小节中,将逐一介绍这些标签。5.3 节展示了一个范例应用程序,展示了数据绑定结合表单标签库的使用方法。
表 5.1 表单标签库中的标签
标签 |
描述 |
form |
渲染表单元素 |
input |
渲染元素 |
password |
渲染元素 |
hidden |
渲染元素 |
textarea |
渲染 textarea 元素 |
checkbox |
渲染一个元素 |
checkboxes |
渲染多个元素 |
radiobutton |
渲染一个元素 |
radiobuttons |
渲染多个元素 |
select |
渲染一个选择元素 |
option |
渲染一个可选元素 |
options |
渲染一个可选元素列表 |
errors |
在 span 元素中渲染字段错误 |
表 5.2 中的所有标签都是可选的。这个表中没有包含 HTML 属性,如 method 和 action。
commandName 属性或许是其中最重要的属性,因为它定义了模型属性的名称,其中包含了一个表单支持对象(form backing object),其属性将用于填充所生成的表单。如果该属性存在,则必须在返回包含该表单的视图的请求处理方法中添加相应的模型属性。例如,在本章配套的 tags-demo 应用程序中,下列表单标签是在 BookAddForm.jsp 中定义的。
...
表 5.2 表单标签的属性
属性 |
描述 |
acceptCharset |
定义服务器接受的字符编码列表 |
commandName |
暴露表单对象之模型属性的名称,默认为 command |
cssClass |
定义要应用到被渲染 form 元素的 CSS 类 |
cssStyle |
定义要应用到被渲染 form 元素的 CSS 样式 |
htmlEscape |
接受 true 或者 false,表示被渲染的值是否应该进行 HTML 转义 |
modelAttribute |
暴露表单支持对象的模型属性名称,默认为 command |
@RequestMapping(value = "/input-book") public String inputBook(Model model) {
...
model.addAttribute("book", new Book());
return "BookAddForm";
}
BookAddForm.jsp 页面就会抛出异常,因为表单标签无法找到在其 commandName 属性中指定的 form backing object。
此外,一般来说,仍然需要使用 action 和 method 属性。这两个属性都是 HTML 属性, 因此不在表 5.2 之中。
input 标签渲染元素。这个标签最重要的属性是 path,它将这个输入字段绑定到表单支持对象的一个属性。例如,若随附
标签的 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 |
要绑定的属性路径 |
category 属性的 id 属性。
标签相似,只不过它有一个 showPassword 属性。
表 5.4 password 标签的属性
属性 |
描述 |
cssClass |
定义要应用到被渲染 input 元素的 CSS 类 |
cssStyle |
定义要应用到被渲染 input 元素的 CSS 样式 |
cssErrorClass |
定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass 属性值 |
htmlEscape |
接受 true 或者 false,表示是否应该对被渲染的值进行 HTML 转义 |
path |
要绑定的属性路径 |
showPassword |
表示应该显示或遮盖密码,默认值为 false |
表 5.5 hidden 标签的属性
属性 |
描述 |
htmlEscape |
接受 true 或者 false,表示是否应该对被渲染的值进行 HTML 转义 |
path |
要绑定的属性路径 |
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 |
要绑定的属性路径 |
中的所有属性都是可选的,其中不包含HTML 属性。
表 5.7 checkbox 标签的属性
属性 |
描述 |
cssClass |
定义要应用到被渲染 input 元素的 CSS 类 |
cssStyle |
定义要应用到被渲染 input 元素的 CSS 样式 |
cssErrorClass |
定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass 属性值 |
htmlEscape |
接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义 |
label |
要作为标签用于被渲染复选框的值 |
path |
要绑定的属性路径 |
中的所有属性都是可选的,其中不包含HTML 属性。
例如,下列的 radiobutton 标签绑定到 newsletter 属性。
Computing Now
Modern Health
表 5.8 radiobutton 标签的属性
属性 |
描述 |
cssClass |
定义要应用到被渲染 input 元素的 CSS 类 |
cssStyle |
定义要应用到被渲染 input 元素的 CSS 样式 |
cssErrorClass |
定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass 属性值 |
htmlEscape |
接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义 |
label |
要作为标签用于被渲染复选框的值 |
path |
要绑定的属性路径 |
例如,下面的 checkboxes 标签将 model 属性 categoryList 的内容渲染为复选框。checkboxes 标签允许进行多个选择。
表 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 |
要绑定的属性路径 |
例如,下面的 radiobuttons 标签将 model 属性 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 |
要绑定的属性路径 |
items 属性特别有用,因为它可以绑定到对象的 Collection、Map、Array,为 select 元素生成选项。
例如,下面的 select 标签绑定到表单支持对象的 category 属性的 id 属性。它的选项来自
model 属性 categories。每个选项的值均来自 categories collection/map/array 的 id 属性,它的标签来自 name 属性。
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 |
要绑定的属性路径 |
中的所有属性都是可选的,其中不包含HTML 属性。
例如,下面是一个 option 标签的范例。
表 5.12 option 标签的属性
属性 |
描述 |
cssClass |
定义要应用到被渲染 input 元素的 CSS 类 |
cssStyle |
定义要应用到被渲染 input 元素的 CSS 样式 |
cssErrorClass |
定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass 属性值 |
htmlEscape |
接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义 |
标签。
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 元素提供值 |
errors 标签的属性见表 5.14。表 5.14 中的所有属性都是可选的,其中不包含可能在 HTML
的 span 元素中出现的HTML 属性。
例如,下面这个 errors 标签显示了所有字段错误。
表 5.14 errors 标签的属性
属性 |
描述 |
cssClass |
定义要应用到被渲染 input 元素的 CSS 类 |
cssStyle |
定义要应用到被渲染 input 元素的 CSS 样式 |
续表
属性 |
描述 |
Delimiter |
分隔多个错误消息的分隔符 |
element |
定义一个包含错误消息的 HTML 元素 |
htmlEscape |
接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义 |
path |
要绑定的错误对象路径 |
domain 类 Book 进行。这个类中有几个属性,包括一个类型为 Category 的 category 属性。
Category 有 id 和 name 两个属性。
这个应用程序允许列出书目、添加新书,以及编辑书目。
图 5.1 中展示了 tags-demo 的目录结构。
图 5.1 tags-demo 的目录结构
一:知识笔记
基于 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) {
}
BigDecimal 来填充 Product 的 price 属性。有了数据绑定,就可以用下面的代码取代上面的
saveProduct 方法部分。
@RequestMapping(value="save-product")
public String saveProduct(Product product, Model model)
写 HTML 代码时,必须记着用户之前输入的值,重新填充输入字段。有了 Spring 的数据绑定
和表单标签库后,它们就会替你完成这些工作。
表单标签库中包含了可以用在JSP 页面中渲染 HTML 元素的标签。为了使用这些标签, 必须在 JSP 页面的开头处声明这个 taglib 指令。
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
在接下来的小节中,将逐一介绍这些标签。5.3 节展示了一个范例应用程序,展示了数据绑定结合表单标签库的使用方法。
表 5.1 表单标签库中的标签
标签 |
描述 |
form |
渲染表单元素 |
input |
渲染元素 |
password |
渲染元素 |
hidden |
渲染元素 |
textarea |
渲染 textarea 元素 |
checkbox |
渲染一个元素 |
checkboxes |
渲染多个元素 |
radiobutton |
渲染一个元素 |
radiobuttons |
渲染多个元素 |
select |
渲染一个选择元素 |
option |
渲染一个可选元素 |
options |
渲染一个可选元素列表 |
errors |
在 span 元素中渲染字段错误 |
表 5.2 中的所有标签都是可选的。这个表中没有包含 HTML 属性,如 method 和 action。
commandName 属性或许是其中最重要的属性,因为它定义了模型属性的名称,其中包含了一个表单支持对象(form backing object),其属性将用于填充所生成的表单。如果该属性存在,则必须在返回包含该表单的视图的请求处理方法中添加相应的模型属性。例如,在本章配套的 tags-demo 应用程序中,下列表单标签是在 BookAddForm.jsp 中定义的。
...
表 5.2 表单标签的属性
属性 |
描述 |
acceptCharset |
定义服务器接受的字符编码列表 |
commandName |
暴露表单对象之模型属性的名称,默认为 command |
cssClass |
定义要应用到被渲染 form 元素的 CSS 类 |
cssStyle |
定义要应用到被渲染 form 元素的 CSS 样式 |
htmlEscape |
接受 true 或者 false,表示被渲染的值是否应该进行 HTML 转义 |
modelAttribute |
暴露表单支持对象的模型属性名称,默认为 command |
@RequestMapping(value = "/input-book") public String inputBook(Model model) {
...
model.addAttribute("book", new Book());
return "BookAddForm";
}
BookAddForm.jsp 页面就会抛出异常,因为表单标签无法找到在其 commandName 属性中指定的 form backing object。
此外,一般来说,仍然需要使用 action 和 method 属性。这两个属性都是 HTML 属性, 因此不在表 5.2 之中。
input 标签渲染元素。这个标签最重要的属性是 path,它将这个输入字段绑定到表单支持对象的一个属性。例如,若随附
标签的 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 |
要绑定的属性路径 |
category 属性的 id 属性。
标签相似,只不过它有一个 showPassword 属性。
表 5.4 password 标签的属性
属性 |
描述 |
cssClass |
定义要应用到被渲染 input 元素的 CSS 类 |
cssStyle |
定义要应用到被渲染 input 元素的 CSS 样式 |
cssErrorClass |
定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass 属性值 |
htmlEscape |
接受 true 或者 false,表示是否应该对被渲染的值进行 HTML 转义 |
path |
要绑定的属性路径 |
showPassword |
表示应该显示或遮盖密码,默认值为 false |
表 5.5 hidden 标签的属性
属性 |
描述 |
htmlEscape |
接受 true 或者 false,表示是否应该对被渲染的值进行 HTML 转义 |
path |
要绑定的属性路径 |
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 |
要绑定的属性路径 |
中的所有属性都是可选的,其中不包含HTML 属性。
表 5.7 checkbox 标签的属性
属性 |
描述 |
cssClass |
定义要应用到被渲染 input 元素的 CSS 类 |
cssStyle |
定义要应用到被渲染 input 元素的 CSS 样式 |
cssErrorClass |
定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass 属性值 |
htmlEscape |
接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义 |
label |
要作为标签用于被渲染复选框的值 |
path |
要绑定的属性路径 |
中的所有属性都是可选的,其中不包含HTML 属性。
例如,下列的 radiobutton 标签绑定到 newsletter 属性。
Computing Now
Modern Health
表 5.8 radiobutton 标签的属性
属性 |
描述 |
cssClass |
定义要应用到被渲染 input 元素的 CSS 类 |
cssStyle |
定义要应用到被渲染 input 元素的 CSS 样式 |
cssErrorClass |
定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass 属性值 |
htmlEscape |
接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义 |
label |
要作为标签用于被渲染复选框的值 |
path |
要绑定的属性路径 |
例如,下面的 checkboxes 标签将 model 属性 categoryList 的内容渲染为复选框。checkboxes 标签允许进行多个选择。
表 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 |
要绑定的属性路径 |
例如,下面的 radiobuttons 标签将 model 属性 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 |
要绑定的属性路径 |
items 属性特别有用,因为它可以绑定到对象的 Collection、Map、Array,为 select 元素生成选项。
例如,下面的 select 标签绑定到表单支持对象的 category 属性的 id 属性。它的选项来自
model 属性 categories。每个选项的值均来自 categories collection/map/array 的 id 属性,它的标签来自 name 属性。
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 |
要绑定的属性路径 |
中的所有属性都是可选的,其中不包含HTML 属性。
例如,下面是一个 option 标签的范例。
表 5.12 option 标签的属性
属性 |
描述 |
cssClass |
定义要应用到被渲染 input 元素的 CSS 类 |
cssStyle |
定义要应用到被渲染 input 元素的 CSS 样式 |
cssErrorClass |
定义要应用到被渲染 input 元素的 CSS 类,如果 bound 属性中包含错误,则覆盖 cssClass 属性值 |
htmlEscape |
接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义 |
标签。
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 元素提供值 |
errors 标签的属性见表 5.14。表 5.14 中的所有属性都是可选的,其中不包含可能在 HTML
的 span 元素中出现的HTML 属性。
例如,下面这个 errors 标签显示了所有字段错误。
表 5.14 errors 标签的属性
属性 |
描述 |
cssClass |
定义要应用到被渲染 input 元素的 CSS 类 |
cssStyle |
定义要应用到被渲染 input 元素的 CSS 样式 |
续表
属性 |
描述 |
Delimiter |
分隔多个错误消息的分隔符 |
element |
定义一个包含错误消息的 HTML 元素 |
htmlEscape |
接受 true 或者 false,表示是否应该对被渲染的(多个)值进行 HTML 转义 |
path |
要绑定的错误对象路径 |
domain 类 Book 进行。这个类中有几个属性,包括一个类型为 Category 的 category 属性。
Category 有 id 和 name 两个属性。
这个应用程序允许列出书目、添加新书,以及编辑书目。
图 5.1 中展示了 tags-demo 的目录结构。
图 5.1 tags-demo 的目录结构
清单 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
}
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.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
return "BookAddForm";
}
@RequestMapping(value = "/edit-book/{id}")
public String editBook(Model model, @PathVariable long id) { List
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
return "BookList";
}
}
Controller 注入一个 BookService 实现。
@Autowired
private BookService bookService;
BookServiceImpl 就是实现BookService。
清单 5.4 BookService 接口
package service; import java.util.List; import domain.Book;
import domain.Category;
public interface BookService { List
Book save(Book book); Book update(Book book); Book get(long id);
long getNextId();
}
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
public BookServiceImpl() {
categories = new ArrayList
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
"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
}
@Override
public Category getCategory(int id) {
for (Category category : categories) { if (id == category.getId()) {
return category;
}
}
return null;
}
@Override
public List
}
@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;
}
}
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 |