2019独角兽企业重金招聘Python工程师标准>>>

概述
    在低版本的Spring中,你必须通过JSTL或<spring:bind>将表单对象绑定到HTML表单页面中,对于习惯了Struts表单标签的开发者来说,Spring MVC的这一表现确实让人失望。不过这一情况已经一去不复返了,从Spring 2.0开始,Spring MVC开始全面支持表单标签,通过Spring MVC表单标签,我们可以很容易地将控制器相关的表单对象绑定到HTML表单元素中。
在本文中我们将对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>
正因为表单页面是通过访问表单控制器导向过来的,所以<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:radiobutton path="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);
}
}

转载于:https://my.oschina.net/u/735716/blog/289470

SpringMvc表单使用相关推荐

  1. SpringMVC 表单验证

    SpringMVC 表单验证 本章节内容很丰富,主要有基本的表单操作,数据的格式化,数据的校验,以及提示信息的国际化等实用技能. 首先看效果图 然后项目目录结构图 接下来用代码重点学习SpringMV ...

  2. SpringMVC表单验证器的使用

    转载自 SpringMVC表单验证器的使用 本章讲解SpringMVC中怎么通过注解对表单参数进行验证. SpringBoot配置 使用springboot, spring-boot-starter- ...

  3. SpringMVC 表单标签中 htmlEscape 属性的作用

    一.SpringMVC 表单元素标签 如下: <form:textarea path="remarks" htmlEscape="false" class ...

  4. springmvc十九:springmvc表单标签

    1. Spring提供的轻量级标签库 2.可在JSP页面中渲染HTML元素的标签 3 用法 1)必须在JSP页面的开头处声明taglib指令 <%@ taglib prefix="fm ...

  5. ​ SpringMVC表单请求参数的绑定,配置编码过滤器解决请求参数中文乱码问题,自定义类型转换器

    文章目录 ​ SpringMVC的参数绑定支持的数据类型 基本数据类型和字符串类型 JavaBean 包装类 Map类型 List类型 POST请求参数中文乱码的解决方法 自定义类型转换器(Date类 ...

  6. SpringMVC表单验证与Velocity整合

    阅读本文约"1.2分钟" 定义表单类 以Login为例,有username和password两个字段 import javax.validation.constraints.Not ...

  7. SpringMVC表单标签

    本篇我们来学习Spring MVC表单标签的使用,借助于Spring MVC提供的表单标签可以让我们在视图上展示WebModel中的数据更加轻松. 一.首先我们先做一个简单了例子来对Spring MV ...

  8. SpringMVC:学习笔记(5)——数据绑定及表单标签

    SpringMVC--数据绑定及表单标签 理解数据绑定 为什么要使用数据绑定 基于HTTP特性,所有的用户输入的请求参数类型都是String,比如下面表单: 按照我们以往所学,如果要获取请求的所有参数 ...

  9. SpringMVC之表单提交===③===多文件上传表单

    上文简单介绍了springmvc单文件上传表单 ,本文继续介绍多文件上传表单.包含单文件上传的表单已经能够满足大部分功能需求,但任然不够完善.实际业务中可能会包含多个文件同时上传,例如:商家在电商平台 ...

最新文章

  1. 万年历java课程设计报告_java万年历课程设计报告2010
  2. jvm性能调优实战 - 61常用的JVM调优网站
  3. cv::imread导致段错误_网络诊断举例LSO导致的网络性能问题
  4. 语言题库体型判断问题_1000道Python题库系列分享20(43道填空与判断题)
  5. UE4 ShooterGame Demo的开火的代码
  6. linux安装jdk环境
  7. js 导出pdf上传至oss_前端上传图片到oss,压缩图片后上传至oss(补充图片文件旋转90度问题)...
  8. html 自定义属性_五道自测题-你我都应知道的HTML小知识
  9. 雷军自述:我惨痛的大学创业失败经历
  10. Oracle与Google两IT巨头战争冲击整个硅谷
  11. 欧姆龙cp1h指令讲解_OMRON CP1H脉冲指令说明总结
  12. 西瓜书重温(二): 模型评估与选择
  13. 正则化方法拟合曲线c语言,过拟合(Overfitting)和正则化(Regularized)
  14. 化工行业借力APS生产排程
  15. RPM常用命令及RPM中文手册
  16. JAVA——算法训练 调和数列问题
  17. 二进制与十进制科学记数法举例
  18. android bluetooth——蓝牙的开启、搜索、配对与连接
  19. Python数据结构之二——tuple(元组)
  20. 岗位po是什么意思_po主是什么意思

热门文章

  1. 面试最后,HR 最后会说“我的问题问完了,你有什么要问我的吗?”如何理解和回答这句话?
  2. oracle+5秒钟一个间隔,ORACLE日期时间函数大全 (二)
  3. c#编写三角形面积公式_三角形的面积公式二叙
  4. Learning to Reconstruct 3D Human Pose and Shape via Model-fitting in the Loop
  5. Thread函数的参数传递和线程所有权转移(2.2)--std::move()
  6. java创造新世界_创建新世界闪退求解决
  7. 新冠疫情相似句对判定,快速匹配准确答案
  8. upload组件 获得焦点_HTML Input FileUpload autofocus用法及代码示例
  9. fpga挂一片ddr2_FPGA片外存储器之DDR2控制器2
  10. 读书笔记∣商务与经济统计Ch.1-3