一,高级参数绑定
1.数组的参数绑定
1).需求
在商品列表选择多个商品进行批量删除,此功能要求商品列表页面中的每个商品前有一个checkbook,选中多个商品后点击删除按钮把商品id传递给Controller,根据商品id删除商品信息。
2).jsp页面部分代码
<c:forEach items="${itemList }" var="item">
<tr>
<td><input name="ids" type="checkbox" value="${item.id }"></td>
<td>${item.name }</td>
<td>${item.price }</td>
</tr>
</c:forEach>
</table>
<button type="submit">批量删除</button>
选中多个页面会吧ids以数组的形式传给controller
3).controller接收
Controller方法中可以用Int[] ids接收,或者pojo的int[] ids属性接收
@RequestMapping("/list")
public ModelAndView delete(QueryVo queryvo ,int[] ids) {
...
}
pojo
public class QueryVo {
private int[] ids;
}
2.集合的参数绑定
1).需求
实现商品数据的批量修改,要想实现商品数据的批量修改,需要在商品列表中可以对商品信息进行修改,并且可以批量提交修改后的商品数据。
2).jsp页面部分代码
<c:forEach items="${itemList }" var="item" varStatus="status">
<tr>
<td><input name="ids" type="checkbox" value="${item.id }"></td>
<td><input name="itemList[${status.index}].name" value="${item.name }"/></td>
<td><input name="itemList[${status.index}].price" value="${item.price }"/></td>
<td><input name="itemList[${status.index}].createtime" value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td>
<td><input name="itemList[${status.index}].detail" value="${item.detail }"/></td>
<td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>
</tr>
</c:forEach>
</table>
<button type="submit">批量删除</button>
<button type="submit">批量修改</button>
varStatus属性常用参数:
${status.index} 输出行号,从0开始。
${status.count} 输出行号,从1开始。
${status.current} 当前这次迭代的(集合中的)项
${status.first} 判断当前项是否为集合中的第一项,返回值为true或false
${status.last} 判断当前项是否为集合中的最后一项,返回值为true或false
begin、end、step分别表示:起始序号,结束序号,跳跃步伐。
3).controller接收
List中存放对象,并将定义的List放在包装类中,使用包装pojo对象接收
pojo
public class QueryVo {
private int[] ids;
private List<Items> itemList;
...
}
controller
@RequestMapping("/list")
public ModelAndView edit(QueryVo queryvo ,int[] ids) {
...
}
可以看到pojo里的属性itemList接收了数据
注意:接收List类型的数据必须是pojo的属性,方法的形参为List类型无法正确接收到数据。
二,@RequestMapping注解
1.URL路径映射
@RequestMapping(value="/list")或@RequestMapping("/list")
value的值是数组,可以将多个url映射到同一个方法
@RequestMapping(value={"/list","/item","/itemlist"})
public ModelAndView showList(QueryVo queryvo ,int[] ids) {
}
2.请求方法限定
限定get方法,只能接收get请求
@RequestMapping(method = RequestMethod.GET)
method的值也是数组,可以限定多个
@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})
3.窄化请求映射
在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头,通过此方法对url进行分类管理。
@Controller
@RequestMapping("/item")
public class ItemsController {
@RequestMapping("/list")
public ModelAndView showList() {
return modelAndView;
}
访问地址为:/item/list
三,Controller方法的返回类型
1.返回ModelAndView
controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view。
@RequestMapping("/list")
public ModelAndView showList(QueryVo queryvo ,int[] ids) {
List<Items> list = itemsService.findAll();
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("itemList", list);
modelAndView.setViewName("itemList");
return modelAndView;
}
2.返回void
如果想跳转页面,只能使用servlet方式
request.getRequestDispatcher("/WEB-INF/jsp/editItem.jsp").forward(request, response);
3.返回String
1).逻辑视图名
@RequestMapping("/itemEdit")
public String itemEdit(HttpServletRequest request,Model model) {
// 指定逻辑视图名,经过视图解析器解析为jsp物理路径:
// /WEB-INF/jsp/item/editItem.jsp
return "editItem";
}
2).Redirect重定向
//通知浏览器,让浏览器重新发起请求,使用的两个不同的request域
return "redirect:list.action";
3).forward转发
//浏览器保留原有的请求地址,使用的是同一个request域
return "forward:list.action";