SpringMVC 解析(一)概览

Spring MVC是Spring提供的构建Web应用程序的框架,该框架遵循了Servlet规范,负责接收并处理Servelt容器传递的请求,并将响应写回Response。Spring MVC以DispatcherServlet为核心,众多组件如HandlerMapping为辅助,为用户封装了请求映射等底层逻辑,让用户可以更专注与业务逻辑的处理。本文会对Spring MVC整体结构做简单介绍。

Spring MVC结构图

Spring MVC是一个基于Servlet容器的Web应用框架,这里的Servlet容器通常指Tomcat等服务容器。Servlet容器会负责监听端口消息并映射为Request/Response对象,然后交给Servlet实例去处理。SpringMVC框架的作用核心就是Servlet实例,这个实例在Spring中默认是DispatcherServlet,DispatcherServlet中使用众多Spring组件来协助处理请求,其结构图如下所示。

SpringMVC 解析(一)概览

Servlet容器

Servlet用于从某个Socket接收数据,并处理为标准的ServletRequest和ServletResponse。其内部逻辑比较复杂,我在关于Tomcat容器的其它系列文章中有详细的介绍Tomcat的结构,此处只简单列举一下其功能:

  • 接收socket请求,可以是同步或者异步,阻塞或非阻塞等方式。
  • 处理请求中的协议,如Http协议等。
  • 路由请求到对应的servelt实例。

SpringMVC 解析(一)概览

核心组件DispatcherServlet

Spring MVC的核心组件就是DispatcherServlet,它是SpringWeb请求的调度中心,它的主要功能如下所示:

  • 在Spring容器启动阶段读取映射规则,如RequestMapping;
  • 在请求到来的时候,按照加载的请求映射规则找到合适的处理方法;
  • 当处理请求的过程中出现了异常,对异常进行处理,如返回合适的界面或状态码;
  • 解析返回View的主题、时区等信息;
  • 渲染返回的视图。

SpringMVC 解析(一)概览

请求映射HandlerMapping

请求映射用于根据请求找到该请求需要调用的所有方法,包含过滤器和处理方法等。比较常用的一种请求映射是RequestMappingHandlerMapping,从名称上可以看出来这个HandlerMapping是用于处理@RequestMapping注解请求映射的类。该类的工作原理如下所示,可以看到该类的主要作用是在收到请求之后,按顺序拿到所有需要调用的方法(主要包含拦截器和处理方法),然后一一调用这些方法。

SpringMVC 解析(一)概览

拦截器HandlerInterceptor

拦截器和Tomcat容器中的Valve有些类似,Spring的拦截器可以让用户灵活的在请求处理前、请求处理后和请求完成三个阶段自定义操作,比如用户权限校验等。拦截器的作用我们可以在上一节的图中看到,Spring关于拦截器的接口定义如下所示:

public interface HandlerInterceptor {

    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

        return true;
    }

    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }

    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }

}

SpringMVC 解析(一)概览

处理方法Handler

处理方法在DispatcherServlet定义为Object类型,如果我们使用了@RequestMapping来根据请求查找处理方法,那么查找到的处理方法就是 HandlerMethod类型,对应于Controller中添加了对应RequestMapping的方法。

SpringMVC 解析(一)概览

处理方法适配器HandlerAdapter

DispatcherServlet从HandlerMapping中获取到的处理方法是Object类型,意味着不同的处理方法可能返回不同的对象,DispatcherServlet本身是一个调度器,不应该关注如何调用不同的处理方法,所以Spring提供了HandlerAdapter列表用户处理不同的调度方法。

// 处理方法适配器接口定义
public interface HandlerAdapter {

    boolean supports(Object handler);

    @Nullable
    ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

    long getLastModified(HttpServletRequest request, Object handler);

}

SpringMVC 解析(一)概览

异常处理HandlerExceptionResolver

HandlerExceptionResolver用于处理请求过程中出现的异常,其实现有很多中类型,不过我们日常开发中使用比较多的是ExceptionHandlerExceptionResolver,也就是处理我们定义的@ExceptionHandler注解。典型的@ExceptionHander的使用方式如下所示,@ExceptionHander还可以放在@ControllerAdvice注解的类中,表示对所有的Controller都会生效。

@Controller
public class SimpleController {

    // ...

    @ExceptionHandler
    public ResponseEntity handle(IOException ex) {
        // ...

    }
}

总结

本文只是简单的对SpingMVC的关键组件功能进行介绍,后续文章会对各个关键组件的源码进行解析。

SpringMVC 解析(一)概览

