虽然我们可以使用HTML原生的form表单标签来轻松的写出一个表单,其实我一直都是这样做的,但是使用Spring表单标签可以更方便我们完成例如:验证失败后表单数据的回填功能(虽然你可以使用EL+JSTL来实现),但是使用spring表单标签更为方便。

如同使用JSTL一样,我们需要先在JSP页面中使用taglib指令导入:

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

表单标签库中的标签:

标签 描述
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 渲染一个select元素
option 渲染一个可选元素
errors 在span元素中渲染字段错误

表单标签

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

commandName属性或许是其中最为重要的属性,因为它定义了模型属性的名称,该值要求与返回该表单视图的请求处理方法中模型名一致。commandName==模型名,建议这个属性为必填属性

<form:form commandName="book" action="save-book" method="post">
...
</form>

这个commandName为book,是与请求“save-book”对应的请求方法中模型数据名一样的,也就是说需要在请求方法中将数据模型添加到Model对象中,model.addAttribute("book",new Book()),如果不这样做,页面就会抛出异常。

表单标签的属性:

属性 描述
acceptCharset 定义服务器接受的字符编码列表
commandName 暴露表单对象的模型数据名,默认名为command
cssClass 定义要应用到被渲染form元素的CSS类
cssStyle 定义要应用到被渲染form元素的CSS样式
htmlEscape 接受true/false,表示被渲染的值是否进行HTML转义
modelAttribute 暴露表单对象的模型数据名,默认名为command

一般来说,仍是需要action和method属性,因为这两个属性是HTML属性,还是必须的。

input标签

input标签渲染<input type="text">元素,这个标签最重要的是path,它将这个输入字段绑定到表单对象的一个属性,类似HTML表单的name值。

input标签的属性:

属性 描述
cssClass 定义要应用到被渲染input元素的CSS类
cssStyle 定义要应用到被渲染input元素的CSS样式
cssErrorClass 定义要应用到被渲染input元素的CSS类,如果bound属性中包含错误,则会覆盖cssClass属性值
htmlEscape 接受true/false ,表示是否应该对渲染的值进行HTML转义
path 要绑定的属性名,作用与HTML中的name值一致

input标签也支持绑定到嵌套对象的属性(支持属性的属性,这种级联的属性名),如:

<form:input path="category.id"/>

password标签

password标签渲染<input type="password"/>元素,password标签与input标签类似,只不过有一个showPassword属性:

属性 描述
cssClass 定义要应用到被渲染input元素的CSS类
cssStyle 定义要应用到被渲染input元素的CSS样式
cssErrorClass 定义要应用到被渲染input元素的CSS类,如果bound属性中包含错误,则会覆盖cssClass属性值
htmlEscape 接受true/false ,表示是否应该对渲染的值进行HTML转义
path 要绑定的属性名,作用与HTML中的name值一致

showPassword 表示是否应该显示密码,默认为false

hidden标签

hidden标签渲染<input type="hidden"/>元素,hidden标签,hidden标签与input标签相似,只不过它没有可视的外观,以此不支持cssClass和cssStyle属性

属性 描述
htmlEscape 接受true/false ,表示是否应该对渲染的值进行HTML转义
path 要绑定的属性名,作用与HTML中的name值一致

textarea 标签

textarea标签渲染一个HTML的textarea元素,Textarea实际就是一个支持多行输入的一个input元素

属性值同input类似,我们还可以通过rows(行),cols(列)设置textarea的大小:

<form:textarea path="note" rows="5" cols="80"/>

checkbox标签 checkboxs标签 radioButton标签 radioButtons标签

这些标签的属性都与input类似,path属性较为重要,但是后面带s的复数形式是有些区别的:

带s多个标签的特有的属性:

属性 标签
items 用于生成Collection,Map或者Array数据
itemLabel item属性中定义的Collection,Map或者Array中对象属性,为每个输入项提供标签名
iteamsValue item属性中定义的Collection,Map或者Array中对象属性,为每个输入项提供值
delimiter 定义两个input元素之间的分隔符,默认没有分隔符
element 给每个被渲染的input元素都定义一个HTML元素,默认为“span”

例如:

<form:checkbox path="outOfStock" value="Out of Stock">

