spring mvc form组件

概述 
    在低版本的Spring中,你必须通过JSTL或<spring:bind>将表单对象绑定到HTML表单页面中,对于习惯了Struts表单标签的开发者来说,Spring MVC的这一表现确实让人失望。不过这一情况已经一去不复返了,从Spring 2.0开始,Spring MVC开始全面支持表单标签,通过Spring MVC表单标签,我们可以很容易地将控制器相关的表单对象绑定到HTML表单元素中。 
在上一篇文章《Spring MVC的表单控制器》中(http://tech.it168.com/j/2007-07-26/200707261434046.shtml)我们已经使用到了部分的Spring MVC表单标签,在本文中我们将对Spring MVC表单标签进行全面的介绍,让我们首先从<form:form>标签开始吧。 

form标签 
    和使用任何JSP扩展标签一样,在使用Spring表单标签之前,你必须在JSP页面中添加一行引用Spring表单标签的声明,如下所示: 

 
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 

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

①引入标签的声明 <html> … 

②声明后,在页面中就可以使用任意Spring表单标签了 </html>

    一般情况下,我们使用“form”作为Spring MVC表单标签的前缀,当然只要愿意,你可以调整为其它的前缀名。在声明好标签引用后,就可以在该JSP文件中使用所有Spring MVC的表单标签了。下面是一个使用<form:form>表单标签的示例,它将最终生成一个HTML的 form表单:  

<form:form> 
用户名:
<form:input path="userName" />
<br> 
密 码:
<form:password path="password" />
<br>
 Email:
<form:input path="email" />
<br> 
<input type="submit" value="注册" name="testSubmit"/> 
<input type="reset" value="重置" /> 
</form:form>

     
      回忆一下我们在《Spring MVC的表单控制器》(http://tech.it168.com/j/2007-07-26/200707261434046.shtml)文章中介绍的用户注册表单控制器,用户通过GET请求调用表单控制器时,表单控制器生成一个新的表单对象,然后重定向到表单输入页面。正因为表单页面是通过访问表单控制器导向过来的,所以<form:form>标签本身无需做额外的设置就可以达到以下两个目标: 
    1) 它不需要象HTML的<form>标签或Struts的表单标签一样通过action属性指定表单提交的地址。假设和<form:form>标签对应的控制器的URL是“/registerUser.html”,应用部署目录为“baobaotao”,则最后产生的HTML代码自动包含表单提交地址: 
<form id="command" method="post" action="/baobaotao//registerUser.html">…</form> 
    2) <form:form>标签内部的组件标签(如<form:input>、<form:password>等)可以直接和表单控制器所对应的表单对象进行值绑定。 

    默认情况下,表单控制器将表单对象以“command”为名放到PageContext中,你可以通过表单控制器commandName属性的设置使用其它的名字(假设设置为“user”),这时你必须通过<form:form commandName="user">显式指定绑定的表单对象名称。

    除了commandName属性外,Spring表单标签拥有丰富的可设置属性,这些属性大都是HTML表单标签属性的镜像,如onclick、ondblclick、tabindex等等。需要注意的一点是这些属性都是小写的,而对应的HTML标签的属性则没有这个限制。但是有几个和HTML标签有区别的属性,我们通过表 1进行说明: 
    表 1 表单元素标签特殊属性 

目录

说明

cssClass

使用该属性指定表单元素CSS样式名,相当于HTML元素的class属性。示例:<form:input path="userName" cssClass="inputStyle"/>。

cssStyle

直接通过该属性指定样式,相当于HTML元素的style属性。示例:

<form:input path="userName" cssStyle="width:100px"/>。

cssErrorClass

cssClass表示表单元素未发生错误时对应的样式,而cssErrorClass表示表单元素发生错误时对应的样式,示例:

输入组件标签 
    表单中有一些用于接受输入值的组件,如单行文本框、多行文本框以及密码框,Spring为它们提供了对应的表单标签,请看下面的例子: 
