您的位置:首页 > Web前端 > JavaScript

JSP中form标签的使用

2013-10-19 05:40 417 查看


http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ch13s09.html


13.9. 使用Spring的表单标签库 - Spring Framework reference 2.0.5 参考手册中文版


13.9. 使用Spring的表单标签库

从2.0开始,Spring提供全面的,支持数据绑定的JSP标签来处理表单元素(如果你使用JSP和Spring的Web MVC框架的话)。 每个标签所支持的属性跟其对应的HTML标签相同,这样这些标签看起来就不陌生,而且很容易用。 由这些标签库生成的HTML页面符合HTML 4.01/XHTML 1.0标准。
与其它的标签库不同,Spring的表单标签库和Spring Web MVC框架是集成在一起的,因此它们可以直接使用命令对象(command object) 和其他由控制器处理的数据对象。 就像下面这些例子展示的一样,使用这些标签后,JSP 开发变得更加容易,代码也更加容易阅读和维护。
让我们通过例子来研究一下这些标签是怎样使用的。 在下面的例子中,当某个标签的含义不够明显时,我们把它所生成的HTML代码也一起列了出来。

13.9.1. 配置标签库

Spring的表单标签库存在
spring.jar
中。这个库的描述文件(descriptor)是
spring-form.tld

如果你想使用这些标签, 请在JSP代码的起始部分加入下面这行声明。
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

在上面的声明中,
form
是这个标签库所提供标签的前缀名。

13.9.2.
form
标签

这个标签会生成HTML form标签,同时为form内部所包含的标签提供一个绑定路径(binding path)。 它把命令对象(command object)存在
PageContext
中,这样form内部的标签 就可以使用这个对象了。标签库中的其他标签都声明在form标签的内部。
让我们假设有一个叫
User
的领域对象,它是一个JavaBean,有着诸如
firstName
lastName
这样的属性。我们将把它当作 一个表单支持对象(form backing object),它对应的表单控制器用
form.jsp
页面来显示表单。下面是
form.jsp
的内容片段。
<form:form>
<table>
<tr>
<td>First Name:</td>
<td><form:input path="firstName" /></td>
</tr>
<tr>
<td>Last Name:</td>
<td><form:input path="lastName" /></td>
</tr>
<tr>
<td colspan="3">
<input type="submit" value="Save Changes" />
</td>
</tr>
</table>
</form:form>

上面例子中的
firstName
lastName
由控制器从 存在
PageContext
中的命令对象中得到。 下面几个更复杂的例子展示了form内部标签的用法。
这是由form标签所生成的HTML代码,和标准的HTML form没有什么区别:
<form method="POST">
<table>
<tr>
<td>First Name:</td>
<td><input name="firstName" type="text" value="Harry"/></td>
<td></td>
</tr>
<tr>
<td>Last Name:</td>
<td><input name="lastName" type="text" value="Potter"/></td>
<td></td>
</tr>
<tr>
<td colspan="3">
<input type="submit" value="Save Changes" />
</td>
</tr>
</table>
</form>

上面这个例子有一个隐藏的前提:表单支持对象(form backing object)的变量名是
command
。 如果你将这个对象用其他名称加以定义(这可算是一种最佳实践),你就可以将这个变量名绑定到表单上,如下例所示。
<form:form commandName="user">
<table>
<tr>
<td>First Name:</td>
<td><form:input path="firstName" /></td>
</tr>
<tr>
<td>Last Name:</td>
<td><form:input path="lastName" /></td>
</tr>
<tr>
<td colspan="3">
<input type="submit" value="Save Changes" />
</td>
</tr>
</table>
</form:form>


13.9.3.
input
标签

这个标签生成text类型的HTML input标签。使用这个标签时,path属性的值将对应 HTML input标签中name属性的值。第 13.9.2 节
form
标签”这一节中 有关于这个标签的例子。

13.9.4.
checkbox
标签

这个标签生成checkbox类型的HTML input标签。
假设模型中的
User
支持每个用户设置自己的喜好,比如新闻订阅或者一组业余爱好,等等。下面是
Preferences
这个类的定义:

public class Preferences {

private boolean receiveNewsletter;

private String[] interests;

private String favouriteWord;

public boolean isReceiveNewsletter() {
return receiveNewsletter;
}

public void setReceiveNewsletter(boolean receiveNewsletter) {
this.receiveNewsletter = receiveNewsletter;
}

public String[] getInterests() {
return interests;
}

public void setInterests(String[] interests) {
this.interests = interests;
}

public String getFavouriteWord() {
return favouriteWord;
}

public void setFavouriteWord(String favouriteWord) {
this.favouriteWord = favouriteWord;
}
}

现在,
form.jsp
可以这么写:
<form:form>
<table>
<tr>
<td>Subscribe to newsletter?:</td>
<%-- Approach 1: Property is of type [code]java.lang.Boolean
--%>
<td><form:checkbox path="preferences.receiveNewsletter"/></td>
<td></td>
</tr>

