您的当前位置:首页SpringMVC中的参数绑定总结

SpringMVC中的参数绑定总结

2024-02-11 来源:小侦探旅游网
SpringMVC中的参数绑定总结

众所周知,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⽅法:

@RequestMapping(\"/editItems\")

public String editItems(Model model, Integer id) throws Exception { //根据id查询对应的Items

ItemsCustom itemsCustom = itemsService.findItemsById(id); model.addAttribute(\"itemsCustom\ //通过形参中的model将model数据传到页⾯ //相当于modelAndView.addObject⽅法 return \"/WEB-INF/jsp/items/editItems.jsp\";}

  这是个很简单的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。这就需要我们⾃⼰定义转换器了,这也是这部分的重点,下⾯我们⾃⼰定义⼀个⽇期转换器:

//需要实现Converter接⼝,这⾥是将String类型转换成Date类型

public class CustomDateConverter implements Converter {

@Override

public Date convert(String source) {

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

SimpleDateFormat simpleDateFormat = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\"); try {

//转成直接返回

return simpleDateFormat.parse(source); } catch (ParseException e) {

// TODO Auto-generated catch block e.printStackTrace(); }

//如果参数绑定失败返回null return null; }}

  定义好了转换器后,需要在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中,⽐如:成绩录⼊(录⼊多门课成绩,批量提交),在这⾥我们假设有需求:批量商品修改,在页⾯输⼊多个商品信息,将多个商品信息提交到controller⽅法中,即⼀次性更新多个商品信息。

  所以思路是在扩展类ItemsQueryVo中新添加⼀个List,然后将不同商品的信息都存到这个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类型的属性,如(我随便举个例⼦,跟本例⽆关了)

Public class QueryVo {

private Map itemInfo = new HashMap(); //get/set⽅法..}

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

学⽣信息:

姓名: 年龄: .. .. ..

  我们可以看到,Map的参数绑定传来的是Map中的key,然后value会⾃动绑定到Map中的那个对象的属性中。在controller中的⽅法⾥,形参就直接使⽤QueryVo接收即可,也很简单。

  关于springmvc的参数绑定基本就总结到这了,其实原理都差不多,只是针对于不同的类型,绑定的⽅式有些区别⽽已,多想想多写写,基本就能掌握这些了。

因篇幅问题不能全部显示,请点此查看更多更全内容