本文最先发布至微信公众号,版权所有,禁止转载!

Original: https://www.cnblogs.com/yuhushen/p/15787827.html
Author: 御狐神
Title: SpringMVC 解析(一)概览

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/589306/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 多线程那点事—Parallel.for

    先看段代码: 1 for (int i = 0; i < 10; i++) 2 { 3 Task.Factory.StartNew(()=>Console.WriteL…

    Java 2023年6月9日
    087
  • HTML相关知识入门

    HTML 注意点 html是不区分大小写的 建议包括嵌套,不要交叉嵌套 文件后缀名可以是 .html或 .htm 格式 标题 标签 <h1></h1>标题 …

    Java 2023年6月6日
    063
  • 七、Java数组

    Java数组 什么是数组 数组是相同类型数据的有序集合。 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。 其中,每一个数据称作为一个数组元素,每个数组元素可以通…

    Java 2023年6月7日
    071
  • Java SE final关键字

    final可以修饰类、属性、方法和局部变量 如下情况,可以使用final 当不希望类被继承时,可以用final修饰 当不希望父类的某个方法被子类覆盖/重写(override)时,可…

    Java 2023年6月7日
    071
  • Doug Lea文章阅读记录-JUC系列

    3.3 QueuesThe heart of the framework is maintenance of queues of blocked threads, which ar…

    Java 2023年6月13日
    081
  • 800java面试题

    800java面试题1、meta标签的作用是什么2、ReenTrantLock可重入锁(和synchronized的区别)总结3、Spring中的自动装配有哪些限制?4、什么是可变…

    Java 2023年5月29日
    085
  • [javaweb]过滤器处理乱码

    过滤器 有一些信息不应该被处理,要被过滤的。 1.导包 javax.servlet.jsp.jstl jstl-api 1.2 taglibs standard 1.1.2 jav…

    Java 2023年6月6日
    092
  • Node.js(一)基本node.js读取删除

    npm init -y(初始化项目) npm uninstall (xxx模块名称)=>(移除模块) var text2=require(“./text2&#82…

    Java 2023年6月15日
    069
  • 多线程

    多线程使用Callable实现多线程 多线程第三种创建方式 定义一个任务类,实现Callable接口,结合FutureTask完成 交给Thread处理,重写call方法 目标:学…

    Java 2023年6月6日
    074
  • VSCode官方的配置同步方案

    前言 这几天在迁移电脑工作环境,对于VSCode,我实在不想从头做下载插件、配置代码规则这样的事情,于是求助百度,搜索结果靠前的解决方案基本都是使用 Setings Sync插件,…

    Java 2023年6月7日
    0115
  • Mybatis mapper动态代理的原理详解(转)

    在开始动态代理的原理讲解以前,我们先看一下集成mybatis以后dao层不使用动态代理以及使用动态代理的两种实现方式,通过对比我们自己实现dao层接口以及mybatis动态代理可以…

    Java 2023年5月30日
    081
  • java工作流软件发送邮件的方案

    利用javamail的功能将发送邮件的功能集成到java工作流系统中。javamail包提供有发送邮件的方法,设置发送人地址,收件人地址,抄送,主题,邮件服务器地址,认证用户等信息…

    Java 2023年5月29日
    084
  • 基于mkcert工具实现Spring Boot 项目服务通过Https方式访问

    mkcert(Windows环境) 2.选择版本 3.以管理员身份运行`命令提示符 1) cd C:/ #进入工具存放的目录下 2) mkcert-v1.4.4-windows-a…

    Java 2023年6月8日
    089
  • 同时在多个 Git 分支上工作,老板要榨干我

    背景 上一篇文章 保持清洁的Git提交记录,三招就够了 ,大家看过后有私下留言说这是非常好用的功能,我突然想到工作中用到的另外一个 Git 功能那也是相当好用,必须全盘托出 作为程…

    Java 2023年6月5日
    089
  • quartz框架(五)-Trigger相关内容

    上篇博文,博主介绍了Job的相关内容。本篇博文,博主将介绍Trigger相关的内容。 Trigger是触发器的意思,它只定义Trigger相关属性的Get方法。一个Trigger只…

    Java 2023年6月7日
    096
  • 基于监控服务打造微服务治理生态体系

    基于上一篇《微服务海量日志监控平台》介绍的平台架构,继续架构的优化和能功的扩展,实现服务治理能力。 问题现状态 日志监控平台为我们带来了很多排查解决线上问题的便利。但是从某种程度上…

    Java 2023年6月6日
    096
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球