springMVC之form标签库的使用


今天有点儿小收获,关于springMVC的form标签库,接触了之后发现这东西用起来是真的方便。在这里记录一下,主要是关于<form:from>和<form:select>标签的使用。
使用第一步引入form标签库:

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

要使用这个标签库应该需要引入spring-webmvc的依赖,不然会提示找不到这个标签库,springMVC的相关注解如@RequestMapping等都需要这个依赖。

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-webmvc</artifactId>
	<version>${org.springframework-version}</version>
</dependency>

首先说一下<form:form/>标签的使用,看代码:

<form:form modelAttribute="salesForm" action="/sales/system/form">
	<form:input path="point"  value="${salesFrom.point }"/><br>
	<form:select path="goodsName" items="${list }" 
		itemValue="name" itemLabel="name"></form:select><br>
	<input type="submit" value="提交">
</form:form>

<form:form>标签的属性有很多,我主要使用了两个modeAttribute和action。action属性就不做过多的讲述了,和原生标签一样设置表单提交地址。
modeAttribute属性还得结合一java段代码来看:

@RequestMapping("/system/form")
	public String formHandler(SalesForm form,Model model){
		model.addAttribute("list", RecordManager.getList());
		System.out.println(form);
		return "form_test";
	}

都知道springMVC有个自动封装的机制,从前台传过来的参数如果与方法参数上某个对象的成员名字相同则会自动进行封装。以这为例结合上面的jsp代码,前端传过来的goodsName和point会自动封装到form对象中。今天get到一个新的知识点,印象很深,那就是model对象。

我们都知道,当我们前台需要取数据的时候使用el表达式${}进行取值,然而后台则需要通过model添加到域中。

那么问题来了,从jsp代码来看<form:form modelAttribute=“salesForm”>,我绑定的是salesForm这个属性,而从java代码中可以看出我的model中并没有添加名为salesForm的属性,它是如何进行显示的?

下面是我断点调试后的图,你看了也许就明白了:

Spring MVC的表单标签中哪些可以绑定集合数据 springmvc标签库用得多吗_webform


model中除了我自己添加的list外,还有salesFrom和其它的东西。也就是说明了一个问题,model会自动将其它的参数放进model中,名字是类名首字母小写的名字,所以会发现当你改了modelAttribute绑定的名字会报错,如果你的参数上没有SalesFrom类型的参数也会报错:

Spring MVC的表单标签中哪些可以绑定集合数据 springmvc标签库用得多吗_java_02


大概是说请求域中没有salesForm这一属性,这也就证实了我的说法,你没有SalesForm类型的参数,model中也就没有salesForm属性,所以前台使用的时候会拿不到;名字对应不上也是同理。

model在request域中,所以页面刷新时依旧有效。所以很容易会实现一个效果,刷新页面选择和输入的值保留回显

仔细想想,这一套设计真的巧妙,我已被深深折服了。

接下来是form:select标签,使用这个标签会自动生成下拉框,它主要有以下属性:

  • items:绑定model中的集合
  • itemValue:生成option的value值,这里需要注意的是不需要使用${}来取值
  • itemLabel:生成option显示的内容,这里也一样不能使用${}
  • path:会对应生成id和name属性,也就是提交的属性

当你没有指定itemValue和itemLabel的属性时,会默认将整个item项调用toString方法后设为它们的值,这是缺省效果:

Spring MVC的表单标签中哪些可以绑定集合数据 springmvc标签库用得多吗_标签库_03


这是生成的select元素的结构:

Spring MVC的表单标签中哪些可以绑定集合数据 springmvc标签库用得多吗_java_04


其实这样对比这来看也就很容易理解form:select和原生select标签的属性对应关系了。

以上全是我近段时间总结出来的自己的理解,不一定对,有错的地方望大佬指正。欢迎大家留言进行探讨!