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

时间:2021-05-20

数据绑定概述

在执行程序时,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;@Controllerpublic 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;@Controllerpublic 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;@Controllerpublic 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"; }

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

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章