代码清单 1 使用输入组件标签的表单 

<form:form> 
用户名:
<form:input path="userName" /> 
<br>
 ①单行文件框标签 密 码:
<form:password path="password" />
<br> 
②密码框标签 描 述:
<form:textarea path="desc" cols="20" rows="3"/>
<br>
③多行文件框标签 
<form:hidden path="times"/> 
④隐藏组件的值 
<input type="submit" value="注册" name="testSubmit"/> 
<input type="reset" value="重置" /> 
</form:form>

    正如你看到的,所有表单组件标签都通过path属性绑定表单对象的属性值,它支持级联属性,比如path="user.userName"将调用表单对象getUser.getUserName()绑定表单对象的属性值。这些表单组件标签拥有大多数HTML组件标签的镜像属性,如③处的<form:textarea>就使用了cols和rows属性设定列数和行数。 

以上使用表单标签的页面的对应HTML页面如下所示:

<form id="command" method="post" action="/baobaotao//registerUser.html"> 
用户名:
<input id="userName" name="userName" type="text" value=""/>
<br> 
密 码: 
<input id="password" name="password" type="password" value=""/>
<br> 
描 述:<textarea id="desc" name="desc" rows="3" cols="20"></textarea>
<br> 
<input id="times" name="times" type="hidden" value="0"/> 
<input type="submit" value="注册" name="testSubmit"/> 
<input type="reset" value="重置" /> 
</form>

单选框和复选框组件标签 
    单选框和复选框组件虽然在HTML中都对应<input>元素标签,但在Spring MVC表单标签中,它们分别对应两个更达意的标签:    

<form:radiobutton>和<form:checkbox>。 
radiobutton 单选框组件由两个同名的标签组件组成,当表单对象对应属性值和value值相等时,单选框选中。

下面是一个代表性别的单选框: 
<form:form> 性 别:<form:radiobutton path="sex" value="0"/>男 <form:radiobuttonpath="sex" value="1"/>女 </form:form> 
当表单对象的sex属性为0时(可以是String、int等可以自动转换为String的类型),所生成的HTML代码如下所示: 

<form id="command" method="post" action="/baobaotao//registerUser.html"> 
性 别:
<input id="sex1" name="sex" type="radio" value="0" checked="checked"/>
男 
<input id="sex2" name="sex" type="radio" value="1"/>女 </form>

checkbox 
    复选框组件标签相对来说复杂一些,复选框组件对应的表单属性不但可以boolean类型,还可以是String[]、Collection,Enum等类型。针对不同属性类型,复选框的选中状态的判断条件是不一样的: 
 boolean类型:当对应属性为true时,该复选框选中(一个属性仅对应一个复选框); 
 String[]、Collection或Enum类型:复选框对应值出现在对应属性列表中,该复选框选中; 
 其它类型:当复选框对应的值可以转换为对应属性值,该复选框选中。 
假设用户注册的User表单对象包含了一个List类型的favorites属性: 

import java.util.List; 
public class User { 
private List favorites; 
public List getFavorites() { 
return favorites; 
} 
public void setFavorites(List favorites) { 
this.favorites = favorites; 
} 
} 


我们希望将其在页面中使用一个复选框组件绑定这个属性,则可以使用以下的代码: 
代码清单 2 复选框标签的使用 

<form:form> 
兴趣爱好: 
<form:checkbox path="favorites" value="1"/>computer 
<form:checkbox path="favorites" value="2"/>sport 
<form:checkbox path="favorites" value="3"/>entertainment 
<form:checkbox path="favorites" value="4"/>literature 
</form:form> 


除了正常的path属性名外,还必须提供一个value属性,假设User表单对象的favorites属性包括了1和3的值,那么产生的HTML页面为: 