<tr>
<td>Interests:</td>
<td>
<%-- Approach 2: Property is of an array or of type
java.util.Collection
--%>
Quidditch: <form:checkbox path="preferences.interests" value="Quidditch"/>
Herbology: <form:checkbox path="preferences.interests" value="Herbology"/>
Defence Against the Dark Arts: <form:checkbox path="preferences.interests"
value="Defence Against the Dark Arts"/>
</td>
<td></td>
</tr>
<tr>
<td>Favourite Word:</td>
<td>
<%-- Approach 3: Property is of type
java.lang.Object
--%>
Magic: <form:checkbox path="preferences.favouriteWord" value="Magic"/>
</td>
<td></td>
</tr>
</table>
</form:form>[/code]
checkbox
有三种使用方法,应该可以满足我们全部可能的需求。

第一种用法:若绑定值是java.lang.Boolean类型,则值为
true
时,
input(checkbox)
标为checked(选中)。其
value
(值)属性对应于
setValue(Object)
值属性的解析值。

第二种用法:若绑定值是array(数组)类型或
java.util.Collection
,则配置的
setValue(Object)
值出现在绑定的Collection中时,
input(checkbox)
标为checked(选中)。

第三种用法:若绑定值为其他类型,则当配置的
setValue(Object)
等于其绑定值时,
input(checkbox)
标为checked(选中)。

不管使用那一种方法,生成的HTML代码都是一样的。下文是带有checkbox的部分HTML片段:
<tr>
<td>Interests:</td>
<td>
Quidditch: <input name="preferences.interests" type="checkbox" value="Quidditch"/>
<input type="hidden" value="1" name="_preferences.interests"/>
Herbology: <input name="preferences.interests" type="checkbox" value="Herbology"/>
<input type="hidden" value="1" name="_preferences.interests"/>
Defence Against the Dark Arts: <input name="preferences.interests" type="checkbox"
value="Defence Against the Dark Arts"/>
<input type="hidden" value="1" name="_preferences.interests"/>
</td>
<td></td>
</tr>

也许你注意到了每个checkbox元素后面都跟着一个隐藏区域(hidden field)。当一个HTML页面中的checkbox没有被选中时,这个checkbox的值不会在表单提交时作为HTTP请求参数发送到服务器端。这给Spring的表单数据绑定造成了麻烦。解决方法就是在每个checkbox后面加一个隐藏区域,并且每个隐藏区域的名字是在其对应的checkbox名字前加下划线("_")。这是Spring已有的惯例。这样一来,你相当于告诉Spring“这个表单中存在这样一个checkbox,我希望表单支持对象中相对应的属性和这个checkbox的状态保持一致
”。

13.9.5.
radiobutton
标签

这个标签生成类型为radio的HTML input 标签。
这个标签的典型用法是一次声明多个标签实例,所有的标签都有相同的path属性,但是他们的value属性不同。
<tr>
<td>Sex:</td>
<td>Male: <form:radiobutton path="sex" value="M"/> <br/>
Female: <form:radiobutton path="sex" value="F"/> </td>
<td></td>
</tr>


13.9.6.
password
标签

这个标签生成类型为password的HTML input标签。input标签的值和表单支持对象相应属性的值保持一致。
<tr>
<td>Password:</td>
<td>
<form:password path="password" />
</td>
</tr>


13.9.7.
select
标签

这个标签生成HTML select标签。在生成的HTML代码中,被选中的选项和表单支持对象相应属性的值保持一致。这个标签也支持嵌套的
option
options
标签。
在下面的例子中,我们假设
User
可以选择自己的专业技能(多项选择):
<tr>
<td>Skills:</td>
<td><form:select path="skills" items="${skills}"/></td>
<td></td>
</tr>

如果某个
User
的专业是草药学(Herbology),生成的HTML代码就会像下面这样:
<tr>
<td>Skills:</td>
<td><select name="skills" multiple="true">
<option value="Potions">Potions</option>
<option value="Herbology" selected="true">Herbology</option>
<option value="Quidditch">Quidditch</option></select></td>
<td></td>
</tr>


13.9.8.
option
标签

这个标签生成HTML option标签。在生成的HTML代码中,被选中的选项和表单支持对象相应属性的值保持一致。
<tr>
<td>House:</td>
<td>
<form:select path="house">
<form:option value="Gryffindor"/>
<form:option value="Hufflepuff"/>
<form:option value="Ravenclaw"/>
<form:option value="Slytherin"/>
</form:select>
</td>
</tr>

如果某个
User
的宿舍是Gryffindor,生成的HTML代码就会像下面这样:
<tr>
<td>House:</td>
<td>
<select name="house">
<option value="Gryffindor" selected="true">Gryffindor</option>
<option value="Hufflepuff">Hufflepuff</option>
<option value="Ravenclaw">Ravenclaw</option>
<option value="Slytherin">Slytherin</option>
</select>
</td>
</tr>

译者注:这一节中的几个例子都跟《哈里波特》这本小说的内容有关。

13.9.9.
options
标签

