org.springframework.web.servlet.DispatcherServlet

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

继承结构

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

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 9 关注
  • TextBundle

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

    1 引用 • 2 回帖 • 49 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖 • 4 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖 • 4 关注
  • 知乎

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

    10 引用 • 66 回帖
  • 博客

    记录并分享人生的经历。

    273 引用 • 2388 回帖
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 26 关注
  • 创造

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

    179 引用 • 995 回帖 • 1 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 1 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    88 引用 • 1235 回帖 • 411 关注
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 659 关注
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 3 关注
  • abitmean

    有点意思就行了

    30 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1794 回帖
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 2 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 699 关注
  • gRpc
    11 引用 • 9 回帖 • 74 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 733 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 168 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 52 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    286 引用 • 248 回帖 • 61 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    6 引用 • 15 回帖 • 113 关注
  • 生活

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

    230 引用 • 1454 回帖
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 212 关注
  • BookxNote

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

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

    1 引用 • 1 回帖