绑定包装POJO
使用简单POJO类型已经可以完成多数的数据绑定,但有时客户端请求中传递的参数会比较复杂。例如,在用户查询订单时,页面传递的参数可能包括:订单编号、用户名称等信息,这就包含了订单和用户两个对象的信息。如果将订单和用户的所有查询条件都封装在一个简单POJO中,显然会比较混乱,这时就可以考虑使用包装POJO类型的数据绑定。
所谓的包装POJO,就是在一个POJO中包含另一个简单POJO。例如,在订单对象中包含用户对象。这样在使用时,就可以通过订单查询到用户信息。
下面通过一个订单查询的案例,来演示包装POJO数据绑定的使用,具体步骤如下。
(1)在chapter13项目的com.itheima.po包中,创建一个订单类Orders,该类用于封装订单和用户信息,编辑后如文件1所示。
文件1 Orders.java
1 package com.itheima.po;
2 /**
3 * 订单POJO
4 */
5 public class Orders {
6 private Integer ordersId; // 订单编号
7 private User user; // 用户POJO,所属用户
8 public Integer getOrdersId() {
9 return ordersId;
10 }
11 public void setOrdersId(Integer ordersId) {
12 this.ordersId = ordersId;
13 }
14 public User getUser() {
15 return user;
16 }
17 public void setUser(User user) {
18 this.user = user;
19 }
20 }
在上述包装POJO类中,定义了订单号和用户POJO的属性及其对应的getter/setter方法。这样订单类中就不仅可以封装订单的基本属性参数,还可以封装User类型的属性参数。
(2)在com.itheima.controller包中,创建一个订单控制器类OrdersController,在该类中编写一个跳转到订单查询页面的方法和一个查询订单及用户信息的方法,文件2所示。
文件2 OrdersController.java
1 package com.itheima.controller;
2 import org.springframework.stereotype.Controller;
3 import org.springframework.web.bind.annotation.RequestMapping;
4 import com.itheima.po.Orders;
5 import com.itheima.po.User;
6 @Controller
7 public class OrdersController {
8 /**
9 * 向订单查询页面跳转
10 */
11 @RequestMapping("/tofindOrdersWithUser")
12 public String tofindOrdersWithUser() {
13 return "orders";
14 }
15 /**
16 * 查询订单和用户信息
17 */
18 @RequestMapping("/findOrdersWithUser")
19 public String findOrdersWithUser(Orders orders) {
20 Integer orderId = orders.getOrdersId();
21 User user = orders.getUser();
22 String username = user.getUsername();
23 System.out.println("orderId="+orderId);
24 System.out.println("username="+username);
25 return "success";
26 }
27 }
在文件2中,通过访问页面跳转方法即可跳转到orders.jsp中,而通过查询订单和用户信息方法,即可通过传递的参数条件去调用Service中的相应方法来查询数据。这里只是为了讲解包装POJO的使用,所以只需将传递过来的参数进行输出。
(3)在/WEB-INF/jsp目录下,创建一个用户订单查询页面orders.jsp,在页面中编写通过订单编号和所属用户作为查询条件来查询订单信息的代码,如文件3所示。
文件3 orders.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
4 "http://www.w3.org/TR/html4/loose.dtd">
5 <html>
6 <head>
7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
8 <title>订单查询</title>
9 </head>
10 <body>
11 <form action="${pageContext.request.contextPath }/findOrdersWithUser"
12 method="post">
13 订单编号:<input type="text" name="ordersId" /><br />
14 所属用户:<input type="text" name="user.username" /><br />
15 <input type="submit" value="查询" />
16 </form>
17 </body>
18 </html>
注意:
在使用包装POJO类型数据绑定时,前端请求的参数名编写必须符合以下两种情况:
1)如果查询条件参数是包装类的直接基本属性,则参数名直接用对应的属性名,如上面代码中的ordersId;
2)如果查询条件参数是包装类中POJO的子属性,则参数名必须为【对象.属性】,其中【对象】要和包装POJO中的对象属性名称一致,【属性】要和包装POJO中的对象子属性一致,如上述代码中的user.username。
(4)将chapter13项目发布到Tomcat服务器并启动,在浏览器中访问地址http://localhost:8080/chapter13/tofindOrdersWithUser
,其显示效果如图1所示。
图1 orders.jsp订单页面
在图1中,填写订单编号为“321654”,所属用户为“小韩”,单击查询按钮后,浏览器会跳转到success.jsp页面,此时控制台中的打印信息如图2所示。
图2 运行结果
从图2可以看出,使用包装POJO同样完成了数据绑定。