SpringMVC中数据绑定

介绍

在执行程序的时候,SpringMVC回根据客户端请求参数的不同,将请求消息中的信息以一定的方式转换并绑定到控制器类的方法参数中,这种将请求消息数据与后台方法参数建立连接的过程就是SpringMVC中的数据绑定

在数据绑定的过程中,Spring MVC 框架会通过数据绑定组件(DataBinder)将请求参数串的内容进行类型转换,然后将转换后的值赋给控制器类中的方法的形参,这样后台方法就可以正确绑定并获取客户端中请求携带的参数了

一个ServletRequest传入进来,所经过的处理步骤如下

  1. Spring MVC 将ServletRequest对象传递给DataBinder
  2. 将处理方法的入参对象传递给DataBinder
  3. DataBinder调用ConversionService组件进行数据类型的转换,数据格式化的等工作,并且将ServletRequest对象中的消息填充到参数对象中
  4. 调用Validator组件对已经绑定了请求消息数据的参数对象进行数据合法性的校验
  5. 校验完成后会生成数据绑定结果BindingResult对象,SpringMVC会将BindingResult对象中的内容赋给处理方法的相应参数

简单数据绑定

绑定默认数据类型

当前端请求的参数比较简单时,可以在后台方法的形参中直接使用SpringMVC提供的默认参数类型进行数据绑定

常用的默认参数类型:

  1. HttpServletRequest:通过request对象获取请求信息
  2. HttpServletResponse:通过response对象处理响应信息
  3. HttpSeesion:通过session对象得到session中储存的对象
  4. Model/ModeMap:Model是一个接口,ModelMap是一个接口的实现,作用是将model数据填充到request的作用域

例子

我们新建一个控制器类UserController

@Controller
@RequestMapping("/User")
public class UserController {

    @RequestMapping("/selectUser")
    public String selectUser(HttpServletRequest request){
        String id = request.getParameter("id");
        System.out.println(id);
        request.setAttribute("id",id);
        return "user";
    }

    //简单绑定
    @RequestMapping("/selectSimple")
    public String selectUserBySimple(int id,HttpServletRequest request){
        System.out.println(id);
        request.setAttribute("idnew",id);
        return "user";
    }
}

需要对应的是user.jsp

<%--
  Created by IntelliJ IDEA.
  User: Seale
  Date: 2019.03.15
  Time: 15:21
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>查询信息</title>
</head>
<body>
request对象绑定:id:${requestScope.id}<br>
简单绑定:id:${requestScope.idnew}
</body>
</html>

之后我们可以运行测试结果

运行结果

这个只是我多访问了几次,emmm造成了输出了很多个1,大家别介意

绑定POJO类型

简单POJO绑定

在使用简单数据类型绑定的时候,可以很容易的根据具体需求来定义方法中的形参类型和个数,然而在实际应用中,客户端请求可能会传递多个不同类型的参数数据,如果还是使用简单数据类型进行绑定,那么久需要手动编写多个不同类型的参数,这种操作模式,在这种业务背景下看来,那么就是相对繁琐的了!所以此时就可以使用POJO类型进行数据绑定

POJO类型的数据绑定就是讲所有关联的请求参数封装在一个POJO中,然后再方法中直接使用该POJO作为形参来完成数据绑定

下面我们来看一个例子

@RequestMapping(value = "/register",method = RequestMethod.POST)
    public String registerUser(User user,HttpServletRequest request){
        String userName = user.getUserName();
        String passWord = user.getPassWord();
        System.out.println(userName+"\n"+passWord);
        request.setAttribute("userName",userName);
        request.setAttribute("passWord",passWord);
        return "views/register.jsp";
    }

以上我们定义了一个registerUser方法,我们接收了一个User对象参数

以下是User对象

package eendtech.po;

import lombok.Getter;
import lombok.Setter;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * Date:2019.03.15
 * Author:Seale
 */
@Getter
@Setter
public class User {
    private int id ;
    private String userName ;
    private String passWord;

}

在这里我们使用了一个lombok中的jar包,可以快速使用注解来让插件包帮助我们构建setter和getter方法

以上放出Lombok的官网,你可以在这里获取jar包,如果你懂得Maven构建,那么我相信获得Lombok对于你来说是再简单不过的了!

绑定包装POJO数据

预期场景,客户端请求中传递的参数比较复杂,例如在用户查询订单的时候,页面传递的参数可能包括订单编号,用户名称等信息,这就包含了订单和用户两个对象的信息,如果将订单和用户的所有查询条件都封装在一个鉴定单的POJO中,显然会比较混乱,也不符合开发的逻辑,这个时候我们就可以考虑使用包装POJO类型的数据绑定

那么什么是包装POJO呢?就是指在一个POJO中包含另一个简单的POJO我们看一个例子

//包装POJO对象
    @Setter
    @Getter
public class Orders {
    private int id ;//订单编号
    private User user ;//用户POJO对象
}

那么这么就完成了对一个简单POJO对象的包装,我们可以通过Orders对象获得包含在其中的User对象

在使用中,客户端通过请求Orders对象就能获取到用户信息,而不需要再一次发送请求!

实例

说了那么多理论,我相信你已经对复杂POJO对象的包装有了了解,那么我们通过一个例子来巩固一下吧

在views文件夹下新建一个orders.jsp文件,在Controller包下面新建一个OrdersController类

orders.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form method="post" action="">
    订单编号:<input type="text" name="id"><br>
    所属用户:<input type="text" name="user.userName"><br>
    <input type="submit" value="查询">
</form>
</body>
</html>

OrdersController

@Controller
@RequestMapping("orders")
public class OrdersController {
    @RequestMapping("selectOrders")
    public String selectOrdersByUser(Orders orders){
        int id = orders.getId();
        User user = orders.getUser();
        String userName = user.getUserName();
        System.out.println("id->"+id+"\nuserName->"+userName);
        return "views/orders.jsp";
    }
    @RequestMapping("orders")
    public String findOrdersView(){
        return "views/orders.jsp";
    }
}

运行结果


本作品采用知识共享署名 4.0 国际许可协议进行许可。

如果可以的话,请给我钱请给我点赞赏,小小心意即可!

Last modification:April 27, 2019
If you think my article is useful to you, please feel free to appreciate