说明:这里和之前一样通过相关功能的开发理解springmvc
框架的内容。
一、复杂参数绑定
1.1 包装类型的参数绑定(工程springmvc-mybatis02
)
1.1.1 需求
商品查询,Controller
方法中实现商品查询条件传入。这里是根据传入的商品名称进行查询。
1.1.2 实现方式
方式一:在形参中添加
HttpServletRequest request
参数,通过request
接收查询条件参数,但是这种方式较为原始。方式二:在形参中让包装类型的
pojo
接收查询条件参数。
页面传参的特点:复杂,多样性。比如条件有:用户帐号、商品编号...。
如果将用户帐号、商品编号、订单信息等放在简单pojo
(属性是简单类型)中,pojo
类属性比较多,比较乱,不方便维护,建议使用包装类型的pojo
。
我们看包装类型的pojo(ItemsQueryVo.java
):
public class ItemsQueryVo {
//商品信息
private Items items;
//为了系统的可扩展性,一般都是对原始的pojo进行扩展
private ItemsCustom itemsCustom;
......
1.1.3 页面参数
editItems.jsp
<td>商品名称:<input name="itemsCustom.name" /></td>
这样我们便可以将商品名称传入进去,其实和使用ognl
类似。
1.1.4 Controller方法实现
ItemsController.java
public ModelAndView queryItems(HttpServletRequest request, ItemsQueryVo itemsQueryVo) throws Exception{
List<ItemsCustom> itemsList = itemsService.findItemsList(itemsQueryVo);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("itemsList",itemsList);
modelAndView.setViewName("items/itemsList");
return modelAndView;
}
说明:
- 可以看到我们在页面中使用的
itemsCustom
就是和Controller
方法中形参ItemsQueryVo
的一个属性对应(一致)。这样就接收到页面传入的参数值了。 - 同时对于
Controller
形参中有多个pojo
,如果多个pojo
有些属性名一样,那我们可以使用包装类型将多个pojo
包装起来,这样就不至于弄混淆。
1.2 数组类型绑定(工程springmvc-mybatis03
)
1.2.1需求
商品批量删除,用户在页面选择多个商品,批量删除。
1.2.2表现层实现
关键:将页面选择(多选)的商品的id
传到Controller
方法的形参,方法形参年使用数组接收页面请求的多个商品的id
。
itemsList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查询商品列表</title>
<script type="text/javascript">
function deleteItems(){
//提交form
document.itemsForm.action="${pageContext.request.contextPath }/items/deleteItems.action";
document.itemsForm.submit();
}
function queryItems(){
//提交form
document.itemsForm.action="${pageContext.request.contextPath }/items/queryItems.action";
document.itemsForm.submit();
}
</script>
</head>
<body>
<form name="itemsForm" action="${pageContext.request.contextPath }/items/queryItems.action" method="post">
查询条件:
<table width="100%" border=1>
<tr>
<td>商品名称:<input name="itemsCustom.name" /></td>
<td><input type="button" value="查询" onclick="queryItems()"/></td>
<td><input type="button" value="批量删除" onclick="deleteItems()" /></td>
</tr>
</table>
商品列表:
<table width="100%" border=1>
<tr>
<td>选择</td>
<td>商品名称</td>
<td>商品价格</td>
<td>生产日期</td>
<td>商品描述</td>
<td>操作</td>
</tr>
<c:forEach items="${itemsList }" var="item">
<tr>
<td><input type="checkbox" name="items_id" value="${item.id}" /></td>
<td>${item.name }</td>
<td>${item.price }</td>
<td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss" /></td>
<td>${item.detail }</td>
<td><a href="${pageContext.request.contextPath }/items/editItems.action?id=${item.id}">修改</a></td>
</tr>
</c:forEach>
</table>
</form>
</body>
</html>
1.2.3 Controller方法定义
//批量删除商品信息
@RequestMapping("/deleteItems")
public String deleteItems(Integer[] items_id) throws Exception{
//调用service批量删除商品
//................
return "success";
}
说明:这里我们没有进行相关的业务操作,只是使用断点调试查看我们选中的商品id
是否传入到了此方法中。
1.3 List类型绑定
1.3.1 需求
通常在需要批量提交数据时,将提交的数据绑定到List<pojo>
中,比如:成绩的录入(会批量提交)。本例子需求:批量商品修改,在页面输入多个商品信息,将多个商品信息提交到Controller
方法中。
1.3.2 表现层实现
editItems.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查询商品列表</title>
<script type="text/javascript">
function deleteItems(){
//提交form
document.itemsForm.action="${pageContext.request.contextPath }/items/deleteItems.action";
document.itemsForm.submit();
}
function queryItems(){
//提交form
document.itemsForm.action="${pageContext.request.contextPath }/items/queryItems.action";
document.itemsForm.submit();
}
function editItemsAllSubmit(){
//提交form
document.itemsForm.action="${pageContext.request.contextPath }/items/editItemsAllSubmit.action";
document.itemsForm.submit();
}
</script>
</head>
<body>
<form name="itemsForm" action="${pageContext.request.contextPath }/items/queryItems.action" method="post">
查询条件:
<table width="100%" border=1>
<tr>
<td>商品名称:<input name="itemsCustom.name" /></td>
<td><input type="button" value="查询" onclick="queryItems()"/></td>
<td><input type="button" value="批量修改" onclick="editItemsAllSubmit()" /></td>
</tr>
</table>
商品列表:
<table width="100%" border=1>
<tr>
<td>商品名称</td>
<td>商品价格</td>
<td>生产日期</td>
<td>商品描述</td>
<td>操作</td>
</tr>
<c:forEach items="${itemsList }" var="item" varStatus="status">
<tr>
<td><input name="itemsList[${status.index}].name" value="${item.name }"/></td>
<td><input name="itemsList[${status.index}].price" value="${item.price }"/></td>
<td><input name="itemsList[${status.index}].createtime" value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss" />"/></td>
<td><input name="itemsList[${status.index}].detail" value="${item.detail }"/></td>
</tr>
</c:forEach>
</table>
</form>
</body>
</html>
说明:这里可以看到itemsList
就是pojo
中的一个属性(添加一个List
属性),这样提交过来的值就会被传递到Controller
中。
1.3.3 Controller方法实现
@RequestMapping("/editItemsAllSubmit")
public String editItemsAllSubmit(ItemsQueryVo itemsQueryVo) throws Exception{
return "success";
}
说明:这里通过itemsQueryVo
接收批量提交的商品信息,将商品信息存储到itemsQueryVo
中itemsList
属性中。这里itemsList
对应包装pojo
中的一个属性。
1.4 Map类型参数绑定
对于此种参数绑定,其实和List
类型参数绑定类似,这里不做过多说明,只是给出相关示例。
- 在包装类中定义
Map
对象,并添加getter、setter
方法,action
使用包装对象接收。在包装类中定义Map
对象如下
public class QueryVo{
private Map<String, Object> itemInfo = new HashMap<String, Object>();
//get
//set
}
- 页面定义如下
<tr>
<td>学生信息</td>
<td>
姓名:<input type=”text” name=”itemInfo[‘name’]”/>
年龄:<input type=”text” name=”itemInfo[‘price’]”/>
</td>
......
</tr>
-
Controller
方法定义如下
public String userAddSubmit(Model model, QueryVo q)throws Exception{
System.out.println(“q.getStudentInfo()”);
}