第一章 入门

mvc项目中的双配置

  • ContextLoaderListener
    • 是Servlet标准的listener组件
    • 加载时间比DsipatcherServlet早
    • 先创建spring的 ApplicationContext ,独立生命周期,由application-context.xml为配置文件
    • parent context
  • DsipatcherServlet

    • 也创建ApplicationContext
    • 会从SevrletContext获取在listener中创建的ApplicationContext,作为Servlet创建的ApplicationContext的parent
    • spring-servlet.xml为配置文件
    • son context

  • parent context无法查找son context的bean,配置时不要在parent context中依赖son context中的bean

  • 配置环境不通, 各自的bean不能用对方context的值
  • spring boot 使用一个applicationcontext

    第二章基本组件与使用

    控制器

    控制器核心

  • DispatcherSevrlet

    • model查找
      • 通过Mapping映射完成,返回Handler
    • model处理逻辑查找
    • View查找
    • View渲染
  • Handler 是执行逻辑封装

    • 通过handlerMapping 查找到Handler
    • 交由HandlerAdapter 处理

      处理器查找

  • 直接URL映射

    • SimpleUrlHandlerMapping
    • BeanName与URL映射

      • Handler为bean自身,注册逻辑发生在BeanNameUrlHandlerMapping
        1. @Bean(name={"/beanNameUrl", "aliasNameUrl"})
        2. @Component("/beanUrl")
    • @RequestMapping 映射

      • 查找策略是通过RequestMappingHandlerMapping 实现的
      • 根据请求的url查找到用 @RequestMapping标记的方法,根据请求方法获取封装不同的HandlerMethod交由HandlerAdpater去执行

        处理器执行

  • HttpRequestHandler

    • 使用前要在handlerMapping里先注册
  • Controller接口handler
    • //不是指controller层的注解
    • 须实现handlerRequest方法 返回的是ModelAndView
  • @RequestMapping 定义的HandlerMethod
    • 声明为cotroller控制器的bean,该bean中被注解@RequestMapping标记的方法会被RequstMappingHandlerMapping扫描标记为HandlerMethod

拦截器 // TODO这里要会画图说明

  • 执行过程
    • 查找处理器不返回Handler,HandlerMapping返回的是HandlerExecutionChain,
    • 拦截器的类型是 HandlerInterceptor接口实现
    • HandlerInterceptor 内部先执行preHandle方法,返回true才会继续执行拦截器后续处理
    • 所有拦截器执行完后才会执行handler
    • 正常执行完处理器无错误 后 会先执行 拦截器里的postHandle,后执行afterCompletion
    • 如果处理器执行出错,直接到afterCompletion
  • 配置拦截器生效
    • 通过WebMvcConfigurer的 addInterceptors方法

视图查找与模型绑定

模型支持

相关类型

  • Map类型是基础
  • Model接口 ,asMap方法可以转化成Map
  • ModelMap继承了LinkedHashMap 其子类ExtendModelMap 实现了Model接口
  • RedirectAttributes继承了Model接口,为重定向参数的传递,提供了特殊方式,

    模型使用

  • 声明Map类型参数

  • 声明Model类型参数
  • 声明ModelMap类型参数
  • 直接创建Model并作为返回值
  • 处理方法标记@ModelAttribute注解
  • 直接返回ModelAndView
  • 声明RedirectAttributes类型参数

对视图的支持

View render方法依据传入的model,渲染并写入Response

视图类型

  • 内部资源视图 InternalResourceView
    • 需要传入URL,代表内部资源的路径
    • 三种使用场景
      • 访问静态资源
      • 访问JSP视图
      • 转发视图
  • 重定向视图 RedirectView
  • 模版引擎视图

    • 默认引擎Thymeleaf
    • ThymeleafView

      视图查找解析

  • BeanName视图解析

  • 模板引擎视图解析
  • 内部资源视图解析
  • 直接指定视图

    扩展

    过滤器和拦截器的区别

  • 时机

    • 先执行过滤器,过滤器是在servlet之前
    • 再执行拦截器,拦截器是在servlet之中
  • 针对目标不同
    • 过滤器是针对URL,通过URL是否匹配判断是否执行过滤器
    • 拦截器不仅要根据URL匹配,还要求存在对此请求进行处理的处理器,
  • 功能不同

    • 拦截器可以拿到spring mvc体现的handler和ModelAndView等中间产物
    • 过滤器是原生的Servlet标准组件

      控制器详细使用

      基于请求信息的条件映射

  • 控制器类

    • @Controller
    • @RequestMapping

      请求信息与条件概述

  • RequestMappingHandlerMapping负责遍历所有@RequestMapping注解的信息,找到匹配度最高的注解

    请求路径

    请求方法

    请求参数

    请求头

    内容类型

    消息内容类型

  • comsumes

  • prduces

    自定义匹配条件

  • 扩展RequestMappingHandlerMapping //后面章节细讲

    多条件整合

    处理器参数解析

    概述

  • 通过HandlerMethodArgumentResolver实现

    • 提供supportsParam方法接收MethodParameter类型的参数
    • supportsParam方法用于根据方法参数元信息判断是否可以解析出参数值
  • 根据参数注解解析
  • 根据参数类型解析

    Servlet相关类型

  • ServletRequestMehthodArgumentResolver

  • ServletResponseMehthodArgumentResolver
  • 可以直接作为参数类型使用,获取里面的属性,实际很少这样使用,

    路径变量

  • @PathVariable

  • 可以使用RequestMapping当中的变量值

    矩阵变量

  • url中;隔开的参数

    请求参数

  • @RequestParam

  • 隐式指定,没有其他注解,如果参数是java内置类型或内置类型数组,视为使用此注解

请求头

  • @RequestHeader 可以解析请求头的值
  • 支持Map MutiMap HttpHeader类型, 有个特殊的可以用List

    Cookie值

  • @CookieValue

    请求体

  • 原始方式,Requst.getInputStream

  • 自动转换, 通过HttpMessageConverter自动把请求体中的数据流转换为java实体类型
  • @RequestBody标记的参数可以附加数据校验功能, 通过额外标记@Validated
  • @XmlType

    请求头与请求体

  • HttpEntity与其子类RequestEntity 同时包含请求体请求头

  • 声明参数类型时要提供泛型类型,不然无法确认转换目标,不支持参数校验

    请求块

  • 表单文件上传

  • content-type 为multipart/form-data;boundary=…..
  • 请求体中有多个请求块, 每块用上面的 boundary值分隔,
  • 请求块 分请求块头 和请求块体, 请求块头和请求块体 用 两换行分隔
  • 请求块头一般包含Content-Disposition : formdata; name=”xxxx”
  • @RequestPart

    重定向属性

    模型属性