Spring MVC数据绑定概述及原理详解

 更新时间:2020年06月29日 10:13:41   作者:曾强  
这篇文章主要介绍了Spring MVC数据绑定概述及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

数据绑定概述

在执行程序时,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<User> users=userList.getUsers();
		for(User user:users){
			if(user.getId()!=null){
				System.out.println("删除了id为"+user.getId()+"的用户名为"+
user.getUsername());
			}
		}
		return "success";
	}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot实现application.yml文件敏感信息加密

    SpringBoot实现application.yml文件敏感信息加密

    本文主要介绍了SpringBoot实现application.yml文件敏感信息加密,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Quartz+Spring Boot实现动态管理定时任务

    Quartz+Spring Boot实现动态管理定时任务

    最近做项目遇到动态管理定时任务的需求,刚拿到这个需求还真不知道从哪下手,经过一番思考,终于找出实现思路,接下来通过本文给大家介绍了Quartz+Spring Boot实现动态管理定时任务的相关知识,需要的朋友可以参考下
    2018-09-09
  • 浅析Mysql中的视图

    浅析Mysql中的视图

    这篇文章主要介绍了浅析Mysql中的视图,视图是从一个或者多个表中导出的表,视图的行为与表非常相似,在视图中用户可以使用SELECT语句查询数据,以及使用INSERT、UPDATE和DELETE修改记录,需要的朋友可以参考下
    2023-05-05
  • SpringBoot+Vue项目新手快速入门指南

    SpringBoot+Vue项目新手快速入门指南

    最近刚刚做了一个基于vue+springboot的系统,于是基于这点,对遇到的一些问题进行一些配置的汇总,下面这篇文章主要给大家介绍了关于SpringBoot+Vue项目新手快速入门的相关资料,需要的朋友可以参考下
    2022-06-06
  • IntelliJ Idea 2020.1 正式发布,官方支持中文(必看)

    IntelliJ Idea 2020.1 正式发布,官方支持中文(必看)

    这篇文章主要介绍了IntelliJ Idea 2020.1 正式发布,官方支持中文了,本文通过截图的形式给大家展示,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • SpringSecurityOAuth2实现微信授权登录

    SpringSecurityOAuth2实现微信授权登录

    微信的登录功能是用户注册和使用微信的必经之路之一,而微信授权登录更是方便了用户的登录操作,本文主要介绍了SpringSecurityOAuth2实现微信授权登录,感兴趣的可以了解一下
    2023-09-09
  • springboot+shiro+jwtsession和token进行身份验证和授权

    springboot+shiro+jwtsession和token进行身份验证和授权

    最近和别的软件集成项目,需要提供给别人接口来进行数据传输,发现给他token后并不能访问我的接口,拿postman试了下还真是不行,检查代码发现项目的shiro配置是通过session会话来校验信息的,修改代码兼容token和session
    2024-06-06
  • 解决Spring Security的权限配置不生效问题

    解决Spring Security的权限配置不生效问题

    这篇文章主要介绍了解决Spring Security的权限配置不生效问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 解决bufferedReader.readLine()读到最后发生阻塞的问题

    解决bufferedReader.readLine()读到最后发生阻塞的问题

    这篇文章主要介绍了解决bufferedReader.readLine()读到最后发生阻塞的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 关于Java父类没有无参构造方法子类处理方法

    关于Java父类没有无参构造方法子类处理方法

    父类无参构造方法,子类不写,其实会默认调用父类的无参构造方法也就是用super(),编译运行后,会打印出"子类会调用Father的第一个构造方法,这篇文章给大家介绍关于Java父类没有无参构造方法子类处理方法,感兴趣的朋友一起看看吧
    2024-01-01

最新评论