springmvc-参数绑定
一.参数绑定过程
》客户端请求的附带参数,通过参数绑定的方式,和方法的形参进行绑定
》绑定的流程:
1.客户端发送带有参数的请求
2.处理器适配器使用springmvc提供的参数绑定组件将上传的参数数据类型转换为方法的形参类型(参数绑定组件是用来转换数据类型的)
* 参数绑定组件:早期springmvc是使用propertyEdit(只能字符串转换Javaduix)参数绑定组件;后期使用converter(字符串转换为任意类型)
* 一把情况下,不需自定义参数绑定组件,springmvc已经提供很多的converter(转换器)给我们使用
* 特殊情况下,比如日期类型的绑定,由于不知道开发者定义日期的格式具体是怎样的,日期的参数绑定组件就固定不下来,需要根据具体情况自定义组件
3.类型转换成功,适配器就可以进行方法参数绑定了
二.简单参数绑定
》controller方法的形参上有默认使用的参数类型,直接在参数列表上书写,方法内部即可使用;比如:
* httpservletRequest,httpservletResponse,httpSession,Model(接口),ModelMap(接口实现类);在参数绑定的过程中,通过反射的机制拿到方法形参类型进行判断,若是前面的类型,则直接参数绑定
@RequestMapping("/editPre")
public ModelAndView editPre(httpServletRequest req,httpServletResponse rep) {}
》简单类型的绑定;简单类型比如有Integer,String等,直接在方法参数列表上定义简单类型,得保证请求的参数名和形参名一致才可绑定成功;如果不一致,又想进行参数绑定,可以使用一个注解@RequestParam,它可以把url的参数跟形参进行绑定,属性value的值为url参数,属性required表示该参数是否必传,属性defaultValue为默认参数值(在参数为空的情况下生效)
@RequestMapping("/editPre")
public ModelAndView editPre(@RequestParam(value="user_id",required = true) Integer id,defaultValue = 1) {}
》pojo类型的绑定;在参数列表定义pojo类,只要保证url各个参数名和pojo类的属性名一致,即可创设置进去
》自定义类型的绑定;像刚才所说的日期类型转换需要我们自定义,经自定义的参数绑定组件后的日期类型得跟方法的日期类型或pojo对象里的日期类型一致
1.适配器需要调用参数绑定组件进行类型转换,所以得给适配器注册我们自定义的组件,在mvc注解标签上加一个属性,如图:
2.conversion-service的值为自定义参数组件的工厂的id,所以我们得在ioc容器中注册参数组件工厂,在工厂里面converters集合中注册我们的转换器
自定义的转换器得实现一个接口Converter,才能算是转换器
三.pojo包装类型绑定
》为什么要使用pojo包装类型来接收参数?如果上传的参数当中包含用户,订单,支付等信息用一个pojo类接收,这个pojo的属性就变得特别杂!通过pojo的包装类型来接收的化,可以起到不同pojo类型的查询条件对象分离开,以及系统的拓展性优化
》现在问题是:如何将页面提交的参数赋到pojo包装类中的pojo对象里的简单属性中,参数-->pojo包装对象-->pojo对象-->简单属性;可以在页面表单标签的name属性值格式设置为“pojo对象名.属性名”,即可提交进去
四.数组类型绑定
1.如果方法参数列表上直接定义数组类型,页面标签name值直接填数组形参名即可
五.list类型绑定
1.list类型绑定有点小特殊,不能把List类型直接暴露在参数列表上,把list对象放到pojo的包装类中,假设list的泛型为pojo类型,list<ItemsCustom>
在页面上的name属性值书写的格式为:"list集合名[索引值].属性名",如图(下面索引写死了):
六.map类型绑定
跟上面从格式上差不多,直接贴图