<form id="command" method="post" action="/baobaotao//registerUser.html"> 
兴趣爱好:<input id="favorites1" name="favorites" type="checkbox" value="1" checked="checked"/> 
<input type="hidden" value="1" name="_favorites"/>computer 
<input id="favorites2" name="favorites" type="checkbox" value="2" /> 
<input type="hidden" value="1" name="_favorites"/>sport 
<input id="favorites3" name="favorites" type="checkbox" value="3" checked="checked"/> 
<input type="hidden" value="1" name="_favorites"/>entertainment 
<input id="favorites4" name="favorites" type="checkbox" value="4"/> 
<input type="hidden" value="1" name="_favorites"/>literature 
</form> 


大家可能已经注意到每个复选框组件的后台都跟着一个隐藏组件,这是因为当HTML页面中的复选框没有被选中时,这个复选框的值不会在表单提交时作为HTTP请求参数发送到服务器端,这给Spring的表单数据绑定造成了麻烦——因为无法触发setFavorites()方法的调用(如果原来已经有值,这个值不会被设置为空)。解决方法就是在每个复选框后面加一个隐藏组件,并且将对应的复选框名字前添加一个下划线("_")作为隐藏组件的名字。这样一来,你相当于告诉Spring“这个表单中存在这样一个复选框,我希望表单对象中对应的属性和这个checkbox的状态保持一致”。 
假设复选框对应的选项在数据库或配置文件中定义,那么页面复选框标签就不能通过硬编码的方式指定,相反必须根据配置的选项数据动态产生。对于这样的需求,代码清单 2的编写方式显然不能满足需求。回忆一下表单控制器的工作流程,我们知道可以通过复写referenceData()方法在表单显示前准备一些需要的数据,现在终于派上用场了,来看一下具体的实现: 

代码清单 3 UserRegisterController:准备表单显示数据 

 

package com.baobaotao.web.user; … import org.springframework.ui.ModelMap; public class UserRegisterController extends SimpleFormController { private BbtForum bbtForum; ①创建初始表单对象 protected Object formBackingObject(HttpServletRequest request) throws Exception { int userId = ServletRequestUtils.getIntParameter(request, "userId",-1); User user = bbtForum.getUser(userId); user.setUserName("tom"); List favorites = new ArrayList();①-1默认选中值为1和3的选项 favorites.add("1"); favorites.add("3"); user.setFavorites(favorites); return user; } @Override ②准备表单显示时需要的数据 protected Map referenceData(HttpServletRequest request) throws Exception { Map favoriteMap = new LinkedHashMap(); favoriteMap.put("1", "computer"); favoriteMap.put("2", "sport"); favoriteMap.put("3", "entertainment"); favoriteMap.put("4", "literature"); ②-1将表单页面需要的对象以ModelMap返回,最终将以属性名值对方式出现在请求属性中 return new ModelMap().addObject("favoriteMap", favoriteMap); } @Override protected ModelAndView onSubmit(Object command, BindException errors) throws Exception { User user = (User) command; bbtForum.registerUser(user); return new ModelAndView(getSuccessView(), "user", user); } }

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
综合小区管理系统管理系统按照操作主体分为管理员和用户。管理员的功能包括报修管理、车位管理、车位分配管理、出入管理、字典管理、房屋管理、物业费缴纳管理、公告管理、物业人员投诉管理、我的私信管理、物业人员管理、用户管理、管理员管理。用户的功能包括管理部门以及部门岗位信息,管理招聘信息,培训信息,薪资信息等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 综合小区管理系统管理系统可以提高综合小区管理系统信息管理问题的解决效率,优化综合小区管理系统信息处理流程,保证综合小区管理系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理综合小区管理系统信息,包括出入管理,报修管理,报修管理,物业费缴纳等,可以管理操作员。 出入管理界面,管理员在出入管理界面中可以对界面中显示,可以对招聘信息的招聘状态进行查看,可以添加新的招聘信息等。报修管理界面,管理员在报修管理界面中查看奖罚种类信息,奖罚描述信息,新增奖惩信息等。车位管理界面,管理员在车位管理界面中新增。公告管理界面,管理员在公告管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值