参数绑定,简单来说就是客户端发送请求,而请求中包含一些数据,那么这些数据怎么到达Controller?这在实际项目开发中也是用到的最多的,那么SpringMvc的参数绑定是怎么实现的呢?下面我们来详细的讲解。
在SpringMvc中,提交请求的数据是通过方法形参来接收的。从客户端请求的key/value数据,经过参数绑定,将key/value数据绑定到Controller的形参上,然后在Controller就可以直接使用该形参。
在SpringMvc早期版本使用PropertyEditor(只能将字符串转成java对象)后期使用converter(进行任意类型的转换)。
SpringMvc提供了很多converter(转换器)在特殊情况下需要自定义converter
比如对日期数据绑定需要自定义converter
SpringMvc有支持的默认参数类型。我们直接在形参上给出这些默认类型的声明,就能直接使用。如下:
1)HttpServletRequest对象
2)HttpServletResponse对象
3)HttpSession对象
4)Model/ModelMap对象
这里我们重点说一下Model/ModelMap,ModelMap是Model接口的一个实现类,作用是将Model数据填充到request域,即使使用Model接口,其内部绑定还是由ModelMap来实现。
哪些是基本数据类型,我们这里重新总结一下:
1) byte 占用一个字节,取值范围为 -128~127,默认是"\u0000",标示空
2)short 占用两个字节,取值范围为-32768~32767
3)int 占用四个字节,取值范围为,-2147483648~2147483647
4)long 占用八个字节 ,对long类型变量赋值必须加上"L"或"l",否则不认为是long型
5)float 占用四个字节,对 float 型进行赋值的时候必须加上“F”或“f”,如果不加,会产生编译错误,因为系统自动将其定义为 double 型变量。double转换为float类型数据会损失精度。float a = 12.23产生编译错误的,float a = 12是正确的
6)double 占用八个字节,对double型变量赋值的时候最好加上"D"或"d",但加不加不是硬性规定。
7)char 占用两个字节,在定义字符型变量时,要用单括号括起来
8)boolean 只有两个值"true"和"false",默认值false,不能用0或非0来代替,这点和c语言不同
举个栗子:
只要注意: form 里的name 和Controller的参数名保持一致就可。
如果不想一致怎么办??
@RequestParam(value="usename",required=false) String usename_C ;
加上@RequestParam 注解。只要value值和form的name保持一致。后面的属性名可以自定义。
举个栗子
只要pojo类中有 form 的name属性值,则会自动完成映射。
这样会有一个新问题如果类似下面的情况,绑定结果会是怎样的呢??
测试一下:
可见,两个参数都正常的绑定了。
其实从框架设计上这样的结果也是应该的!!!
今天先到这,明天更新