Spring表单标签
虽然我们可以使用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表单标签的更多相关文章
- Spring MVC表单标签
从Spring 2.0开始,Spring MVC开始全面支持表单标签,通过Spring MVC表单标签,我们可以很容易地将控制器相关的表单对象绑定到HTML表单元素中. form标签 和使用任 ...
- springmvc的表单标签
1. Spring提供的轻量级标签库 2.可在JSP页面中渲染HTML元素的标签 3 用法 1)必须在JSP页面的开头处声明taglib指令 <%@ taglib prefix="fm ...
- Java框架之SpringMVC 04-视图解析-Spring表单-JSON-上传下载
SpringMVC 视图解析 请求处理方法(controller方法)执行完成后,最终返回一个 ModelAndView 对象,即使出现异常也会返回一个 ModelAndView 对象.对于那些返回 ...
- Spring MVC---数据绑定和表单标签
数据绑定和表单标签 数据绑定 数据绑定是将用户输入绑定到领域模型的一种特性,在Spring MVC的controller和view数据传递 ...
- Spring MVC 数据绑定和表单标签库
数据绑定是将用户输入绑定到领域模型的一种特性.作用是将 POJO 对象的属性值与表单组件的内容绑定. 数据绑定的好处: 1. 类型总是为 String 的 HTTP 请求参数,可用于填充不同类型的对象 ...
- 【Spring学习笔记-MVC-11--】Spring MVC之表单标签
一.使用方法 1.要使用Spring MVC提供的表单标签,首先需要在视图页面添加: <%@ taglib prefix="form" uri="http://ww ...
- 关于Spring MVC中的表单标签库的使用
普通的MVC设计模式中M代表模型层,V代表视图层,C代表控制器,SpringMVC是一个典型的MVC设置模式的框架,对于视图和控制器的优化很多,其中就有与控制器相结合的JSP的表单标签库. 我们先简单 ...
- SpringMVC 表单标签 & 处理静态资源
使用 Spring 的表单标签 通过 SpringMVC 的表单标签可以实现将模型数据中的属性和 HTML 表单元素相绑定,以实现表单数据更便捷编辑和表单值的回显. form 标签 一般情况下,通过 ...
- SpringMVC学习系列(11) 之 表单标签
本篇我们来学习Spring MVC表单标签的使用,借助于Spring MVC提供的表单标签可以让我们在视图上展示WebModel中的数据更加轻松. 一.首先我们先做一个简单了例子来对Spring MV ...
随机推荐
- oracle和sql server 比较
Oracle SQLServer 比较 字符数据类型 CHAR CHAR 都是固定长度字符资料但oracle里面最大度为2kb,SQLServer里面最大长度为8kb 变长字符数据类型 ...
- 利用xcopy在复制文件或文件夹的时候保留其权限
当用 Windows Explorer 复制或移动文件和文件夹时,文件或文件夹上设置的权限可能会发生改变.例如,当在一个 NTFS文件系统卷内或在两个 NTFS 卷之间复制一个文件时,Windows将 ...
- Linux文件权限总结
一.用户组和用户 Linux是一个多用户.多任务环境,如下图,GroupA代表一个用户组,GroupB代表一个用户组,root是超级用户. Linux中,任何一个文件都有User.Group和othe ...
- Kafka消费者生产者实例
为了更为直观展示Kafka的消息生产消费的过程,我会从基于Console和基于Application两个方面介绍使用实例.Kafka是一个分布式流处理平台,具体来说有三层含义: 它允许发布和订阅记录流 ...
- 给View 添加手势,点击无反应 如何给View添加点击事件,手势方法
项目中有很多地方需要添加点击事件,重复代码很多,所以做了一个UIView的分类,专门做点击事件使用.项目地址:UIView-Tap 代码很简单,主要有一点就是注意分类不能直接添加属性,需要用到运行时相 ...
- 【剑指offer】扑克牌的顺子,C++实现
# 题目 # 思路 顺子满足的条件: 数组长度必须为5 除0外没有重复的牌(0表示大小王) 顺子中最大值和最小值的差值小于5 # 代码 #include <iostream> #inclu ...
- socket创建UDP服务端和客户端
UDP服务端代码示例: from socket import * #1.创建数据报套接字 sockfd = socket(AF_INET, SOCK_DGRAM) #2.绑定服务端地 sockfd.b ...
- 并查集实现Tarjan算法
本文是对http://noalgo.info/476.html的一点理解,特别是对其中 int father[mx]: //节点的父亲 int ancestor[mx]; //已访问节点集合的祖先 这 ...
- BZOJ4237 稻草人 【CDQ分治】
Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要 ...
- java 并发时使用条件变量--Condition
lock--unlock的方式在实际中使用较少,一般使用synchronized获取对象的内部锁替代,但是lock--unlock对了解synchronized有很大的帮助. 创建一个bank对象用于 ...