绑定包装POJO
上一篇博客讲到如何绑定POJO类型的数据,在实际开发过程中我们会遇到很多相对复杂的数据绑定,但是不管变化如何多样,改变不了的是方法的原理。以下是我对于绑定包装POJO的理解,欢迎各位批评指正。
实例讲解
在用户查询订单时,页面传递的参数可能包括订单编号、用户名称等信息。这样就包含了两个对象的信息。如果将订单和用户的所有查询条件都封装在一个简单POJO中,显然会比较混乱,这时就可以考虑使用包装POJO。
1.创建项目导包。需要的jar包在上篇文章中提到过这里就不再详细介绍。
2. 在web.xml中配置前端控制器。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--配置前端控制器-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--表示容器在启动时立即加载Servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<!--"/"表示会将所有的url拦截交给dispatcherservlet处置-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3.创建配置文件dispatcher-servlet.xml这里IDEA已经自动创建完成了。下面需要我们自己编写里边的代码。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描controller层代码-->
<context:component-scan base-package="com.itheima.controller"/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--设置前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--设置后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
4.在src目录下创建一个名为com.itheima.po的包,在该包下创建一个User类来封装用户注册信息创建一个Orders类用于封装订单和用户信息
User.java
package com.ithieima.po;
public class User {
private Integer id;
private String username;//用户名
private Integer password;//密码
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password=" + password +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getPassword() {
return password;
}
public void setPassword(Integer pussword) {
this.password = pussword;
}
}
Orders.java
package com.ithieima.po;
public class Orders {
private Integer ordersId;
//封装User类型的参数
private User user;
@Override
public String toString() {
return "Orders{" +
"ordersId=" + ordersId +
", usr=" + user +
'}';
}
public Integer getOrdersId() {
return ordersId;
}
public void setOrdersId(Integer ordersId) {
this.ordersId = ordersId;
}
public User getUser() {
return user;
}
public void setUser(User usr) {
this.user = usr;
}
}
5.在控制层创建订单控制器类OrdersController
package com.itheima.controller;
import com.ithieima.po.Orders;
import com.ithieima.po.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class OrdersController {
//像订单查询页面跳转
@RequestMapping("/toFindOrdersWithUser")
public String toFindOrdersWithUser(){
return "orders";
}
//订单查询页面,注意findOrdersWithUser中的形参
@RequestMapping("findOrdersWithUser")
public String findOrdersWithUser(Orders orders)
{
Integer ordersId=orders.getOrdersId();
User user=orders.getUser();
String username=user.getUsername();
System.out.println("ordersId="+ordersId);
System.out.println("username="+username);
return "success";
}
}
6.在WEB-INF下创建jsp文件夹,在文件夹中创建一个注册页面orders.jsp以及一个success页面。
orders.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>订单查询</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/findOrdersWithUser" method="post">
订单编号:<input type="text" name="ordersId"/><br/>
所属用户:<input type="text" name="user.username"/><br/>
<input type="submit" value="查询"/>
</form>
</body>
</html>
success界面是结果界面这里不再详细介绍
7.把程序发布到tomcat并且在浏览器里访问http://localhost:8080/study-springmvc-03/toFindOrdersWithUser
需要注意的问题!!!
- 如果查询条件参数是包装类的直接基本属性,则参数名直接用对应的属性名,如上面代码中的ordersId
- 如果查询条件参数是包装类中POJO的子属性,则参数名必须为【对象.属性】,其中对象名要和包装POJO中对象属性名称一致。属性要与其子属性一致。例如上述代码中的user.username。
总结
在数据的复杂绑定中,我认为最重要的一点是前端页面中的数据与后端页面中数据的交互,说白了就是jsp页面和控制器之间的参数传递,其中参数传递的规则一定要牢记,避免出错。如果能详细透彻的掌握数据绑定,在学习前后端分离的时候会达到事半功倍的效果。源码在上一篇博客的末尾。