org.springframework.web.servlet.DispatcherServlet

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

继承结构

  • 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 是一个基于组件的开发框架

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 319 回帖 • 231 关注
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖 • 4 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    134 引用 • 1128 回帖 • 109 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    29 引用 • 202 回帖 • 41 关注
  • abitmean

    有点意思就行了

    40 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    168 引用 • 598 回帖
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 838 关注
  • 百度

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

    63 引用 • 785 回帖 • 49 关注
  • Scala

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

    13 引用 • 11 回帖 • 168 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 655 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    174 引用 • 543 回帖
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 1 关注
  • Follow
    4 引用 • 12 回帖 • 18 关注
  • uTools

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

    9 引用 • 69 回帖 • 3 关注
  • 996
    13 引用 • 200 回帖 • 7 关注
  • Word
    13 引用 • 41 回帖 • 1 关注
  • 反馈

    Communication channel for makers and users.

    120 引用 • 906 回帖 • 295 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 545 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖 • 2 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    347 引用 • 762 回帖
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 22 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • 生活

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

    230 引用 • 1432 回帖 • 2 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 447 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    22 引用 • 148 回帖 • 24 关注