<form:checkboxs path="category" items="${categoryList}">

Computing Now <form:radiobutton path="newsletter" value="Computing Now"/>
Modern Health<form:radiobutton path="mewsletter" value="Modern Health"> <form:radiobuttons path="category" items="${categoryList}"/>

select和option标签,options标签

select标签渲染一个HTML的select元素。被渲染元素的选项可能来自赋予其items属性的一个Collection,Map,Array,或者来自一个嵌套的option或者options标签。

属性值同上checkboxbutton/radiobutton一样。items对于select或后面加s的标签特别有用,因为它可以绑定带对象的Collection,Map,Array,为select元素生成选项(option)

<form:select id="category" path="category.id" items="${categories}" itemLabel="name" itemValue="id">

id和name都是categories集合中category对象的属性

<form:select id="category" path="category.id" items="${categories}" itemLabel="name" itemValue="id">
<option value="0">--Please select--</option>
</form:select>

这个代码片段是渲染一个select元素,其选项来自model属性catagories,以及option标签。

同其他后缀为s的标签一样,options标签用于生成多个option元素列表

errors标签

errors标签用于渲染一个或多个span元素,每个span元素中都包括一个字段错误信息。这个标签用于显示一个特定的字段错误,或者所有的字段错误

下面这个erros标签将显示所有错误(所有绑定在BindingResult中的错误)

<form:errors path="*"/>

下面这个errors标签显示了一个与表单支持对象的author属性相关的字段错误

<form:errors path="author"/>

使用spring表单标签的注意项

  • 我们在写修改表单的时候还是需要来一个隐藏域保存id,这样修改的时候不至于id丢失,这个隐藏域还是需要的。
  • 我们设置了<form:form>的commandName属性后,如果没有属性值需要设置,那么需要在Controller得model中放入一个对应的空对象,要不然就会报异常:

    @RequestMapping("/input-book")
public String inputBook(Model model) {
List<Category> categories=bookService.getAllCategories();
model.addAttribute("categories", categories);
model.addAttribute("book", new Book());
return "bookAddForm";
}

注意: model.addAttribute("book", new Book());  虽然放入的一个new出来的空对象,但是因为spring表单需要寻在commandName属性值,为了不让其找不到而报异常所以需要如此。

  • 之前说个可以使用JSTL的<c:url>标签来保证url地址的正确,但是遗憾的是表单的action属性不能取<c:url/>.因此,需要创建一个变量并从action属性中引用它,如下所示:
<c:url var="url" value="/emp"></c:url>
<form:form commandName="employee" action="${url }" method="POST">

一个需求

我们不允许用户修改某些字段,但是这样从修改表单传过来的表单数据就会没有这几项,如果就这样去修改数据库,这几项的数据就会被置空,这明显不是我们想要的,我们想让这样不能修改的值保持原样,应该怎么做呢?

一个办法就是使用隐藏域,将这些不能修改的值以隐藏域方式,这些值虽然存在,但是直接从网页上是看不到的,然而聪明的用户可以从浏览器的开发者工具中找到这些隐藏项,如果这些选项敏感而又需要安全,这种做法就不太好

还有一种办法就是使用springMVC的@ModelAttribute注解修饰一个会请求的方法,在这个方法中通过id获得该对象,并将这个对象放在Model中,因为@ModelAttribute修饰的方法在每个请求方法前会被调用,所以在我们的修改update方法的形参再使用@ModelAttribute来获得这个实例,springMVC在获得表单输入的数据进行封装时,会将你修改的字段封装,所以也不用担心修改的字段值丢失:

    @ModelAttribute
public void getThisBook(@RequestParam(value="id",required=false) Integer id,Model model) {
if(id==null) {
return;
}
model.addAttribute(bookService.get(id));
}
@RequestMapping("/update-book")
public String updateBook(@ModelAttribute Book book) {
System.out.println(book.getCategory().getId());
System.out.println(bookService.getCategory(book.getCategory().getId()));
Category category=bookService.getCategory(book.getCategory().getId());
book.setCategory(category);
bookService.update(book);
return "redirect:/list-book";
}

注意:因为id这个字段很重要,但是并不是每次从表单中传来的数据都有id,例如添加的时候就没有id,所以一定要设置为required=false ,要不让就会报错。而且建议使用返回为void的@ModelAttribute修饰的非请求方法,并在其中判断id是否为null

