`
zhaohaolin
  • 浏览: 1016188 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用Spring的表单标签库

    博客分类:
  • JAVA
 
阅读更多

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,有着诸如 firstNamelastName这样的属性。我们将把它当作 一个表单支持对象(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>

上面例子中的firstNamelastName由控制器从 存在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 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>

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代码中,被选中的选项和表单支持对象相应属性的值保持一致。这个标签也支持嵌套的optionoptions标签。

在下面的例子中,我们假设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)产生的错误信息。

假设我们需要在表单提交时显示所有跟firstNamelastName有关的错误信息。我们为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>

如果我们提交表单时没有填firstHamelastName这两个栏目,服务器返回的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>
分享到:
评论

相关推荐

    spring3标签库

    `spring3标签库`是Spring MVC框架中的强大工具,它通过`spring.tld`和`spring-form.tld`两个TLD文件,为开发者提供了丰富的自定义标签,用于处理视图层的各种任务,包括URL创建、国际化、数据绑定和表单渲染。...

    Spring MVC表单标签库

    本篇文章将深入探讨Spring MVC中的表单标签库,以及如何在实际项目中使用它们来创建动态、交互式的表单。 1. **表单标签库介绍** Spring MVC的表单标签库是JSP的一部分,它可以生成HTML表单元素,并且能够自动绑定...

    spring标签使用

    这些标签来自 Spring 的表单标签库,从 2.0 版本开始,如果使用 JSP 和 Spring Web MVC 的话。每个标签所支持的属性集合和与其对应的 HTML 标签相同,这就让这些标签看起来很熟悉,而且用起来很直观。 Spring 的...

    spring的标签库.pdf

    在Spring框架中,为了简化JSP页面上的表单处理,Spring提供了一套称为Spring表单标签库的组件。这些标签库自2.0版本起就已包含在`spring.jar`中,它们的主要目的是与Spring Web MVC框架紧密集成,以便更好地处理表单...

    Spring 标签使用指南

    要使用 Spring 的表单标签库,首先需要在项目的 classpath 中添加 `spring.jar` 文件,并确保 `spring-form.tld` 文件也被正确配置。通常情况下,这些文件会在 Spring 框架安装或部署时自动被包括进来。接下来,在 ...

    spring的标签库.docx

    Spring框架的表单标签库是其Web MVC模块的一部分,自2.0版本开始引入,旨在简化JSP页面中处理表单元素的过程。这些标签与HTML标签具有相似的属性,易于理解和使用,同时遵循HTML 4.01和XHTML 1.0标准。它们与Spring ...

    spring mvc标签使用指南

    在使用Spring的表单标签库之前,需要在JSP页面中引入Spring的Taglib。这通常在页面的`&lt;head&gt;`部分完成,通过添加以下行: ```jsp &lt;%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %&gt; ``` ...

    spring_标签使用

    Spring框架的表单标签库是Spring Web MVC的一部分,旨在简化基于JSP的Web应用程序中表单处理和数据绑定的过程。自Spring 2.0版本起,这套标签库提供了与HTML元素相似但支持数据绑定的标签,使得开发更加方便、代码更...

    jstl,struts2,spring标签库api

    在Java Web开发中,JSTL(JavaServer Pages Standard Tag Library)、Struts2和Spring都是极为重要的组件,它们各自提供了强大的功能,同时也通过标签库API增强了开发者的工作效率。这三个框架的标签库API使得代码...

    spring-from标签.zip

    本文将深入探讨Spring Form标签库的使用、功能以及它与JSTL标签库的关系。 首先,`spring-form.tld`是一个TLD(Tag Library Descriptor)文件,它是JavaServer Pages(JSP)标准中用来定义自定义标签的元数据。这个...

    spring标签.zip

    本压缩包"spring标签.zip"包含的文件"spring标签"可能是指Spring框架中的自定义标签库,如spring.tld,这个TLD文件(Tag Library Descriptor)是用来描述Spring标签库的元数据。 Spring框架的标签主要分为两大部分...

    SpringMVC入门很简单之表单标签

    1. **表单标签**:在SpringMVC中,我们通常使用JSP或Thymeleaf等模板引擎来处理前端视图。对于JSP,Spring提供了一组自定义的JSTL标签,如`&lt;form:form&gt;`、`&lt;form:input&gt;`、`&lt;form:errors&gt;`等,这些标签简化了与...

    SpringMVC表单标签简介

    #### 二、配置表单标签库 在使用SpringMVC表单标签之前,需要在JSP文件中声明使用的标签库。这通常通过在JSP文件的头部添加`&lt;%@ taglib %&gt;`指令来实现。例如: ```jsp &lt;%@ taglib uri="http://www.springframework...

    struts标签库使用大典

    下面将详细介绍Struts标签库的使用,并结合jakarta-struts-1.2.4版本进行解析。 1. **Struts标签库介绍** Struts标签库是Apache Struts框架的一部分,提供了多种用于构建动态Web应用的预定义JSP标签。这些标签与...

    java web 标签大全

    Java Web标签大全主要涵盖的是在开发Java Web应用时经常使用的各种标签库,这些标签库能够帮助开发者更加便捷地实现页面的动态渲染和控制流程。在这个主题中,我们将深入探讨JSTL(JavaServer Pages Standard Tag ...

    Spring MVC---数据绑定和表单标签详解

    在Spring MVC框架中,数据绑定和表单标签是开发Web应用程序时...总的来说,Spring MVC的数据绑定和表单标签库为开发复杂的Web应用程序提供了强大的工具,使开发者能够专注于业务逻辑,而不是繁琐的表单处理和数据转换。

    Spring-Reference_zh_CN(Spring中文参考手册)

    13.9. 使用Spring的表单标签库 13.9.1. 配置标签库 13.9.2. form标签 13.9.3. input标签 13.9.4. checkbox标签 13.9.5. radiobutton标签 13.9.6. password标签 13.9.7. select标签 13.9.8. option标签 13.9.9. ...

    Spring 注解学习手札(三) 表单页面处理

    JSP则是经典的Java服务器页面,通过EL(表达式语言)和JSTL标签库来处理逻辑。 8. ExceptionHandler 和 HandlerExceptionResolver: 这两者都是处理控制器中未被捕获异常的方式。`@ExceptionHandler` 注解可以在控制...

    大优惠 Spring MVC学习指南(第2版)2017.pdf

    全书共计12章,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC。除此之外,...

    struts1标签库运用总结

    使用Struts1的标签库能够极大地提升开发效率,减少代码量,同时增强应用的安全性和可维护性。例如,通过bean标签库,我们可以方便地在JSP页面上操作属性,实现国际化;通过logic标签库,我们可以进行逻辑控制,避免...

Global site tag (gtag.js) - Google Analytics