您好,欢迎来到划驼旅游。
搜索
您的当前位置:首页SpringMVC数据绑定概述及原理详解

SpringMVC数据绑定概述及原理详解

来源:划驼旅游
SpringMVC数据绑定概述及原理详解

数据绑定概述

在执⾏程序时,Spring MVC根据客户端请求参数的不同,将请求消息中的信息以⼀定的⽅式转换并绑定到控制器类的⽅法参数中。

这种将请求消息数据与后台⽅法参数建⽴连接的过程就是 Spring MVC中的数据绑定。

在数据绑定过程中,Spring MVC框架会通过数据绑定组件(DataBinder)将请求参数串的内容进⾏类型转换,然后将转换后的值赋给控制器类中⽅法的形参,这样后台⽅法就可以正确绑定并获取客户端请求携带的参数。具体的信息处理过程的步骤如下。

(1)Spring MVC将ServletRequest对象传递给 DataBinder。(2)将处理⽅法的⼊参对象传递给 DataBinder。

(3) DataBinder调⽤ConversionService组件进⾏数据类型转换、数据格式化等⼯作,并将 ServletRequest对象中的消息填充到参数对象中。

(4)调⽤Validator组件对已经绑定了请求消息数据的参数对象进⾏数据合法性校验。

(5)校验完成后会⽣成数据绑定结果 BindingResult对象,Spring MVC会将BindingResult对象中的内容赋给处理⽅法的相应参数。

根据客户端请求参数类型和个数的不同,将 Spring Mvc中的数据绑定主要分为简单数据绑定和复杂数据绑定1.简单数据绑定绑定默认数据类型UserController.java:

package com.ssm.controller;

import javax.servlet.http.HttpServletRequest;import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;@Controller

public class UserController {

@RequestMapping(value=\"/selectUser\")

public String selectUser(HttpServletRequest request) { String id=request.getParameter(\"id\"); System.out.println(\"id=\"+id); return \"success\"; }}

使⽤注解⽅式定义了⼀个控制器类,同时定义了⽅法的访问路径。在⽅法参数中使⽤了HttpServletRequest类型,并通过该对象的 getParameter()⽅法获取了指定的参数。为了⽅便查看结果,将获取的参数进⾏输出打印,最后返回⼀个名为“success”的视图,Spring MVC会通过视图解析器在“WEB-INF/jsp”路径下寻找“success.jsp”⽂件。绑定简单数据类型

简单数据类型的绑定,就是指Java中⼏种基本数据类型的绑定,如int、String、Double等类型。

@RequestMapping(value=\"/selectUser\")public String selectUser(Integer id) {System.out.println(\"id=\"+id);return \"success\";}

与默认数据类型案例中的 selectUser()⽅法相⽐,此⽅法中只是将 HttpServletrEquest参数类型替换为了 Integer类型。@RequestParam注解主要⽤于对请求中的参数进⾏定义,在使⽤时可以指定它的4个属性,具体如表12.1所⽰。绑定POJO类型

在使⽤简单数据类型绑定时,可以很容易地根据具体需求来定义⽅法中的形参类型和个数,然⽽在实际应⽤中,客户端请求可能会传递多个不同类型的参数数据,如果还使⽤简单数据类型进⾏绑定,那么就需要⼿动编写多个不同类型的参数,这种操作显然⽐较烦琐。此时就可以使⽤POJO类型进⾏数据绑定。

POJO类型的数据绑定就是将所有关联的请求参数封装在⼀个POJO中,然后在⽅法中直接使⽤该POJO作为形参来完成数据绑定。

@RequestMapping(\"/toRegister\") public String toRegister() { return \"register\"; }

@RequestMapping(\"/registerUser\") public String registerUser(User user) { String username=user.getUserName(); String password=user.getPassword();

System.out.println(\"username=\"+username); System.out.println(\"password=\"+password); return \"success\"; }

绑定包装POJO

使⽤简单POJO类型已经可以完成多数的数据绑定,但有时客户端请求中传递的参数会⽐较复杂。例如,在⽼师查询学⽣时,页⾯传递的参数可能包括班级名称和学⽣号等信息,这就包含了班级和学⽣两个对象的信息。如果将班级和学⽣的所有查询条件都封装在⼀个简单POJO中,显然会⽐较混乱,这时就可以考虑使⽤包装POJO类型的数据绑定。

所谓的包装POJO,就是在⼀个POJO中包含另⼀个简单POJO。例如,在学⽣对象中包含班级对象。这样在使⽤时,就可以通过学⽣查询到班级信息。StudentController. java:

package com.ssm.controller;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;import com.ssm.po.Banji;import com.ssm.po.Student;@Controller

public class StudentController { //向学⽣查询页⾯跳转

@RequestMapping(\"/tofindStudentWithBanji\") public String tofindStudentWithBanji(){ return \"student\"; }

//查询学⽣和班级信息

@RequestMapping(\"/findStudentWithBanji\")

public String findStudentWithBanji(Student student){ Integer stu_id=student.getStu_id(); Banji banji=student.getBanji();

String banji_name=banji.getBanji_name(); System.out.println(\"stu_id=\"+stu_id);

System.out.println(\"banji_name=\"+banji_name); return \"success\"; }}

复杂数据绑定

复杂的数据绑定问题,⽐如数组的绑定、集合的绑定绑定数组

CourseController.java:

package com.ssm.controller;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;@Controller

public class CourseController { @RequestMapping(\"/toCourse\") public String toCourse(){ return \"course\"; }

@RequestMapping(\"/deleteCourse\")

public String deleteCourse(Integer[] ids){ if(ids!=null){

//使⽤输出语句模拟已经删除的课程 for(Integer id:ids){

System.out.println(\"删除了id为\"+id+\"的课程\"); } }else{

System.out.println(\"ids=null\"); }

return \"success\"; }}

绑定集合

在项⽬中,前端请求传递过来的数据可能就会批量包含各种类型的数据,如 Integer、String等。这种情况使⽤数组绑定是⽆法实现的。针对这种情况,可以使⽤集合数据绑定,即在包装类中定义⼀个包含对象类的集合,然后在接收⽅法中将参数类型定义为该包装类的集合。UserController.java:

//向⽤户批量修改页⾯跳转

@RequestMapping(\"/toUserEdit\") public String toUserEdit() { return \"user_edit\"; }

//接收批量修改⽤户的⽅法

@RequestMapping(\"/editUsers\")

public String editUsers(UserVo userList){ //将所有⽤户数据封装到集合中

List users=userList.getUsers(); for(User user:users){ if(user.getId()!=null){

System.out.println(\"删除了id为\"+user.getId()+\"的⽤户名为\"+user.getUsername()); } }

return \"success\"; }

以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo6.com 版权所有 湘ICP备2023023988号-11

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务