这个标签生成一系列的HTML option标签。在生成的HTML代码中,被选中的选项和表单支持对象相应属性的值保持一致。
<tr>
<td>Country:</td>
<td>
<form:select path="country">
<form:option value="-" label="--Please Select"/>
<form:options items="${countryList}" itemValue="code" itemLabel="name"/>
</form:select>
</td>
<td></td>
</tr>

如果某个
User
住在英国,生成的HTML代码就会像下面这样:
<tr>
<td>Country:</td>
<tr>
<td>Country:</td>
<td>
<select name="country">
<option value="-">--Please Select</option>
<option value="AT">Austria</option>
<option value="UK" selected="true">United Kingdom</option>
<option value="US">United States</option>
</select>
</td>
<td></td>
</tr>
<td></td>
</tr>

上面的这个例子同时使用了
option
标签和
options
标签。这两个标签生成的HTML代码是相同的,但是第一个
option
标签允许你在JSP中明确声明这个标签的值只供显示使用,并不绑定到表单支持对象的属性上。

13.9.10.
textarea
标签

这个标签生成HTML textarea标签。
<tr>
<td>Notes:</td>
<td><form:textarea path="notes" rows="3" cols="20" /></td>
<td><form:errors path="notes" /></td>
</tr>


13.9.11.
hidden
标签

这个标签生成类型为hidden的HTML input标签。在生成的HTML代码中,input标签的值和表单支持对象相应属性的值保持一致。如果你需要声明一个类型为hidden的input标签,但是表单支持对象中没有对应的属性,你只能使用HTML的标签。
<form:hidden path="house" />

上面的例子表示我们需要将house的值以隐含参数的形式提交,生成的HTML代码如下:
<input name="house" type="hidden" value="Gryffindor"/>


13.9.12.
errors
标签

这个标签生成类型为'span'的HTML标签,用来显示表单验证时出现的错误信息。通过这个标签,你可以访问控制器(controller)和与控制器关联的验证器(validator)产生的错误信息。
假设我们需要在表单提交时显示所有跟
firstName
lastName
有关的错误信息。我们为
User
这个类编写了名为
UserValidator
的验证器。
public class UserValidator implements Validator {

public boolean supports(Class candidate) {
return User.class.isAssignableFrom(candidate);
}

public void validate(Object obj, Errors errors) {
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstName", "required", "Field is required.");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "lastName", "required", "Field is required.");
}
}

现在,
form.jsp
是下面这个样子:
<form:form>
<table>
<tr>
<td>First Name:</td>
<td><form:input path="firstName" /></td>
<%-- Show errors for firstName field --%>
<td><form:errors path="firstName" /></td>
</tr>

<tr>
<td>Last Name:</td>
<td><form:input path="lastName" /></td>
<%-- Show errors for lastName field --%>
<td><form:errors path="lastName"  /></td>
</tr>
<tr>
<td colspan="3">
<input type="submit" value="Save Changes" />
</td>
</tr>
</table>
</form:form>

如果我们提交表单时没有填
firstHame
lastName
这两个栏目,服务器返回的HTML页面就会像下面这样:
<form method="POST">
<table>
<tr>
<td>First Name:</td>
<td><input name="firstName" type="text" value=""/></td>
<%-- Associated errors to firstName field displayed --%>
<td><span name="firstName.errors">Field is required.</span></td>
</tr>

<tr>
<td>Last Name:</td>
<td><input name="lastName" type="text" value=""/></td>
<%-- Associated errors to lastName field displayed --%>
<td><span name="lastName.errors">Field is required.</span></td>
</tr>
<tr>
<td colspan="3">
<input type="submit" value="Save Changes" />
</td>
</tr>
</table>
</form>

如果我们想显示一个页面上所有的错误信息,应该怎么办呢?
errors
标签支持基本的通配符功能。

path="*"
- displays all errors
path="*"
: 显示所有的错误信息

path="lastName*"
- displays all errors associated with the
lastName
field
path="lastName*"
: 显示所有和
lastName
栏目有关的错误信息。

下面这个例子在页面的上方显示所有的错误信息,同时在表单每个栏目的旁边显示和该栏目有关的错误信息。
<form:form>
<form:errors path="*" cssClass="errorBox" />
<table>
<tr>
<td>First Name:</td>
<td><form:input path="firstName" /></td>
<td><form:errors path="firstName" /></td>
</tr>
<tr>
<td>Last Name:</td>
<td><form:input path="lastName" /></td>
<td><form:errors path="lastName"  /></td>
</tr>
<tr>
<td colspan="3">
<input type="submit" value="Save Changes" />
</td>
</tr>
</table>
</form:form>

生成的HTML代码如下所示:
<form method="POST">
<span name="*.errors" class="errorBox">Field is required.<br/>Field is required.</span>
<table>
<tr>
<td>First Name:</td>
<td><input name="firstName" type="text" value=""/></td>
<td><span name="firstName.errors">Field is required.</span></td>
</tr>

<tr>
<td>Last Name:</td>
<td><input name="lastName" type="text" value=""/></td>
<td><span name="lastName.errors">Field is required.</span></td>
</tr>
<tr>
<td colspan="3">
<input type="submit" value="Save Changes" />
</td>
</tr>
</form>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: