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";
	}

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

(0)

相关推荐

  • spring mvc使用@InitBinder标签对表单数据绑定的方法

    在SpringMVC中,bean中定义了Date,double等类型,如果没有做任何处理的话,日期以及double都无法绑定. 解决的办法就是使用spring mvc提供的@InitBinder标签 在我的项目中是在BaseController中增加方法initBinder,并使用注解@InitBinder标注,那么spring mvc在绑定表单之前,都会先注册这些编辑器,当然你如果不嫌麻烦,你也可以单独的写在你的每一个controller中.剩下的控制器都继承该类.spring自己提供了大量的

  • 使用IDEA搭建SSM框架的详细教程(spring + springMVC +MyBatis)

    1 框架组成 Spring SpringMVC MyBatis 2 所需工具 Mysql 8.0.15 ​数据库管理系统,创建数据库 Tomcat 8.5.51 ​用于部署web项目 Maven 3.6.1 ​项目构建.项目依赖管理 lombok 1.18.10(可用可不用工具) ​用于类注解创建setter.getter.无参构造.全参构造.toString等函数 ​注:只导入依赖,不安装插件是不起作用的 3 搭建步骤 3.1 新建一个空Maven项目,填写项目相关信息,完成 3.2 添加we

  • Spring MVC---数据绑定和表单标签详解

    数据绑定和表单标签 数据绑定 数据绑定是将用户输入绑定到领域模型的一种特性,在Spring MVC的controller和view数据传递中,基于HTTP请求的特性,所有HTTP请求参数的类型均为字符串,如果模型领域需要绑定的类型为double或int,则需要手动进行类型转换,而有了数据绑定后,就不需要手动将HTTP请求中的String类型转换为模型需要的类型了,数据绑定的另一个好处是,当输入验证失败时,会重新生成一个HTML表单,无需重新填写输入字段. 表单标签库 表单标签库中包含了可以用在J

  • SpringMVC中利用@InitBinder来对页面数据进行解析绑定的方法

    在使用SpingMVC框架的项目中,经常会遇到页面某些数据类型是Date.Integer.Double等的数据要绑定到控制器的实体,或者控制器需要接受这些数据,如果这类数据类型不做处理的话将无法绑定. 这里我们可以使用注解@InitBinder来解决这些问题,这样SpingMVC在绑定表单之前,都会先注册这些编辑器.一般会将这些方法些在BaseController中,需要进行这类转换的控制器只需继承BaseController即可.其实Spring提供了很多的实现类,如CustomDateEdi

  • SpringMVC实现数据绑定及表单标签

    首先理解数据绑定 为什么要使用数据绑定 基于HTTP特性,所有的用户输入的请求参数类型都是String,比如下面表单: 但我们提交后,为了将请求信息映射到模型中,还需要手动进行格式转换,此外还借助了一个中转对象productForm,其字段名称和Product一模一样,只是类型为String. @RequestMapping(value = "/product_save",method = RequestMethod.POST) public String saveProduct(Pr

  • SpringMVC实现文件上传和下载的工具类

    本文主要目的是记录自己基于SpringMVC实现的文件上传和下载的工具类的编写,代码经过测试可以直接运行在以后的项目中. 开发的主要思路是对上传和下载文件进行抽象,把上传和下载的核心功能抽取出来分装成类. 我的工具类具体代码如下: package com.baosight.utils; import java.io.BufferedInputStream; import java.io.File; import java.io.FileNotFoundException; import java

  • SpringMVC 数据绑定实例详解

    SpringMVC 数据绑定 查看spring源码可以看出spring支持转换的数据类型: org.springframework.beans.PropertyEditorRegistrySupport: /** * Actually register the default editors for this registry instance. */ private void createDefaultEditors() { this.defaultEditors = new HashMap<

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

    数据绑定概述 在执行程序时,Spring MVC根据客户端请求参数的不同,将请求消息中的信息以一定的方式转换并绑定到控制器类的方法参数中. 这种将请求消息数据与后台方法参数建立连接的过程就是 Spring MVC中的数据绑定. 在数据绑定过程中,Spring MVC框架会通过数据绑定组件(DataBinder)将请求参数串的内容进行类型转换,然后将转换后的值赋给控制器类中方法的形参,这样后台方法就可以正确绑定并获取客户端请求携带的参数.具体的信息处理过程的步骤如下. (1)Spring MVC将

  • Spring MVC 拦截器 interceptor 用法详解

    Spring MVC-拦截器 今天就是把有关拦截器的知识做一个总结. 1.拦截器概述 1.1 什么是拦截器? Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以进行权限验证.记录请求信息的日志.判断用户是否登录等. 要使用Spring MVC中的拦截器,就需要对拦截器类进行定义和配置.通常拦截器类可以通过两种方式来定义. 1.通过实现HandlerInterceptor接口,或继承Han

  • spring mvc 组合mybatis框架实例详解

    说明 本项目采用 maven 结构,主要演示了 spring mvc + mybatis,controller 获取数据后以json 格式返回数据. 项目结构 包依赖 与说明 pom文件: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://

  • spring事务Propagation及其实现原理详解

    本文研究的主要是spring事务Propagation及其实现原理,具体介绍如下. 简介 spring目前已是java开发的一个事实标准,这得益于它的便利.功能齐全.容易上手等特性.在开发过程当中,操作DB是非常常见的操作,而涉及到db,就会涉及到事务.事务在平时的开发过程当中,就算没有注意到,程序正常执行不会有副作用,但如果出现了异常,而又没有处理好事务的话,可能就会出现意想不到的结果.spring在事务方面进行了各种操作的封装,特别是声明式事务的出现,让开发变得更加的舒心.spring对事务

  • Spring MVC数据处理和乱码问题详解

    一.数据处理 1.1 处理提交数据 1.1.1 提交的域名称和处理方法的参数名一致 提交数据:http://localhost:8080/hello?name=test 处理方法: @RequestMapping("/hello") public String hello(String name){ System.out.println(name); return "hello"; } 后台输出test 1.1.2 提交的域名称和处理方法的参数名不一致 提交数据:h

  • Spring和Mybatis整合的原理详解

    目录 前言 简单猜想 案例搭建 通过扫描接口 正式开始 setBeanName setApplicationContext afterProperties postProcessBeanDefinitionRegistry 总结 前言 最近读完了Spring的IOC部分的源码,受益匪浅,这篇文章讲解一下MyBatis是如何做到与Spring整合的.MyBatis是如何做到干扰Spring的生命周期,把Mapper一个个的注册到Spring容器中的将在这里揭秘. 简单猜想 因为阅读过Spring源

  • Spring框架IOC容器底层原理详解

    目录 1.什么是IOC 2.IOC容器的底层原理 3.那么上边提到的三种技术如何实现IOC的呢 4.IOC(接口) 1.什么是IOC IOC – Inverse of Control,控制反转,将对象的创建权力反转给Spring框架! 在java当中一个类想要使用另一个类的方法,就必须在这个类当中创建这个类的对象,那么可能会出现如下情况, 比如A类当中创建着B对象,B类当中有C对象,C类当中有A对象,这个如果一个类出了问题,那么可能会导致这个框架出现问题. Spring 将创建对象的权利给了IO

  • Spring MVC项目中的异常处理详解

    目录 前言 1. 基于配置的简单异常处理 2. 基于注解的全局异常处理 总结 前言 我们在项目的开发中,难免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大. 那么,能不能将所有类型的异常处理从各处理过程解耦出来,这样既保证了相关处理过程的 功能较单一,也实现了异常信息的统一处理和维护?答案是肯定的.下面将介绍Spring MVC是如何处理异常的. 1. 基于配置的简单异常处理 在SpringMVC中拥有一套非常强大的

  • Spring MVC的web.xml配置详解

    spring是目前最流行的框架.创建java web项目时,我们首先会遇到的配置文件就是web.xml,这是javaweb为我们封装的逻辑,不在今天的研究中.下面我们将简单讲讲web.xml中的配置. 一.一个空的web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns:xsi="http://www.w3.org/2001/

  • Spring MVC 学习 之 - URL参数传递详解

    在学习 Spring Mvc 过程中,有必要来先了解几个关键参数: @Controller: 在类上注解,则此类将编程一个控制器,在项目启动 Spring 将自动扫描此类,并进行对应URL路由映射. @Controller public class UserAction{ } @RequestMapping 指定URL映射路径,如果在控制器上配置 RequestMapping  ,具体请求方法也配置路径则映射的路径为两者路径的叠加 常用映射如:RequestMapping("url.html&q

随机推荐