参数绑定——SpringMVC框架系列教程(4)

Java技术 潘老师 3年前 (2021-03-08) 964 ℃ (0) 扫码查看

1、参数绑定含义

参数绑定,简单来说就是客户端发送请求,而请求中包含一些数据,那么这些数据怎么到达 Controller ?这在实际项目开发中也是用到的最多的,那么 SpringMVC 的参数绑定是怎么实现的呢?下面我们来详细的讲解。

2、SpringMVC 参数绑定

在 SpringMVC 中,提交请求的数据是通过方法形参来接收的。从客户端请求的 key/value 数据,经过参数绑定,将 key/value 数据绑定到 Controller 的形参上,然后在 Controller 就可以直接使用该形参。

 3、默认支持的类型

SpringMVC 有支持的默认参数类型,我们直接在形参上给出这些默认类型的声明,就能直接使用了。如下:

  • HttpServletRequest 对象
  • HttpServletResponse 对象
  • HttpSession 对象
  • Model/ModelMap 对象 

1)Controller 代码:
参数绑定——SpringMVC框架系列教程(4)
2)表单代码:
参数绑定——SpringMVC框架系列教程(4)
3)然后访问,页面显示如下:
参数绑定——SpringMVC框架系列教程(4)
这里我们重点说一下 Model/ModelMap,ModelMap是Model接口的一个实现类,作用是将Model数据填充到request域,即使使用Model接口,其内部绑定还是由ModelMap来实现

4、基本数据类型的绑定

哪些是基本数据类型,我们这里重新总结一下: 

一、byte,占用一个字节,取值范围为 -128-127,默认是“\u0000”,表示空
二、short,占用两个字节,取值范围为 -32768-32767
三、int,占用四个字节,-2147483648-2147483647
四、long,占用八个字节,对 long 型变量赋值时必须加上”L”或“l”,否则不认为是 long 型
五、float,占用四个字节,对 float 型进行赋值的时候必须加上“F”或“f”,如果不加,会产生编译错误,因为系统
自动将其定义为 double 型变量。double转换为float类型数据会损失精度。float a = 12.23产生编译错误的,float a = 12是正确的
六、double,占用八个字节,对 double 型变量赋值的时候最好加上“D”或“d”,但加不加不是硬性规定
七、char,占用两个字节,在定义字符型变量时,要用单引号括起来
八、boolean,只有两个值“true”和“false”,默认值为false,不能用0或非0来代替,这点和C语言不同

我们以 int 类型为例:

1)JSP 页面代码:
参数绑定——SpringMVC框架系列教程(4)
2)Controller 代码:
参数绑定——SpringMVC框架系列教程(4)
结果是 打印出了表单里面的 value 的值。
注意:表单中input的name值和Controller的参数变量名保持一致,就能完成数据绑定。那么如果不一致呢?我们使用 @RequestParam 注解来完成,如下:
JSP页面代码不变,保持原样,Controller 代码如下:
参数绑定——SpringMVC框架系列教程(4)
使用注解 @RequestParam ,我们可以使用任意形参,但是注解里面的 value 属性值要和表单的name属性值一样。
 

问题:我们这里的参数是基本数据类型,如果从前台页面传递的值为 null 或者 “”的话,那么会出现数据转换的异常,就是必须保证表单传递过来的数据不能为null或””,所以,在开发过程中,对可能为空的数据,最好将参数数据类型定义成包装类型,具体参见下面的例子。

5、包装数据类型的绑定

包装类型如Integer、Long、Byte、Double、Float、Short,(String 类型在这也是适用的)这里我们以 Integer 为例
1)Controller 代码为:
参数绑定——SpringMVC框架系列教程(4)
和基本数据类型基本一样,不同之处在于,表单传递过来的数据可以为null或””,以上面代码为例,如果表单中num为””或者表单中无num这个input,那么,Controller方法参数中的num值则为null。

6、POJO(实体类)类型的绑定

1)新建User.java
参数绑定——SpringMVC框架系列教程(4)
2)JSP页面:
注意输入框的 name 属性值和上面 POJO 实体类的属性保持一致即可映射成功。
参数绑定——SpringMVC框架系列教程(4)

注意看:这里面我们数据都写死了,直接提交。有Integer类型的,String类型的,Date类型的。

3)Controller :
参数绑定——SpringMVC框架系列教程(4)
4)然后测试,发现正常获取到了用户信息

7、复合POJO(实体类)类型的绑定

1)这里我们增加一个实体类,ContactInfo.java
参数绑定——SpringMVC框架系列教程(4)
2)然后在上面的User.java中增加一个属性 private ContactInfo contactInfo,生成get/set,重写toString。
参数绑定——SpringMVC框架系列教程(4)
3)JSP 页面:
注意属性name的命名,User.java 的复合属性名.字段名
参数绑定——SpringMVC框架系列教程(4)
4) Controller:
参数绑定——SpringMVC框架系列教程(4)
User对象中有ContactInfo属性,但是,在表单代码中,需要使用“属性名(对象类型的属性).属性名”来命名input的name。

8、数组类型的绑定

1)JSP:
参数绑定——SpringMVC框架系列教程(4)
2)Controller
参数绑定——SpringMVC框架系列教程(4)

9、List类型的绑定

1)创建 UserVo.java,封装 List 属性
参数绑定——SpringMVC框架系列教程(4)
2)JSP 页面
参数绑定——SpringMVC框架系列教程(4)
3)Controller
参数绑定——SpringMVC框架系列教程(4)

10、Map类型的绑定

1)首先在 UserVo 里面增加一个属性 Map userMap
参数绑定——SpringMVC框架系列教程(4)
2)JSP页面,注意看 输入框 name 的属性值
参数绑定——SpringMVC框架系列教程(4)
3)Controller 中获取页面的属性
参数绑定——SpringMVC框架系列教程(4)

11、遇到的问题

1)form表单无法提交input输入框属性设置为 disabled 的内容
比如:

<input type="text" disabled="disabled" name="metadataName"   maxlength="50" placeholder="这里输入模型英文名称" title="模型英文名称" "/>

具有 disabled=”disabled” 的属性,提交到 Controller后,metadataName 的值为null

解决办法:

改为 readonly=”readonly”
readonly:针对input(text / password)和textarea有效,在设置为true的情况下,用户可以获得焦点,但是不能编辑,在提交表单时,输入项会作为form的内容提交。
disabled:针对所有表单元素(select,button,input,textarea等),在设置为disabled为true的情况下,表单输入项不能获得焦点,用户的所有操作无意义,在提交表单时,表单输入项不会被提交。
2)中文乱码
在web.xml中配置编码过滤器
参数绑定——SpringMVC框架系列教程(4)


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/java/2334.html
喜欢 (1)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】