众所周知,springmvc是用来处理页面的一些请求,然后将数据再通过视图返回给用户的,前面的几篇博文中使用的都是静态数据,为了能快速入门springmvc,在这一篇博文中,我将总结一下springmvc中如何接收前台页面的参数,即springmvc中的参数绑定问题。

1. 参数绑定的过程

  我们可以回忆一下,在struts2中,是通过在Action中定义一个成员变量来接收前台传进来的参数,而在springmvc中,接收页面提交的数据是通过方法形参来接收的。从客户端请求的key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上,然后就可以在controller中使用该参数了。来看一下这个过程: 
 
  所以我们知道,是springmvc提供了很多转换器来将页面参数绑定到controller方法的形参上,关于自定义converter,我下面会提到。大概了解了该过程后,下面开始做具体的总结。

2. 默认支持的类型

  springmvc中,有支持的默认类型的绑定。也就是说,直接在controller方法形参上定义默认类型的对象,就可以使用这些对象。

  1. HttpServletRequest对象
  2. HttpServletResponse对象
  3. HttpSession对象
  4. Model/ModelMap对象

  在参数绑定过程中,如果遇到上面类型就直接进行绑定。也就是说,我们可以在controller的方法的形参中直接定义上面这些类型的参数,springmvc会自动绑定。这里要说明一下的就是Model/ModelMap对象,Model是一个接口,ModelMap是一个接口实现 ,作用是将Model数据填充到request域,跟ModelAndView类似,关于它的使用,我在下面和简单类型参数绑定一起说。

3. 简单类型的绑定

  总结这个还是以需求为例吧,这样比较容易理解,假设现在有个需求:根据商品的id来修改对应点商品信息。所以前台页面肯定要传进来该商品的id,然后springmvc的controller进行处理,返回一个修改商品信息的页面。关于前台页面的东西都很简单,我就不贴代码了,主要部分截个图,具体的代码在文章最后有下载地址。 
  前台页面通过url将参数传递过来,请求的是editItems.action。 
 
  下面写controller中的editItems方法:

  1. @RequestMapping("/editItems")

  2. public String editItems(Model model, Integer id) throws Exception {

  3. //根据id查询对应的Items

  4. ItemsCustom itemsCustom = itemsService.findItemsById(id);

  5. model.addAttribute("itemsCustom", itemsCustom);

  6. //通过形参中的model将model数据传到页面

  7. //相当于modelAndView.addObject方法

  8. return "/WEB-INF/jsp/items/editItems.jsp";

  9. }

  这是个很简单的demo,从上面的代码中可以看出model可以直接作为参数,springmvc默认会绑定它,然后使用model将查询到的数据放到request域中,这样就可以在前台页面取出该数据了。 
  要注意一点的是,简单类型的绑定中,方法形参中的参数名要和前台传进来的名一样才能完成参数的绑定。那有人要问了,如果有特殊需求(比如更好的可读性?),这里定义的参数名就是不一样,那咋整呢?有解决办法么?有!我们可以使用注解@RequestParam对简单的类型进行参数绑定,如下: 

  所以说,如果不使用@RequestParam,要求request传入参数名称和controller方法的形参名称一致,方可绑定成功。如果使用@RequestParam,不用限制request传入参数名称和controller方法的形参名称一致。通过@RequestParam中的required属性指定参数是否必须要传入,如果设置为true,没有传入参数就会报错。

4. pojo类型的绑定

4.1 普通pojo类型

  再来总结下pojo类型的绑定,继续上面的案例,当页面展示了商品详细信息后,我做了修改,然后点击提交,后台应该将我提交的这些参数全部更新到数据库的items表中,也就是说,我提交的这些参数要绑定到Items对象或者其扩展对象中。先看一下Items中都有哪些属性: 
 
  可以看到,有各种类型的属性,当我们提交后,要将这些属性全部封装到一个pojo中,然后去更新数据库。 
  绑定很简单,对于基本类型,要求页面中input标签的name属性值和controller的pojo形参中的属性名称一致,即可将页面中数据绑定到pojo。也就是说前台页面传进来的name要和要封装的pojo属性名一模一样,然后就可以将该pojo作为形参放到controller的方法中,如下: 

  这样就能将前台表单传进来的不同属性值封装到ItemsCustom中了。但是运行一下就会发现报错,报错的信息是无法将String类型转换成java.util.Date类型,因为上面Items中有一个属性是Date类型的createtime。这就需要我们自己定义转换器了,这也是这部分的重点,下面我们自己定义一个日期转换器:

  1. //需要实现Converter接口,这里是将String类型转换成Date类型

  2. public class CustomDateConverter implements Converter<String, Date> {

  3. @Override

  4. public Date convert(String source) {

  5. //实现 将日期串转成日期类型(格式是yyyy-MM-dd HH:mm:ss)

  6. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

  7. try {

  8. //转成直接返回

  9. return simpleDateFormat.parse(source);

  10. } catch (ParseException e) {

  11. // TODO Auto-generated catch block

  12. e.printStackTrace();

  13. }

  14. //如果参数绑定失败返回null

  15. return null;

  16. }

  17. }

  定义好了转换器后,需要在springmvc.xml中进行如下配置: 
 

  现在就可以了,springmvc就能根据这个转换器将String类型正确转换成Date类型,然后封装到ItemsCustom中去了。 
  这里说一个小小的插曲:修改商品详细信息后提交,可能会有中文乱码问题,表达提交都是post方式,springmvc中关于post方式的中文乱码问题可以在web.xml中配置一个过滤器来解决,如下: 

