前端页面 向 Controller 方法传参为对象 时的问题

        后端 Conroller 方法 接收参数为对象的情况非常常见,但是前端传递过来的参数,直接是一个对象类型很少见,当然也有相应的方法实现 前端传递对象类型并且实现接收(比如使用 @RequestBody注解),可以自行百度。这里要讲的问题是,当前端 向 后端传参为 对象类型时,后端接受参数也为对象时,不做一些处理,从而产生的误区。

前端代码

<!-- Page类是没有重写toString()方法的类,Order类是重写了toString()方法的类 -->
<a title="删除" th:href="@{/test(order=${order},page=${page})}">
    <i class="layui-icon">&#xe640;</i>
</a>

后端代码

//	Page类是没有重写toString()方法的类,Order类是重写了toString()方法的类
@RequestMapping("/test")
public String test(Order order,Page<Order> page,Integer integer,HttpServletRequest request){
    System.out.println("page="+page);
    System.out.println("pageNum="+pageNum);
    System.out.println("Total="+page.getTotal());
    System.out.println("Size="+page.getSize());
    System.out.println("===========================================");
    System.out.println("order="+order);
    System.out.println("order.id="+order.getId());
    System.out.println("order.carNum="+order.getCarNum());
    System.out.println("===========================================");
    System.out.println("Integer integer="+integer);
    System.out.println("===========================================");
    System.out.println("getQueryString()="+request.getQueryString());	// 获取请求中所有的请求参数
    System.out.println("getParameter(\"page\")="+request.getParameter("page"));
    System.out.println("getParameter(\"order\")="+request.getParameter("order"));
    System.out.println("getParameter(\"integer\")="+request.getParameter("integer"));
    return "forward:/order-list?pageNum=1";	// 跳转页面,无关紧要
}

情况1:请求路径为  localhost:8080/test?page=com.baomidou.mybatisplus.extension.plugins.pagination.Page@5fb02092 时

page=com.baomidou.mybatisplus.extension.plugins.pagination.Page@4228e0de
pageNum=1
Total=0
Size=10
===========================================
order=Order(id=null, uid=null, carNum=null, entryTime=null, leaveTime=null, totalTime=null, chargeStandard=null, totalCost=null)
order.id=null
order.carNum=null
===========================================
Integer integer=null
===========================================
getQueryString()=page=com.baomidou.mybatisplus.extension.plugins.pagination.Page@5fb02092
getParameter("page")=com.baomidou.mybatisplus.extension.plugins.pagination.Page@5fb02092
getParameter("order")=null
getParameter("integeter")=null

情况2:请求路径为 localhost:8080/test?order=123&page=123&integer=123) 时

page=com.baomidou.mybatisplus.extension.plugins.pagination.Page@5ea01392
pageNum=1
Total=0
Size=10
===========================================
order=Order(id=null, uid=null, carNum=null, entryTime=null, leaveTime=null, totalTime=null, chargeStandard=null, totalCost=null)
order.id=null
order.carNum=null
===========================================
Integer integer=123
===========================================
getQueryString()=order=123&page=123&integer=123
getParameter("page")=123
getParameter("order")=123
getParameter("integer")=123

结论:

1、前端向后端传输对象时,调用了对象的toString()方法,
    所以没有重写toString()的Page类是
com.baomidou.mybatisplus.extension.plugins.pagination.Page@5fb02092
    有重写toString()方法的Order类是
Order(id=1505415870636150789, uid=15, carNum=null, entryTime=null, leaveTime=null, totalTime=null, chargeStandard=null, totalCost=null)

2、在不使用 @RequestBody 等注解的情况下,不带参数 或者 参数为 字符串等 数值给后端为对象类型的接收参数,
都会使用无参构造方法创造一个对象,而不是像 Integer 等 包装类 会为 null 值。
Page对象的pageNum=1 Size=10等都是因为默认值就是这个。

3、可以注意到在 情况1 中,前端传递的Page对象地址为@5fb02092,后端接收的Page对象地址为@4228e0de,那为什么他们会不一样呢?
    因为 前端 传递的@5fb02092 和情况2中的 page=123 都只能算是一个字符串,不要被情况1给迷惑了,所以后端都给Page这个对象类型的对象用无参方法创建了一个对象。

4、由以上可以知道,就算有 重写toString()方法的Order类,传递的值为order=Order(id=1505415870636150789, uid=15, carNum=null, entryTime=null, leaveTime=null, totalTime=null, chargeStandard=null, totalCost=null),
也只能算是一个字符串字符串时无法直接转换为对象的,所以又用无参构造方法创建了一个对象,
这也就解释了为什么传过来的order对象id=1505415870636150789,uid=15,而接收到的order对象实际却都是null。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值