springmvc对象绑定参数原理,springmvc参数绑定支持的类型有哪些

  springmvc对象绑定参数原理,springmvc参数绑定支持的类型有哪些

  00-1010前言1。参数绑定过程2。默认支持的类型3。简单类型的绑定4。pojo类型的绑定4.1普通pojo类型4.2。包装POJO类型5的装订。集合类型的绑定5.1数组的绑定5.2列表的绑定5.2映射的绑定摘要

  00-1010众所周知,springmvc是用来处理页面的一些请求,然后通过视图将数据返回给用户。之前的博文都是用静态数据。为了快速上手springmvc,在这篇博文中,我将总结springmvc中前台页面的参数接收方式,也就是springmvc中的参数绑定问题。

  

目录

我们可以回忆一下,在struts2中,在Action中定义了一个成员变量来接收前台的参数,而在springmvc中,接收页面提交的数据是通过方法参数来接收的。通过参数绑定将客户端请求的键/值数据绑定到控制器方法的参数,然后可以在控制器中使用该参数。看看这个过程:

 

  所以,我们知道,是springmvc提供了很多转换器,将页面参数绑定到控制器方法的参数。关于自定义转换器,下面我会提到。大致了解了流程后,我们开始具体总结。

  00-1010在Spring MVC中,有支持的默认绑定类型。也就是说,您可以通过在控制器方法的参数上直接定义默认类型的对象来使用这些对象。

  HttpServletRequest对象HttpServletResponse对象HttpSession对象Model/ModelMap对象在参数绑定的过程中,如果遇到上述类型,将直接绑定。也就是说,我们可以直接在控制器的方法的参数中定义上述类型的参数,springmvc会自动绑定。这里我要说明的是Model/ModelMap对象。Model是接口,Modelmap是接口实现。它的功能是将模型数据填充到请求域中,类似于ModelAndView。关于它的用法,下面我会和简单的类型参数绑定一起讲。

  00-1010总结这个,我们以需求为例,比较容易理解。我们假设现在有一个需求:根据商品的id修改对应的商品信息。所以,首页必须传入产品的id,然后springmvc的控制器会对其进行处理,返回一个修改产品信息的页面。关于首页的一切都很简单,我就不贴代码了。主要部分是图片,具体代码在文末有下载地址。

  前台通过url传递参数,请求是editItems.action

  在下面的控制器中编写editItems方法:

  @ request mapping(/Edit Items )Public String Edit Items(Model Model,Integer id)throws exception {//根据ID查询对应的Items Items Custom=Items service . findeditemsbyid(ID);model . add attribute( items custom ,items custom);//通过参数中的模型将模型数据传递给页面。//这相当于modelAndView.addObject方法的返回“/we b-INF/JSP/items/edit items . JSP”;}这是一个非常简单的演示。从上面的代码可以看出,model可以直接作为参数使用。springmvc会默认绑定,然后用model把查询到的数据放到请求字段,这样就可以从前台页面检索到了。

  请注意,在简单类型绑定中,方法参数中的参数名称必须与从前台传入的名称相同,才能完成参数的绑定。那么有人要问了,如果有特殊需求(比如可读性更好?),这里定义的参数名只是不同而已,那又如何?有解决办法吗?是啊!我们可以使用注释@RequestParam将参数绑定到简单类型,如下所示:

  因此,如果不使用@RequestParam,则传入request的参数名称必须与控制器方法的参数名称一致,这样绑定才能成功。如果使用@requestParam,就不需要限制Request传入的参数名与控制器方法的参数名一致。指定参数是否必须通过@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<String, Date> { @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呢?在前面的博文中我也有提到,这种组合的设计方法对于后期程序的扩展很有用,比如复杂的查询条件就需要包装到这种包装类型中。

 

  那么该如何绑定呢?有两个思路:

  

在形参中添加HttpServletRequest request参数,通过request接收查询条件参数。在形参中让包装类型的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类型的属性,如(我随便举个例子,跟本例无关了)

 

  

Public class QueryVo {private Map<String, Student> itemInfo = new HashMap<String, Student>(); //get/set方法..}

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

 

  

<tr> <td>学生信息:</td> <td> 姓名:<input type="text" name="itemInfo[name]"/> 年龄:<input type="text" name="itemInfo[price]"/> .. .. .. </td></tr>

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

 

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

  学习笔记源码下载地址:https://github.com/eson15/SpringMVC_Study

  

 

  

总结

到此这篇关于SpringMVC中参数绑定问题的文章就介绍到这了,更多相关SpringMVC参数绑定内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: