SpringMVC---数据绑定
SpringMVC数据绑定原理
什么是数据绑定
将HTTP请求中的参数绑定到Handler业务方法的形参,Web项目对应的就是客户端和服务器之间的交互,客户端发送请求,服务器给予响应的过程,客户端发送的请求带有参数,假如查询课程的详细信息,前端就会将课程ID传递给后台,后端方法通过ID去数据库中查找,然后将查找到数据封装成模型数据,然后将模型数据反映给前台。在没有SpringMVC的框架的时候,是通过Servlet中的doGet、doPost方法是用来处理这个请求的,他们的形参列表有两个默认的参数HttpServletRequest的对象,通过这个对象来获取参数,但是获取到的参数都是String类型,这就需要到我们需要int类型的时候,要使用强制转型将String转为int类型。假如我们需要添加课程信息(ID、Name)的时候,需要这三个值作为参数传递给后台,后台通过Request对象将这俩值拿出来,然后再将其分装成课程对象。
然鹅,当我们使用SpringMVC的时候,就可以不用进行以上繁琐的斜体操作了,在SpringMVC中,你需要获取什么样的类型的数据,你就在形参中定义相应的数据类型就可以了。SpringMVC框架会自动的将Http请求的这个参数拿出来绑定到形参当中。那么他是如何实现这个过程的呢?
通过HandlerAdapter去调用HttpMessageConverter
组件,将HTTP请求的参数取出来,进行数据类型的转换和封装,然后完成数据绑定到Handler业务方法的形参当中。然后业务方法就直接可以拿到Handler中形参。
常用的数据绑定类型
- 基本数据类型(id绑定int)
- 包装类
- 数组
- 对象
- 集合(List,Set,Map)
- JSON
SpringMVC数据绑定的使用
package com.yanyi.controller;
import com.yanyi.dao.CourseDAO;
import com.yanyi.entity.Course;
import com.yanyi.entity.CourseList;
import com.yanyi.entity.CourseMap;
import com.yanyi.entity.CourseSet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
/**
* @ResponseBody 可以将业务方法的返回值返回到客户端,而不需要jsp页面
*/
@Controller
public class DataBindController {
//因为添加课程的时候需要使用CourseDao @Autowired注解完成自动装载
//这样就会创建CourseDAO对象,同时注入到DataBindController类中
@Autowired
private CourseDAO courseDAO;
@RequestMapping(value = "/baseType")
@ResponseBody
//将Http请求中的参数绑定到id形参 需要使用@RequestParam注解 这样的话就会将url的id取出来绑定到形参中
public String baseType(@RequestParam(value = "id") int id ){
return "id:"+id;
}
@RequestMapping(value = "/packageType")
@ResponseBody
public String packageType(@RequestParam(value = "id")Integer id){
return "id:"+id;
}
@RequestMapping(value = "/arrayType")
@ResponseBody
public String arrayType(@RequestParam(value = "names")String[] names){
//这时候传入的是数组,这里需要将数组进行遍历,然后进行拼接(使用StringBuffer),最后进行输出
StringBuffer stringBuffer = new StringBuffer();
for (String name : names){
stringBuffer.append(name).append(" ");
}
return stringBuffer.toString();
}
//向其中添加课程,需要前端传递来的课程对象,添加完毕后,将课程信息返回给前端
//因为需要页面所以需要ModelAndView
@RequestMapping(value = "/pojoType")
public ModelAndView pojoType(Course course){
//进行添加操作,即具体业务逻辑
courseDAO.add(course);
//进行响应
ModelAndView modelAndView = new ModelAndView();
//添加视图信息
modelAndView.setViewName("index");
//添加模型数据
modelAndView.addObject("course",courseDAO.getAll());
return modelAndView;
}
//在使用List是无法使用,因为是无法完成绑定的,这时需要一个包装类,
@RequestMapping(value = "/listType")
public ModelAndView listType(CourseList courseList){
for (Course courses :courseList.getCourses()){
courseDAO.add(courses);
}
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("index");
modelAndView.addObject("course",courseDAO.getAll());
return modelAndView;
}
@RequestMapping(value = "/mapType")
public ModelAndView mapType(CourseMap courseMap){
for (String key : courseMap.getCourses().keySet()){
Course course = courseMap.getCourses().get(key);
courseDAO.add(course);
}
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("index");
modelAndView.addObject("course",courseDAO.getAll());
return modelAndView;
}
@RequestMapping(value = "/setType")
public ModelAndView setType(CourseSet courseSet){
for (Course course : courseSet.getCourses()){
courseDAO.add(course);
}
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("index");
modelAndView.addObject("course",courseDAO.getAll());
return modelAndView;
}
// @RequestMapping(value = "/jsonType")
// @ResponseBody
// public Course jsonType(@RequestBody Course course){
// course.setPrice(course.getPrice()+199);
// return course;
// }
}
对于List集合来说,放入的是course的对象,在存入的时候需要传入courses[0].id、courses[0].name、courses[0].price、courses[0].author.id、courses[0].author.name、courses[1].id、courses[1].name、courses[1].price、courses[1].author.id、courses[1].author.name
,是以数组的类型进行传入的,当我们在页面对其进行遍历的时候,就是调用courses.id
等。Set和List一样,而Map使用的是courses['one'].id、courses['two'].id
等,在添加值的时候,使用的是Key-Values的形式,所以要先遍历键的集合然后,通过get(key)
来获取值course,最后进行添加。
<c:forEach items="${courses}" var="course">
<tr>
<td><input type='checkbox' class='check_item'/></td>
<td>${course.id}</td>
<td>${course.name}</td>
<td>${course.price}</td>
<td>${course.author.name}</td>
<td>
<button class="btn btn-primary btn-sm edit_btn">
<span class="glyphicon glyphicon-pencil">编辑</span>
</button>
<button class="btn btn-danger btn-sm delete_btn">
<span class="glyphicon glyphicon-trash">删除</span>
</button>
</td>
</tr>
</c:forEach>
WEB-INF中web.xml的配置
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
</web-app>
Spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.yanyi"></context:component-scan>
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置前缀-->
<property name="prefix" value="/"></property>
<!--配置后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
数据绑定实际上指的是,借助SpringMVC框架将HTTP请求当中的参数直接绑定到Handler的业务方法的形参列表中。
源码
https://github.com/909913825/SpringMVC-DataBind