##Map
Map,即java.util.Map,在springMVC中起到了至关重要的作用。它是架起视图和Model层的一座桥梁。
在RequestMap标记的任何一个方法,都可以使用Map< String, Object >
作为入参,这个map最终会自动添加到view的请求域中,在view中可以使用${key }或${requestScope.key }将model取出。
注:Map中的key必须是String类型的,因为这个map相当于映射了请求域中的键值对。
下面看一个例子:
@RequestMapping("/emp")
public String showEmployee(Map<String, Object> map){
List<Employee> employees = employeeDao.selectAll();
map.put("employees", employees);
return "list";
}
在这个路径下,将所有employee取出来放到map中,然后框架会带着这个map进入list.jsp这个view中去。
在list.jsp中引用:
<c:if test="${empty requestScope.employees}">
没有信息
</c:if>
<c:if test="${!empty requestScope.employees }">
<table border="1" cellpadding="10" cellspacing="0">
<tr>
<th>ID</th>
<th>Name</th>
<th>Gender</th>
<th>Age</th>
<th>Department</th>
<th>Edit</th>
<th>Delete</th>
</tr>
<c:forEach var="emp" items="${requestScope.employees }" >
<tr>
<th>${emp.id}</th>
<th>${emp.name}</th>
<th>${emp.gender==0?'female':'male'}</th>
<th>${emp.age}</th>
<th>${emp.department.name}</th>
<th><a href="">edit</th>
<th><a href="">delete</a></th>
</tr>
</c:forEach>
</table>
</c:if>
抛去标签先不说,对于key=employees的这个model来说,取出来的时候就用${requestScope.employees }或者直接使用${ employees}即可。
下面介绍标签语言:
JSTL
jstl-c
jstl可以以标签的形式进行逻辑控制。
使用该标签配合EL表达式可以很方便的实现对model的一些操作。这些操作往往是对model的信息进行遍历显示等等。
在view中使用jstl需要在xml头部引入jstl标准库:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
才能使用上述例子中的操作。
jstl-form
jstl还有很多有用的工具,比如form
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
使用这种form能够非常方便的跟对象映射起来。
正如SpringMVC之一中提到的@ModelAttribute
标签标记过的方法。只不过是,原生的form可以不用ModelAttribute进行“预先映射实体”,仅仅是在有需要的时候进行一下预提取(见SpringMVC之一中@ModelAttribute的例子);但是在jstl中的form,springMVC默认其必须有一个实体进行映射,即在显示表单的时候,表单所对应的实体也必须放在requestScope中或者sessionValue中去。在requestScope的情况,就用到了上述的map。在对应的Controller方法中,将表单实体放入map,然后返回view名称。框架会自动带着map传入到对应的view页面。
view页面包含的这个jstl表单也有一些要求:
参照下面的例子,一一列举:
<form:form action="input" method="POST" modelAttribute="employee">
Name: <form:input path="name" />
<br>
Age: <form:input path="age"/>
<br>
Gender:<form:radiobuttons path="gender" items="${genders}"/>
<br>
DepartmentName:<form:select path="department.id" items="${departments}"
itemLabel="name" itemValue="id"/>
<br>
<input type="submit" value="Submit"/>
</form:form>
- action:对应着控制层路径;modelAttribute对应着表单的映射实体,它的值就是map中那个实体的key。如果不写modelAttribute,在默认情况下的值为“command”,也就是说如果map中没有加入“command”为key的映射对象,后台在提交表单的时候会报错:无法找到‘command’对应的参数。
- < form:input path=”xxx” /> 中的path,相当于原生form的name属性。在使用path的值时,一定要对应着实体类的变量名称,如
<form:input path="age"/>
。对于级联属性,则对应级联的属性名。如例子中的<form:select path="department.id" items="${departments}"
- jstl的form标签有很多组件,单选标签、复选框、普通的输入框等等,非常方便开发,这也是选用它的一大优势。不过注意:最后的提交按钮使用的仍然是原生input标签,这一点要注意。
以上例子中,form提交之后会到如下的方法中(以Post提交):
入参中的employee正是map中放入的“key”对应的实例employee。
@RequestMapping(value="/input", method=RequestMethod.POST)
public String save(Employee employee){
employeeDao.save(employee);
return "redirect:/emp";
}
最终重定向到/emp的页面中显示所有employee。
附:
SpringMVC 提供了多个表单组件标签,如
< form:input />、< form:select /> 等,用以绑定表单字段的
属性值,它们的共有属性如下:
- path:表单字段,对应 html 元素的 name 属性,支持级联属性 –
- htmlEscape:是否对表单值的 HTML 特殊字符进行转换,默认值 –
为 true - cssClass:表单组件对应的 CSS – 样式类名
- cssErrorClass:表单组件的数据存在错误时,采取的 CSS – 样式
- form:input、form:password、form:hidden、form:textarea
:对应 HTML 表单的 text、password、hidden、textarea
标签 - form:radiobutton: 单选框组件标签,当表单 bean 对应的
属性值和 value 值相等时,单选框被选中 - form:radiobuttons:单选框组标签,用于构造多个单选 •
框 - items:可以是一个 List、String[] 或 Map –
- itemValue:指定 radio 的 value 值。可以是集合中 bean 的一个属性值
- itemLabel:指定 radio 的 label值
- delimiter:多个单选框可以通过 delimiter 指定分隔符
- form:checkbox: 复选框组件。用于构造单个复选框
- form:checkboxs:用于构造多个复选框。使用方式同
- form:radiobuttons: 标签
- form:select: 用于构造下拉框组件。使用方式同
- form:radiobuttons: 标签
- form:option: 下拉框选项组件标签。使用方式同
- form:radiobuttons: 标签
- form:errors:显示表单组件或数据校验所对应的错误
redirect和forward
Spring MVC 中的 forward 和 redirect
这两篇文章短小但重点突出。