java mvc 绑定_SpringMVC请求参数绑定

深入理解java虚拟机 jvm高级与佳三

87.8元

包邮

(需用券)

去购买 >

9544978e5b5e461c343f870f1a8ab48a.png

什么是请求参数绑定

请求参数格式

默认是key/value格式,比如:http:xxxx?id=1&type=2

请求参数值的数据类型

都是字符串类型的各种值

请求参数值要绑定的目标类型

Controller类中的方法参数,比如简单类型、POJO类型、集合类型等。

SpringMVC内置的参数解析组件

默认内置了24种参数解析组件(ArgumentResolver)

什么是参数绑定?

就是将请求参数串中的value值获取到之后,在进行类型转换,然后将转换后的值赋值给Controller类中方法的形参,这个过程就是参数绑定

b6872fa18ad1775166e2f10966b43e6e.png

默认支持的参数类型(Servlet API支持)

Controller方法形参中可以随时添加如下类型的参数,处理适配器会自动识别并进行赋值。

HttpServletRequest

通过request对象获取请求信息

HttpServletResponse

通过response处理响应信息

HttpSession

通过session对象获取session中存放的对象

InputStream、OutputStream

Reader、Writer

Model/ModelMap

ModelMap继承自LinkedHashMap,Model是一个接口,它们的底层实现都是同一个类(BindingAwareModelMap),作用就是向页面传递数据,相当于Request的作用,如下

绑定简单数据类型

简单类型参数绑定方式

简单类型指的就是8种基本类型数据以及它们的包装类,还有String类型。

在SpringMVC中,对于java简单类型的参数,推荐的参数绑定方式有两种:

直接绑定

注解绑定

直接绑定

要求

http请求参数的key和controller方法的形参名称一致

请求URL

http://localhose:8080/xxx/findItem?id=1

请求参数的key为id

Controller方法

Controller的形参为Interger id,它和请求参数的key一致,所以直接绑定成功

@RequestMapping(value = "/findItem")publicString findItem(Integer id) {

System.out.println("接收到的请求参数是:"+id);return "success";

}

注解绑定

要求

请求参数key和controller方法的形参名称不一致时,需要使用@RequestParam注解才能将请求参数绑定成功。

请求URL

http://localhost:8080/xxx/findItem?itemId=1

请求参数的key为itemId

Controller方法

Controller的形参为Integer id,它和请求的参数不一致,需要使用@RequestParam注解才能绑定成功

@RequestMapping(value = "/findItem")//通过@RequestParam注解绑定简单类型

public String findItem(@RequestParam("itemId") Integer id) {

System.out.println("接收到的请求参数是:"+id);return "success";

}

RequestParam注解介绍

value:参数名字,即入参的请求参数名字,如value="itemId"表示请求的参数中的名字为itemId的参数的值将传入

required:是否必须,默认是true,表示请求中一定要有响应的参数,否则将报;

http Status 400 - Required Integer parameter 'xxx' is not present

defaultValue:默认值,表示如果请求中没有同名参数时的默认值

@RequestMapping(value = "/findItem")//通过@RequestParam注解绑定简单类型//学习@RequestParam注解中的value、required、defaultValue属性

publicString findItem (

@RequestParam(value= "itemId", required = true, defaultValue = "2") Integer id) {

System.out.println("接收到的请求参数是:"+id);return "success";

}

绑定POJO类型

要求

控制器方法的参数类型是POJO类型。

要求表单中参数名称和POJO类的属性名称保持一致。

请求URL

http://localhost:8080/xxx/updateItem?id=!&name=iphone&price=1000

Controller方法

POJO定义:

d1be0626b491cd39440db297e201afcd.png

Controller方法

@RequestMapping("/updateItem")publicString updateItem(Integer id,Items item) {

System.out.println("接收到的请求参数是:"+id);

System.out.println("接收到的请求参数是:"+item);return "success";

}

绑定包装POJO

包装POJO类,依然是一个POJO,只是说为了方便沟通,将POJO中包含另一个POJO的这种类,称之为包装POJO。

包装对象

public classItemQueryVO {//商品信息

privateItems item;

}

页面定义(item-list.jsp)

查询条件:

商品名称:

Controller方法

f26ca0eff73e1d95294d9f993fd8e78b.png

测试方法:断点跟踪,查看vo中的item对象是否有值

使用简单类型数组接收参数

要求

通过HTTP请求批量传递简单类型数据的情况,Controller方法中可以用String[]或者POJO的String[]属性接收(二选一),但是不能使用集合接收。

请求URL

http://localhost:8080/xxx/deleteItem?id=1&id=2&id=3

Controller方法

@RequestMapping("/deleteItem")publicString deleteitem(Integer[] itemId){return "success";

}

使用POJO类型集合或数组接收参数

要求

批量传递的请求参数,最终要使用List来接收,那么这个List必须放在另一个POJO类中。

接收商品列表的POJO

public classItemQueryVO {//商品信息

privateItem item;//其他信息//商品信息集合

private ListitemsList;

}

请求URL

http://localhost:8080/xxx/batchUpdateItem?itemsList[0].id=1&itemsList[0].name=iphone&itemsList[0].price=1000&itemsList[1].id=2&itemsList[1].name=华为&items[1].price=5000

Controller

@RequestMapping("/batchUpdateItem")publicString batchUpdateItem(ItemQueryVO vo) {return "success";

}

自定义参数绑定

请求URL

http://localhost:8080/xxx/saveItem?date=2019-12-4

Controller方法

@RequestMapping("/saveItem")publicString saveItem(String date){

System.out.println("接收到的请求参数是:"+date);return "success";

}

但是如何将date参数的类型有String改为Date,则报错

自定义Converter

public class DateConverter implements Converter{

@OverridepublicDate convert(String source) {

SimpleDateFormat simpleDateFormat= new SimpleDateFormat("yyyy-MM-dd");try{returnsimpleDateFormat.parse(source);

}catch(ParseException e) {

e.printStackTrace();

}return null;

}

}

配置Converter

在springmvc.xml中,进行以下配置

原文链接:https://www.cnblogs.com/chenyanbin/p/11980465.html

java 11官方入门(第8版)教材

79.84元

包邮

(需用券)

去购买 >

f0f3f55624fb396b1764d42d6df88864.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值