虽然我们可以使用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. oracle和sql server 比较

    Oracle   SQLServer   比较 字符数据类型  CHAR  CHAR  都是固定长度字符资料但oracle里面最大度为2kb,SQLServer里面最大长度为8kb 变长字符数据类型  ...

  2. 利用xcopy在复制文件或文件夹的时候保留其权限

    当用 Windows Explorer 复制或移动文件和文件夹时,文件或文件夹上设置的权限可能会发生改变.例如,当在一个 NTFS文件系统卷内或在两个 NTFS 卷之间复制一个文件时,Windows将 ...

  3. Linux文件权限总结

    一.用户组和用户 Linux是一个多用户.多任务环境,如下图,GroupA代表一个用户组,GroupB代表一个用户组,root是超级用户. Linux中,任何一个文件都有User.Group和othe ...

  4. Kafka消费者生产者实例

    为了更为直观展示Kafka的消息生产消费的过程,我会从基于Console和基于Application两个方面介绍使用实例.Kafka是一个分布式流处理平台,具体来说有三层含义: 它允许发布和订阅记录流 ...

  5. 给View 添加手势,点击无反应 如何给View添加点击事件,手势方法

    项目中有很多地方需要添加点击事件,重复代码很多,所以做了一个UIView的分类,专门做点击事件使用.项目地址:UIView-Tap 代码很简单,主要有一点就是注意分类不能直接添加属性,需要用到运行时相 ...

  6. 【剑指offer】扑克牌的顺子,C++实现

    # 题目 # 思路 顺子满足的条件: 数组长度必须为5 除0外没有重复的牌(0表示大小王) 顺子中最大值和最小值的差值小于5 # 代码 #include <iostream> #inclu ...

  7. socket创建UDP服务端和客户端

    UDP服务端代码示例: from socket import * #1.创建数据报套接字 sockfd = socket(AF_INET, SOCK_DGRAM) #2.绑定服务端地 sockfd.b ...

  8. 并查集实现Tarjan算法

    本文是对http://noalgo.info/476.html的一点理解,特别是对其中 int father[mx]: //节点的父亲 int ancestor[mx]; //已访问节点集合的祖先 这 ...

  9. BZOJ4237 稻草人 【CDQ分治】

    Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要 ...

  10. java 并发时使用条件变量--Condition

    lock--unlock的方式在实际中使用较少,一般使用synchronized获取对象的内部锁替代,但是lock--unlock对了解synchronized有很大的帮助. 创建一个bank对象用于 ...