http://blog.csdn.net/yerenyuan_pku/article/details/72511749

高级参数绑定

现在进入SpringMVC高级参数绑定的学习,本文所有案例代码的编写均建立在前文SpringMVC学习(五)——SpringMVC的参数绑定的案例基础之上,因此希望读者能仔细阅读这篇文章。

绑定数组

现有这样一个需求:在商品列表页面选中多个商品,然后删除之。下面是我对该需求的分析:此功能要求商品列表页面中的每个商品前有一个checkbook(复选框),选中多个商品后点击删除按钮把商品id传递给Controller,根据商品id批量删除商品信息。 
首先将itemList.jsp页面改造为:

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@ 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> </head> <body> <form action="${pageContext.request.contextPath }/queryitem.action" method="post"> 查询条件: <table width="100%" border=1> <tr> <td>商品id:<input type="text" name="items.id" /></td> <td>商品名称:<input type="text" name="items.name" /></td> <td><input type="submit" value="查询"/></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="${itemList }" var="item"> <tr> <td><input type="checkbox" name="ids" 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 }/itemEdit.action?id=${item.id}">修改</a></td> </tr> </c:forEach> </table> </form> </body> </html>

生成html代码如下: 

页面选中多个checkbox向Controller类的方法中传递。 
接着要修改ItemController类的queryItem方法,接收itemList.jsp页面传递过来的多个商品id。Controller类方法中可以用String[]接收,或者pojo的String[]属性接收。两种方式任选其一即可。

  1. 方式一:使用String[]接收。 
    如果使用String[]接收,那么ItemController类的queryItem方法应改造为:

    @RequestMapping("/queryitem")
    public String queryItem(QueryVo queryVo, String[] ids) {// 打印绑定结果System.out.println(queryVo.getItems().getId()); System.out.println(queryVo.getItems().getName()); return "success"; }
  2. 方式二:使用pojo的String[]属性接收。 
    首先在QueryVo类中添加如下属性:

    private String[] ids;
    • 1
    • 1

    并添加其相对应的get/set方法。如此一来,QueryVo类就改造为:

    public class QueryVo {private Items items;private String[] ids;public String[] getIds() { return ids; } public void setIds(String[] ids) { this.ids = ids; } public Items getItems() { return items; } public void setItems(Items items) { this.items = items; } }

    ItemController类的queryItem方法不变,假设依然为:

    @RequestMapping("/queryitem")
    public String queryItem(QueryVo queryVo, String[] ids) {// 打印绑定结果System.out.println(queryVo.getItems().getId()); System.out.println(queryVo.getItems().getName()); return "success"; }

    在以下代码处打一个断点:

    System.out.println(queryVo.getItems().getId());
    • 1
    • 1

    然后以Debug模式运行queryItem方法,观察queryVo和ids两个变量,效果如下: 

将表单的数据绑定到List

现有这样一个需求:实现商品数据信息的批量修改。下面是我对该需求的分析:要想实现商品数据信息的批量修改,需要在商品列表中可以对商品信息进行修改,并且可以批量提交修改后的商品数据。 
首先将QueryVo类改造为:

public class QueryVo {private Items items;private String[] ids;private List<Items> itemList; public List<Items> getItemList() { return itemList; } public void setItemList(List<Items> itemList) { this.itemList = itemList; } public String[] getIds() { return ids; } public void setIds(String[] ids) { this.ids = ids; } public Items getItems() { return items; } public void setItems(Items items) { this.items = items; } }

List中存放对象,并将定义的List放在包装类中,使用包装pojo对象接收。 
然后将itemList.jsp页面改造为:

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@ 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> </head> <body> <form action="${pageContext.request.contextPath }/queryitem.action" method="post"> 查询条件: <table width="100%" border=1> <tr> <td>商品id:<input type="text" name="items.id" /></td> <td>商品名称:<input type="text" name="items.name" /></td> <td><input type="submit" value="查询"/></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="${itemList }" var="item" varStatus="s"> <tr> <td><input type="checkbox" name="ids" value="${item.id }" /></td> <td> <input type="hidden" name="itemList[${s.index}].id" value="${item.id }" /> <input type="text" name="itemList[${s.index}].name" value="${item.name }" /> </td> <td><input type="text" name="itemList[${s.index}].price" value="${item.price }" /></td> <td><input type="text" name="itemList[${s.index}].createtime" value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>" /></td> <td><input type="text" name="itemList[${s.index}].detail" value="${item.detail }" /></td> <td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td> </tr> </c:forEach> </table> </form> </body> </html>

注意:以上input输入项的name属性必须是包装pojo的list属性+下标+元素属性。 
大家可能忘了<c:forEach>标签中的varStatus属性了,在此我对它做一个总结,希望能唤醒读者的记忆。 
varStatus属性常用参数总结如下:

  • ${status.index}:输出行号,从0开始。
  • ${status.count}:输出行号,从1开始。
  • ${status.current}:当前这次迭代的(集合中的)项。
  • ${status.first}:判断当前项是否为集合中的第一项,返回值为true或false。
  • ${status.last}:判断当前项是否为集合中的最后一项,返回值为true或false。
  • begin、end、step分别表示:起始序号,结束序号,跳跃步伐。

最后并不需要修改ItemController类的queryItem方法,假设依然为:

@RequestMapping("/queryitem")
public String queryItem(QueryVo queryVo, String[] ids) {// 打印绑定结果System.out.println(queryVo.getItems().getId()); System.out.println(queryVo.getItems().getName()); return "success"; }

注意:接收List类型的数据必须是pojo的属性,方法的形参为List类型无法正确接收到数据。 
在以下代码处打一个断点:

System.out.println(queryVo.getItems().getId());
  • 1
  • 1

然后以Debug模式运行queryItem方法,观察queryVo这个变量,就能看到我们所想要的效果。

@RequestMapping注解的使用

之前,我们就已经使用过@RequestMapping注解了,但还有一些细节我还没讲到,所以在此将详细讲讲@RequestMapping注解的使用。

@RequestMapping

通过@RequestMapping注解可以定义不同的处理器映射规则。

URL路径映射

之前我们也经常编写URL路径映射,大致可以写为:

@RequestMapping("/item")
  • 1
  • 1

或者

@RequestMapping(value="/item")
  • 1
  • 1

value的值是数组,所以可以将多个url映射到同一个方法上。

窄化请求映射

在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头,通过此方法对url进行分类管理。如下:@RequestMapping放在类名上边,设置请求前缀。

@Controller
@RequestMapping("/item")
public class ItemController {...}

然后在方法名上边设置请求映射url,即@RequestMapping注解应放在方法名上边,如下:

@RequestMapping("/itemList")
public ModelAndView getItemsList() {// 查询商品列表 List<Items> itemList = itemService.getItemList(); // 把查询结果传递给页面 ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("itemList", itemList); // addObject方法相当于放到request域上 // 设置逻辑视图 modelAndView.setViewName("itemList"); // 返回结果 return modelAndView; }

最后在浏览器中输入地址进行访问时,访问地址应为:http://localhost:8080/springmvc-web2/item/itemList.action

请求方法限定

  • 限定GET方法:@RequestMapping(method = RequestMethod.GET)。 
    如果通过post方式访问则报错: 

    以例明示:

    @RequestMapping(value="/updateitem",method={RequestMethod.GET})
    • 1
    • 1
  • 限定POST方法:@RequestMapping(method = RequestMethod.POST)。 
    如果通过get方式访问则报错: 

    以例明示:

    @RequestMapping(value="/updateitem",method={RequestMethod.POST})
  • GET和POST都可以:@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})。 
    以例明示:

    @RequestMapping(value="/updateitem",method={RequestMethod.POST,RequestMethod.GET})
  • 注意,这儿可能有中文乱码问题,大家须谨慎对待。

转载于:https://www.cnblogs.com/telwanggs/p/6912171.html

(转)SpringMVC学习(六)——SpringMVC高级参数绑定与@RequestMapping注解相关推荐

  1. Springmvc的handler method参数绑定常用的注解

    转自:http://blog.longjiazuo.com/archives/1149 1. 简介: handler method参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为 ...

  2. (转)SpringMVC学习(一)——SpringMVC介绍与入门

    http://blog.csdn.net/yerenyuan_pku/article/details/72231272 SpringMVC介绍 SpringMVC是什么? SpringMVC和Stru ...

  3. (转)SpringMVC学习(三)——SpringMVC的配置文件

    http://blog.csdn.net/yerenyuan_pku/article/details/72231527 读者阅读过SpringMVC学习(一)--SpringMVC介绍与入门这篇文章后 ...

  4. (转)SpringMVC学习(五)——SpringMVC的参数绑定

    http://blog.csdn.net/yerenyuan_pku/article/details/72511611 SpringMVC中的参数绑定还是蛮重要的,所以单独开一篇文章来讲解.本文所有案 ...

  5. SpringMVC学习:控制层(Controller)基于注解详解

    文章目录 一.URL映射Controller的方法返回值 二.SpringMVC各类注解详解 (一) @Controller (二) @RequestMapping 1.基本用法 2. path属性或 ...

  6. (转)SpringMVC学习(十)——SpringMVC与前台的json数据交互

    http://blog.csdn.net/yerenyuan_pku/article/details/72514022 json数据格式在接口调用中.html页面中比较常用,json格式比较简单,解析 ...

  7. SpringMVC学习(二)——SpringMVC架构及组件(及其运行原理)

    相信大家通过前文的学习,已经对SpringMVC这个框架多少有些理解了.还记得上一篇文章中SpringMVC的处理流程吗?    这个图大致描述了SpringMVC的整个处理流程,这个流程图还是相对来 ...

  8. SpringMVC学习——对于SpringMVC的整体认识

    文章目录 一.首先什么是SpringMVC? 二.同类的技术有哪些? 三.对比同类的优缺点是哪些? 四.SpringMVC的组成部分? 五.SpringMVC项目的架构图 一.首先什么是SpringM ...

  9. springMVC学习(7)-springMVC校验

    一.校验理解: 对于安全要求较高点建议在服务端进行校验. 控制层conroller:校验页面请求的参数的合法性.在服务端控制层conroller校验,不区分客户端类型(浏览器.手机客户端.远程调用) ...

最新文章

  1. Ubuntu9.10使用windows的字体的方法!
  2. archlinux 开机自动连接wifi
  3. 性能优化8--内存泄露
  4. vc c语言坐标图,VC++6.0下C语言画图编程问题
  5. 【HDU - 5627】Clarke and MST(最大生成树,与运算性质,最小生成树MST变形)
  6. exfat单元分配要设置多少_微软宣布,支持往Linux内核里添加exFAT存储了!跨系统存储的福音...
  7. CentOS 7 + Win 双系统的安装遇到的重要问题
  8. 第一章 Android Framework 基础认知
  9. Rainmeter天气不能更新、win地图不能检测定位
  10. matlab命令窗口作用是什么,matlab的命令窗口的作用是什么
  11. 手表频率测试软件,石英钟表测试仪是一款测量石英钟的灵活的工具
  12. docker4dotnet #3 在macOS上使用Visual Studio Code和Docker开发asp.net core和mysql应用
  13. 丢手帕问题 java_java入门小程序—17人游戏(丢手绢问题) | 学步园
  14. 我的操作系统梦破灭了
  15. IDEA常用快捷键(Windows)
  16. 冰点文库----拒绝百度文库会员,高速下载文章
  17. Maven项目简单配置Log4j
  18. PC端和移动端微信加入群聊的测试点分析
  19. [自扫盲]skype、IP电话、VOIP、网络电话、互联网电话、IP拨号
  20. 基于Python的五子棋人机对战

热门文章

  1. (29)FPGA摩尔型状态机设计(第6天)
  2. 2021年NBA附加赛第一轮预测
  3. 用标准C语言初始化线性表,C语言数据结构-顺序线性表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作...
  4. mysql percona 密码设置_Percona mysql5.7 默认密码
  5. linux清除硬盘,linux下清除硬盘的几种方法
  6. python连接不上数据库_绕不过去的Python连接MySQL数据库
  7. MPI程序例子 test_8_1_2.c -- 对等模式的MPI程序,Jacobi迭代 (MPI_Send、MPI_Recv)
  8. linux input子系统分析--概述与数据结构
  9. 从程序员到项目经理(三)
  10. 嵌入式Linux系统编程学习之二十四消息队列