Spring表单标签的更多相关文章

  1. Spring MVC表单标签

    从Spring 2.0开始,Spring MVC开始全面支持表单标签,通过Spring MVC表单标签,我们可以很容易地将控制器相关的表单对象绑定到HTML表单元素中. form标签     和使用任 ...

  2. springmvc的表单标签

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

  3. Java框架之SpringMVC 04-视图解析-Spring表单-JSON-上传下载

    SpringMVC 视图解析 请求处理方法(controller方法)执行完成后,最终返回一个 ModelAndView 对象,即使出现异常也会返回一个 ModelAndView 对象.对于那些返回 ...

  4. Spring MVC---数据绑定和表单标签

                                   数据绑定和表单标签 数据绑定 数据绑定是将用户输入绑定到领域模型的一种特性,在Spring MVC的controller和view数据传递 ...

  5. Spring MVC 数据绑定和表单标签库

    数据绑定是将用户输入绑定到领域模型的一种特性.作用是将 POJO 对象的属性值与表单组件的内容绑定. 数据绑定的好处: 1. 类型总是为 String 的 HTTP 请求参数,可用于填充不同类型的对象 ...

  6. 【Spring学习笔记-MVC-11--】Spring MVC之表单标签

    一.使用方法 1.要使用Spring MVC提供的表单标签,首先需要在视图页面添加: <%@ taglib prefix="form" uri="http://ww ...

  7. 关于Spring MVC中的表单标签库的使用

    普通的MVC设计模式中M代表模型层,V代表视图层,C代表控制器,SpringMVC是一个典型的MVC设置模式的框架,对于视图和控制器的优化很多,其中就有与控制器相结合的JSP的表单标签库. 我们先简单 ...

  8. SpringMVC 表单标签 & 处理静态资源

    使用 Spring 的表单标签 通过 SpringMVC 的表单标签可以实现将模型数据中的属性和 HTML 表单元素相绑定,以实现表单数据更便捷编辑和表单值的回显. form 标签 一般情况下,通过 ...

  9. SpringMVC学习系列(11) 之 表单标签

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

随机推荐

  1. 各个数据库中top 的表示方法

    Select Top在不同数据库中的使用用法: 1. Oracle数据库 SELECT * FROM TABLE1 WHERE ROWNUM<=N 2. Infomix数据库 SELECT FI ...

  2. c# 处理js序列化时 datetime返回UTC格式的问题

    using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using Syst ...

  3. 创建python3.6的虚拟开发环境virtualenv

    为了保证各个项目环境和插件的相对独立,使用virtualenv作为python的虚拟运行环境,这样在项目维护方面,减少在依赖包上所花费的时间. 1.安装 virtualenv虚拟环境插件 pip in ...

  4. Unity3D内存优化案例讲解

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...

  5. ss-libev 源码解析udp篇 (1)

    shadowsocks-libev udp转发原理简介 ss_local作为一个sock5服务器,接收来自socks5客户端的数据包.在ss_local启动后,即创建一个udp socket,并bin ...

  6. Ethernet、VLAN、QinQ

    以太网帧格式: 各字段解释: DMAC:目的MAC地址,该字段确定帧的接收者. SMAC:源MAC地址,该字段标识发送帧的工作站. Type:上层协议类型(0x0800:IP;0x0808:ARP;0 ...

  7. 10day2

    最多因子数 搜索 [问题描述] 数学家们喜欢各种类型的有奇怪特性的数.例如,他们认为 945 是一个有趣的数,因为它是第一个所有约数之和大于本身的奇数. 为了帮助他们寻找有趣的数,你将写一个程序扫描一 ...

  8. 每天一个linux命令:【转载】rmdir命令

    今天学习一下linux中命令: rmdir命令.rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的.(注意,rm - r dir命令可代替rmdir,但是有很大危险性.)删 ...

  9. RF自定义系统关键字

    如果您准备学习Python,船长在这里给大家推荐几个学习Python的好地方:   1.廖雪峰官网 http://www.liaoxuefeng.com/wiki/001374738125095c95 ...

  10. vi配置

    1.配置文件的位置在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效.而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”. ...