后端 Conroller 方法 接收参数为对象的情况非常常见,但是前端传递过来的参数,直接是一个对象类型很少见,当然也有相应的方法实现 前端传递对象类型并且实现接收(比如使用 @RequestBody注解),可以自行百度。这里要讲的问题是,当前端 向 后端传参为 对象类型时,后端接受参数也为对象时,不做一些处理,从而产生的误区。
前端代码
<!-- Page类是没有重写toString()方法的类,Order类是重写了toString()方法的类 -->
<a title="删除" th:href="@{/test(order=${order},page=${page})}">
<i class="layui-icon"></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。