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中形参。
在这里插入图片描述

常用的数据绑定类型

  1. 基本数据类型(id绑定int)
  2. 包装类
  3. 数组
  4. 对象
  5. 集合(List,Set,Map)
  6. 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>&nbsp;&nbsp;
                            <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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值