使用spring的spring-form标签,首先要在JSP中添加以下指令:
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
1、form标签
自动绑定Model中的属性值到form对应的实体对象,默认command属性,这样就可以在form表单体里使用该对象属性。
提交表单的时候可以支持多种方法提交,GET、POST、DELETE、PUT等。
form中默认的是command,如果要自定义的话可以用commandName或是modelAttribute属性。
<form:form action="formTag/form.do" method="post" commandName="user">
该form的提交方法是delete,这样在后台我们就可以给对应的请求方法的RequestMapping加上method为RequestMethod.DELETE的限制。
<form:form action="formTag/form.do" method="delete" modelAttribute="user">
也可以用隐藏域来设定提交方式,但是需要在web.xml中加入下面代码。
<form id="user" action="formTag/form.do" method="post">
<input type="hidden" name="_method" value="delete"/>
如果不加web中的代码,使用的提交方式是post,所以需要加入下面一段话。
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
手动设置请求方法隐藏域,需要指定表单请求为POST,为GET将不会生效。
如果不用“_method”,可以用methodParam属性来指定。
<form:form action="formTag/form.do" method="post" methodParam="requestMethod" modelAttribute="user">
<input type="hidden" name="requestMethod" value="head"/>
另外需要在web中配置,methodParam属性。
<init-param>
<param-name>methodParam</param-name>
<param-value>requestMethod</param-value>
</init-param>
有Multipart请求处理时HiddenHttpMethodFilter需要在Multipart处理之后执行,需从POST请求中获取参数。MultipartFilter默认寻找filterMultipartResolver的MultipartResolver进行封装。在web中添加,
<filter>
<filter-name>multipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
<init-param>
<param-name>multipartResolverBeanName</param-name>
<param-value>multipartResolver</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>multipartFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2、input标签
springMVC表单标签最大的好处就是它支持数据绑定,不需要的时候就使用Html标签。
<td>Name:</td><td><form:input path="name"/></td>
3、hidden标签
hidden标签会被渲染为一个type为hidden的普通Html input标签。用法跟input标签一样,也能绑定表单数据,只是它生成的是一个隐藏域。
4、checkbox标签
绑定boolean数据,即true对应选中,false对应不选中。
<td>Male:</td><td><form:checkbox path="male"/></td>
绑定列表数据,数组、List、Set。当List列表拥有哪个属性的时候哪个就会被选中。
<form:checkbox path="roles" value="role1"/>Role1<br/>
当User拥有role1的时候对应的<form:checkbox path="roles"value="role1"/>就会为选中状态。
绑定数据为Object时,用类的toString与value值对比,如果相同的话,则为选中状态。
5、Checkboxes标签
这是一个复选框,其中有两个属性,分别是path、items。items表示当前要用来展示的项,而path所绑定的表单对象的属性,为当前表单对象拥有项。
<form:checkboxes path="roles" items="${roleList}"/>
@RequestMapping(value="form", method=RequestMethod.GET)
public String formTag(Map<String, Object> map) {
User user = new User();
List<String> roles = new ArrayList<String>();
roles.add("role1");
roles.add("role3");
user.setRoles(roles);
List<String> roleList = new ArrayList<String>();
roleList.add("role1");
roleList.add("role2");
roleList.add("role3");
map.put("user", user);
map.put("roleList", roleList);
return "formTag/form";
}
6、radiobutton标签
当sex为1的时候就代表性别为男,上面性别为男的那一行就会被选中,当sex为0的时候就代表性别为女,上面性别为女的那一行就会被选中。
<form:radiobutton path="sex" value="1"/>男
<form:radiobutton path="sex" value="0"/>女
7、radiobuttons标签
radiobuttons标签跟radiobutton标签的区别如同checkbox标签对checkboxes标签的区别。使用radiobuttons标签的时候将生成多个单选按钮。使用radiobuttons有两个属性也是我们必须指定的,一个是path属性,表示绑定的表单对象对应的属性,另一个是items属性,表示用于生成单选按钮的数据源。
<form:radiobuttons path="favoriteBall" items="${ballMap}" delimiter=" "/>
radiobuttons的delimiter属性,该属性表示进行展示的radiobutton之间的分隔符。
8、password标签
password标签将会被渲染为一个type为password的普通HTML input标签。
9、select标签
<form:select path="favoriteBall" items="${ballMap}"/>
与radiobuttons类似,但是还需要option
当items的数据类型为Map时,Map的key将作为可选项option的value,而Map的value将作为option的Label标签。
10、option标签
<form:select path="favoriteBall" items="${ballMap}">
<option>请选择</option>
<form:option value="1">篮球</form:option>
<option value="4">羽毛球</option>
</form:select>
当select标签指定了items属性的时候,它会忽略其标签体的内容,而使用items指定的内容来渲染出可选项。也就是说form:select标签的优先级高于手动添加的。
<form:select path="favoriteBall">
<option>请选择</option>
<form:option value="1">篮球</form:option>
<option value="4">羽毛球-A</option>
<form:option value="4">羽毛球-B</form:option>
</form:select>
SpringMVC option标签和普通HTML option标签的区别就在于普通HTML option标签不具备数据绑定功能,而SpringMVC option标签具有数据绑定功能,它能把当前绑定的表单对象的属性对应的值对应的option置为选中状态。
11、options标签
<form:options items="${ballMap}"/>
使用options标签的时候需要我们指定其items属性,它会根据其items属性生成一系列的普通HTML option标签。这里的items属性的可取数据类型及其对应的渲染规则跟select的items属性是一样的。
12、textarea标签
<form:textarea path="introduction" cols="20" rows="10"/>
SpringMVC textarea标签将被渲染为普通HTML textarea标签。
13、errors标签
SpringMVC errors标签是对应于SpringMVC的Errors对象的。它的作用就是用于展现Errors对象中包含的错误信息的。我们利用errors标签来展现Errors的时候是通过errors标签的path属性来绑定一个错误信息的。
UserValidator对象,专门用来对User对象进行验证:
public class UserValidator implements Validator {
public boolean supports(Class<?> clazz) {
return User.class.equals(clazz);
}
public void validate(Object target, Errors errors) {
ValidationUtils.rejectIfEmpty(errors, "name", null, "Name Is Empty");
ValidationUtils.rejectIfEmpty(errors, "username", null, "Username Is Empty.");
}
}
一个控制器类:
@Controller
@RequestMapping("formTag")
public class FormTagController {
@RequestMapping(value="form", method=RequestMethod.GET)
public String formTag(Map<String, Object> map) {
User user = new User();
map.put("user", user);
return "formTag/form";
}
@InitBinder
public void initBinder(DataBinder binder) {
binder.setValidator(new UserValidator());
}
@RequestMapping(value="form", method=RequestMethod.POST)
public String form(@Valid User user, Errors errors) {
if (errors.hasFieldErrors())
return "formTag/form";
return "formTag/submit";
}
}
控制器类中通过DataBinder对象给该类设定了一个用于验证的UserValidator,这样当我们请求该控制器的时候UserValidator将生效。
一段表单代码:
<form:form action="formTag/form.do" method="post" commandName="user">
<table border="1px" bordercolor="blue">
<tr><td>所有错误信息:</td>
<td><form:errors path="*"/></td>
</tr>
<tr>
<td>Name的错误信息:</td>
<td><form:errors path="name"/></td>
</tr>
<tr align="center">
<td colspan="2"><input type="submit" value="提交"/></td>
</tr>
</table>
</form:form>