org.springframework.web.servlet.DispatcherServlet

本贴最后更新于 2930 天前,其中的信息可能已经时移俗易

继承结构

  • HttpServletBean 是 Spring 对 HttpServlet 最底层的抽象,在这里 Spring 把 Servlet 视作一个 Bean
  • FrameworkServlet 是对 HttpServletBean 的进一步抽象,真正初始化一个 Spring 的容器(WebApplicationContext)
  • DispatcherServlet 对容器(容器用于管理组件)进行初始化以达到对组件进行逻辑调用的目的

SpringMVC 自身对于组件并未实现一套完整的管理机制,而是借用了 Spring Framework 核心框架中容器的概念,将所有的组件纳入到容器中进行管理。一个组件的多种行为模式可以在容器中共存,容器将负责对这些实现类进行管理。

数据结构

  • 红线以上是参数配置,控制 SpringMVC 组件的初始化行为方式
  • 红线以下是核心组件,SpringMVC 的核心逻辑处理组件

DispatcherServlet 是程序的入口,在 web.xml 中配置
在之前 Servlet 模式中,web.xml 配置项目的所有请求-响应映射关系。项目规模扩大之后,请求-响应的映射关系全部定义在 web.xml 中,将造成 web.xml 的不断膨胀而变得难以维护。针对这一点,SpringMVC 提炼一个核心的 Servlet 覆盖对所有 Http 请求的处理,也就是 DispatcherServlet。
要做到能分发所有的请求,核心分发器需要做到:① 能够根据一定的规则对不同的 Http 请求分发到不同的 Servlet 对象上去进行处理 ② 能够建立起一整套完整的对所有 Http 请求进行规范化处理的流程(不同协议之间的转化,从 Http 协议到 Java)。
为了做到这 2 点,SpringMVC 所提出 2 点:

  • 处理流程规范化 —— 将处理流程划分为若干个步骤(任务),并使用一条明确的逻辑主线将所有的步骤串联起来
  • 处理流程组件化 —— 将处理流程中的每一个步骤(任务)都定义为接口,并为每个接口赋予不同的实现模式

其中流程步骤为:
1)对 Http 请求进行初步处理,查找与之对应的 Controller 处理类(方法)——HandlerMapping 接口(组件)
2)调用相应的 Controller 处理类(方法)完成业务逻辑——HandlerAdapter 接口(组件)
3)对 Controller 处理类(方法)调用时可能发生的异常进行处理——HandlerExceptionResolver 接口(组件)
4)根据 Controller 处理类(方法)的调用结果,进行 Http 响应处理——ViewResolver 接口(组件)
这 4 个步骤对应的 4 个接口就是 Spring 的组件,而 DispatcherServlet 就是把这些组件串联在一起,实现分发请求的功能。那么 SpringMVC 要怎么管理这些组件呢?我们必须借助一个有效的手段对整个 SpringMVC 的组件进行定义,而这一点正是通过核心配置文件来完成的。

组件是处理流程的抽象化,因而所有组件都是接口,接口最重要意义是定义操作规范,一个接口可以有多个不同的实现类,代表的是对于相同的逻辑语义的不同解读方式。或者说一个接口的每一个不同的实现分支,代表了相同操作规范的不同行为模式。举个例子,根据Http请求查找与之对应的Controller的组件HandlerMapping的树形实现体系:

  • BeanNameUrlHandlerMapping —— 根据 Spring 容器中的 bean 的定义来指定请求映射关系
  • SimpleUrlHandlerMapping —— 直接指定 URL 与 Controller 的映射关系,其中的 URL 支持 Ant 风格
  • DefaultAnnotationHandlerMapping —— 支持通过直接扫描 Controller 类中的 Annotation 来确定请求映射关系
  • RequestMappingHandlerMapping —— 通过扫描 Controller 类中的 Annotation 来确定请求映射关系的另外一个实现类

由此可以看出,组件化(接口化)体系是 SpringNVC 对行为模式的扩展的有效途径,SpringMVC 是一个基于组件的开发框架

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    172 引用 • 1545 回帖
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖 • 2 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 143 回帖
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 47 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 827 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 1 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    187 引用 • 1021 回帖
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 160 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖
  • 浅吟主题

    Jeffrey Chen 制作的思源笔记主题,项目仓库:https://github.com/TCOTC/Whisper

    2 引用 • 32 回帖 • 1 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    12 引用 • 59 回帖 • 1 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 1 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    59 引用 • 22 回帖 • 1 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 674 关注
  • AWS
    11 引用 • 28 回帖 • 8 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 114 关注
  • V2Ray
    1 引用 • 15 回帖 • 5 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖 • 3 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    7 引用 • 69 回帖 • 2 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 82 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    92 引用 • 752 回帖
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1432 回帖
  • 博客

    记录并分享人生的经历。

    273 引用 • 2389 回帖 • 1 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 66 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    7 引用 • 28 回帖
  • OnlyOffice
    4 引用 • 19 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    268 引用 • 666 回帖