数据绑定和表单标签库-4.15-王溢淇

数据绑定概览

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

@RequestMapping(value="save-product")

public StringsaveProduct(ProductForm productForm, Model model) {

logger.info("saveProductcalled");

// no need tocreate and instantiate a ProductForm

// createProduct

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

product.setPrice(newBigDecimal(productForm.getPrice()));

} catch (NumberFormatException e) {

}

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

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

saveProduct方法部分。


 

@RequestMapping(value="save-product")

public StringsaveProduct(Product product, Model model)

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

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

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

表单标签库

表单标签库中包含了可以用在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 元素中渲染字段错误


表单标签

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

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

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

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

...

</form:form>

 

 

属性

描述

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 StringinputBook(Model model) {

...

model.addAttribute("book", newBook());

return"BookAddForm";

}

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

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


 

此外,一般来说,仍然需要使用action 和method 属性。这两个属性都是HTML 属性

数据绑定范例

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

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

Category有 id 和name 两个属性。

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


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{

 

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

private String isbn; private String title; private Categorycategory; private String author;

 

public Book(){

}

 

publicBook(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 setmethods not shown

 

}

清单 5.2   Category 类

package domain;

 

import java.io.Serializable;

 

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

private String name;

 

publicCategory() {

}

 

publicCategory(int id, String name) {


 

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

}

 

// get and setmethods not shown

}

 


阅读更多
想对作者说点什么? 我来说一句

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

关闭
关闭
关闭