4.2. 包装的pojo类型

  这个包装类型pojo与上面普通的pojo有啥区别呢?包装类型pojo指的是pojo中有另一个也是pojo的属性,即pojo套pojo,为什么会设计这种pojo呢?在前面的博文中我也有提到,这种组合的设计方法对于后期程序的扩展很有用,比如复杂的查询条件就需要包装到这种包装类型中。 
  那么该如何绑定呢?有两个思路:

  1. 在形参中添加HttpServletRequest request参数,通过request接收查询条件参数。
  2. 在形参中让包装类型的pojo接收查询条件参数。

  第一种方式就跟原始servlet差不多,这里使用第二种方法,我们传进来一个包装类型的pojo。看一下这个包装类型的pojo: 
 
  这个包装pojo中还有一个ItemsCustom类,这个类继承了Items类,并且用来扩展与Items相关的User对象中的相关信息。所以这个ItemsCustom中有name属性,假如我们要想将前台传进来的name属性封装到ItemsCustom中的name属性中,该如何传入呢?这就是包装类型的pojo参数绑定问题。 
  很简单,在前台我们可以通过这种方式来传: 
 
  然后controller中方法的形参传入包装类型的pojo,即ItemsQueryVo,打个断点,即可查看值有没有传进来。如下: 
 
  这样就能根据用户传进来的参数,进行复制的查询操作了。

5. 集合类型的绑定

5.1 数组的绑定

  数组的绑定指的是前台传来多个同一类型的数据,我们在controller中使用数组形参来接收前台传来的数据。还是以案例来驱动这部分内容,比如现在我们要批量删除商品,那么我们需要勾选好几个商品,这些商品都有id号,在controller中,我们需要将这些id号全部获取并放到一个数组中,然后再根据数组中的id号挨个删除数据库中对应的项。那么该如何绑定呢?其实也很简单,如下: 
  controller的方法定义为: 
 
  对应前台传入的参数为: 
 
  这样就能将前台传入的多个id绑定到数组中,然后我们就可以从数组中拿出要删除的商品的id了。

5.2 List的绑定

  通常在需要批量提交数据时,将提交的数据绑定到list<pojo>中,比如:成绩录入(录入多门课成绩,批量提交),在这里我们假设有需求:批量商品修改,在页面输入多个商品信息,将多个商品信息提交到controller方法中,即一次性更新多个商品信息。 
  所以思路是在扩展类ItemsQueryVo中新添加一个List<ItemsCustom>,然后将不同商品的信息都存到这个List中,所以修改如下: 
 
  controller方法的定义:

1、进入批量商品修改页面 
2、批量修改商品提交

  所以controller中应该有两个方法,如下: 
 
  前台jsp页面中是如何传入参数的呢?这是我们所关心的问题,因为后台形参中接收数据用的就是包装类ItemsQueryVo。看下面: 
 
  所以我们知道了,前台是通过类似于list[i].name这种形式来传递参数的。list[i]表示第i个ItemsCustom,然后 list[i].属性 表示第i个ItemsCustom中对应的属性。

5.2 Map的绑定

  Map的绑定其实和List的绑定是差不多的,首先也是在包装的pojo中新添加一个Map类型的属性,如(我随便举个例子,跟本例无关了)

  1. Public class QueryVo {

  2. private Map<String, Student> itemInfo = new HashMap<String, Student>();

  3. //get/set方法..

  4. }

关键是前台传参的时候和List不太一样,Map是这样传的,比如:

  1. <tr>

  2. <td>学生信息:</td>

  3. <td>

  4. 姓名:<input type="text" name="itemInfo['name']"/>

  5. 年龄:<input type="text" name="itemInfo['price']"/>

  6. .. .. ..

  7. </td>

  8. </tr>

  我们可以看到,Map的参数绑定传来的是Map中的key,然后value会自动绑定到Map中的那个对象的属性中。在controller中的方法里,形参就直接使用QueryVo接收即可,也很简单。 
  关于springmvc的参数绑定基本就总结到这了,其实原理都差不多,只是针对于不同的类型,绑定的方式有些区别而已,多想想多写写,基本就能掌握这些了。

一辈子很短,努力的做好两件事就好;第一件事是热爱生活,好好的去爱身边的人;第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱;

model与modelMap相关推荐

  1. Spring MVC 向页面传值-Map、Model和ModelMap

    2019独角兽企业重金招聘Python工程师标准>>> 除了使用ModelAndView方式外.还可以使用Map.Model和ModelMap来向前台页面创造 使用后面3种方式,都是 ...

  2. SpringMVC框架中ModelAndView、Model、ModelMap的区别与使用

    1. Model Model 是一个接口, 其实现类为ExtendedModelMap,继承了ModelMap类. public class ExtendedModelMap extends Mode ...

  3. Model、ModelMap和ModelAndView的使用详解

    1.前言 最近SSM框架开发web项目,用得比较火热.spring-MVC肯定用过,在请求处理方法可出现和返回的参数类型中,最重要就是Model和ModelAndView了,对于MVC框架,控制器Co ...

  4. Model和ModelMap的区别,以及背后那个男人~

    Model和ModelMap的区别 在彻彻底底的理解他们之前,首先了解复习一下java.util.Map接口.它有四个实现类,分别是 HashMap ,Hashtable ,LinkedHashMap ...

  5. java model类作用_SPRING框架中ModelAndView、Model、ModelMap区别及详细分析

    注意:如果方法声明了注解@ResponseBody ,则会直接将返回值输出到页面. 首先介绍ModelMap[Model]和ModelAndView的作用 Model 是一个接口, 其实现类为Exte ...

  6. Spring中Model、ModelMap、ModelAndView理解和具体使用总结

    在了解这三者之前,需要知道一点:SpringMVC在调用方法前会创建一个隐含的数据模型,作为模型数据的存储容器, 成为"隐含模型". 也就是说在每一次的前后台请求的时候会随带这一个 ...

  7. Model、ModelMap、Map有什么关系?深入底层剖析

    Model.ModelMap.Map有什么关系? 首先为形参赋值的对象是同一个对象,也就是BindingAwareModelMap Model是一个接口 操作模型数据最顶层的接口 Map就是JDK中的 ...

  8. 前端接modelmap的list_怎么使用Model、ModelMap和ModelAndView

    在SpringMVC中,调用方法前会先创建一个隐含的数据模型,作为模型数据的存储容器. 也就是说在每次的前后端请求时,会携带一个背包,不管你有没有用到,这个背包是存在的,用来存放我们交互的数据的值 有 ...

  9. SpringMVC 通过Map、Model和ModelMap向页面传值

    这3种方式,都是在方法参数中,指定一个该类型的参数. @RequestMapping("/test") public String test(Map<String,Objec ...

  10. Model和ModelMap的关系

    在我个人debug时,发现两个是一样的BindingAwareModelMap BindingAwareModelMap继承自:ExtendedModelMap ExtendedModelMap继承M ...

最新文章

  1. 第四代自动泊车从APA到AVP技术
  2. XI 安装MS SQLSERVER JDBC 驱动
  3. Python django解决跨域请求的问题
  4. 从零打造 Vue 聊天组件
  5. HibernateProxy. Forgot to register a type adapter?
  6. wps里为什么没有华文楷体_是谁动了我的字体?为什么Word或PPT换台电脑打开字体就变了呢?...
  7. 树莓派教程 - 2.1 树莓派USB摄像头 树莓派罗技免驱摄像头 fswebcam常用参数
  8. linux 查找py文件命令_Linux文件查找
  9. arm9芯片包括哪些?arm9如何应用?
  10. python打砖块游戏算法设计分析_基于pygame的打砖块游戏,做到一半,不带做了
  11. 张馨予一幅画拍出几十万,然而范冰冰却一直在向粉丝要画!
  12. 使用pynput监听键盘组合键
  13. 蓝桥杯及其搜索算法总结
  14. 【爬虫——00004】蜘蛛技能学习
  15. 怎么更新opengl.dll文件_iOS 13更新体验:测试版升级教程!
  16. lol国服服务器最新人口排名,2020lol大区人数排名,lol服务器人数
  17. asp.Net Core 多线程之Task轻松学,快速上手
  18. 老人自制6门红衣大炮抗强拆 被指涉嫌违法
  19. JDO及相关资源介绍
  20. JIR、进程池和线程池

热门文章

  1. linux卸载软件的命令,「Ubuntu命令」常用安装软件和卸载软件包命令
  2. 【毕业设计】Java SpringBoot农村留守儿童爱心帮扶平台
  3. ffmpeg ios无声音 视频合成声音没有声音
  4. Windows 10分辨率怎么设置?
  5. 云顶之弈 福星阵容吃鸡
  6. go mysql transfer_部署运行 · go-mysql-transfer产品手册 · 看云
  7. 2019年7月常用浏览器的User-Agent
  8. Element-ui el-image图片时而加载失败时而加载成功
  9. JT808-2019和JT809-2019国标开发
  10. 抖音测试美甲软件,几款抖音最火美甲图片 最新网红美甲图案