先来看一下什么是 MVC 模式

MVC 是一种设计模式.
MVC 的原理图如下:

SpringMVC 简单介绍

SpringMVC 框架是以请求为驱动,围绕 Servlet 设计,将请求发给控制器,然后通过模型对象,分派器来展示请求结果视图。其中核心类是 DispatcherServlet,它是一个 Servlet,顶层是实现的Servlet接口。

SpringMVC 使用

需要在 web.xml 中配置 DispatcherServlet 。并且需要配置 Spring 监听器ContextLoaderListener

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<!-- 如果不设置init-param标签,则必须在/WEB-INF/下创建xxx-servlet.xml文件,其中xxx是servlet-name中配置的名称。 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

SpringMVC 工作原理(重要)

简单来说:
客户端发送请求-> 前端控制器 DispatcherServlet 接受客户端请求 -> 找到处理器映射 HandlerMapping 解析请求对应的 Handler-> HandlerAdapter 会根据 Handler 来调用真正的处理器开处理请求,并处理相应的业务逻辑 -> 处理器返回一个模型视图 ModelAndView -> 视图解析器进行解析 -> 返回一个视图对象->前端控制器 DispatcherServlet 渲染数据(Moder)->将得到视图对象返回给用户

流程说明(重要):
(1)客户端(浏览器)发送请求,直接请求到 DispatcherServlet。
(2)DispatcherServlet 根据请求信息调用 HandlerMapping,解析请求对应的 Handler。
(3)解析到对应的 Handler(也就是我们平常说的 Controller 控制器)后,开始由 HandlerAdapter 适配器处理。
(4)HandlerAdapter 会根据 Handler 来调用真正的处理器开处理请求,并处理相应的业务逻辑。
(5)处理器处理完业务后,会返回一个 ModelAndView 对象,Model 是返回的数据对象,View 是个逻辑上的 View。
(6)ViewResolver 会根据逻辑 View 查找实际的 View。
(7)DispaterServlet 把返回的 Model 传给 View(视图渲染)。
(8)把 View 返回给请求者(浏览器)

SpringMVC 重要组件说明

1、前端控制器DispatcherServlet(不需要工程师开发),由框架提供(重要)
作用:Spring MVC 的入口函数。接收请求,响应结果,相当于转发器,中央处理器。有了 DispatcherServlet 减少了其它组件之间的耦合度。用户请求到达前端控制器,它就相当于mvc模式中的c,DispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性。
2、处理器映射器HandlerMapping(不需要工程师开发),由框架提供
作用:根据请求的url查找Handler。HandlerMapping负责根据用户请求找到Handler即处理器(Controller),SpringMVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
3、处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler 通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
4、处理器Handler(需要工程师开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。 由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。
5、视图解析器View resolver(不需要工程师开发),由框架提供
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view) View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。 一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由工程师根据业务需求开发具体的页面。
6、视图View(需要工程师开发)
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)
注意:处理器Handler(也就是我们平常说的Controller控制器)以及视图层view都是需要我们自己手动开发的。其他的一些组件比如:前端控制器DispatcherServlet、处理器映射器HandlerMapping、处理器适配器HandlerAdapter等等都是框架提供给我们的,不需要自己手动开发。

DispatcherServlet详细解析

首先看下源码

package org.springframework.web.servlet;@SuppressWarnings("serial")
public class DispatcherServlet extends FrameworkServlet {public static final String MULTIPART_RESOLVER_BEAN_NAME = "multipartResolver";public static final String LOCALE_RESOLVER_BEAN_NAME = "localeResolver";public static final String THEME_RESOLVER_BEAN_NAME = "themeResolver";public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";public static final String HANDLER_EXCEPTION_RESOLVER_BEAN_NAME = "handlerExceptionResolver";public static final String REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME = "viewNameTranslator";public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";public static final String FLASH_MAP_MANAGER_BEAN_NAME = "flashMapManager";public static final String WEB_APPLICATION_CONTEXT_ATTRIBUTE = DispatcherServlet.class.getName() + ".CONTEXT";public static final String LOCALE_RESOLVER_ATTRIBUTE = DispatcherServlet.class.getName() + ".LOCALE_RESOLVER";public static final String THEME_RESOLVER_ATTRIBUTE = DispatcherServlet.class.getName() + ".THEME_RESOLVER";public static final String THEME_SOURCE_ATTRIBUTE = DispatcherServlet.class.getName() + ".THEME_SOURCE";public static final String INPUT_FLASH_MAP_ATTRIBUTE = DispatcherServlet.class.getName() + ".INPUT_FLASH_MAP";public static final String OUTPUT_FLASH_MAP_ATTRIBUTE = DispatcherServlet.class.getName() + ".OUTPUT_FLASH_MAP";public static final String FLASH_MAP_MANAGER_ATTRIBUTE = DispatcherServlet.class.getName() + ".FLASH_MAP_MANAGER";public static final String EXCEPTION_ATTRIBUTE = DispatcherServlet.class.getName() + ".EXCEPTION";public static final String PAGE_NOT_FOUND_LOG_CATEGORY = "org.springframework.web.servlet.PageNotFound";private static final String DEFAULT_STRATEGIES_PATH = "DispatcherServlet.properties";protected static final Log pageNotFoundLogger = LogFactory.getLog(PAGE_NOT_FOUND_LOG_CATEGORY);private static final Properties defaultStrategies;static {try {ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, DispatcherServlet.class);defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);}catch (IOException ex) {throw new IllegalStateException("Could not load 'DispatcherServlet.properties': " + ex.getMessage());}}/** Detect all HandlerMappings or just expect "handlerMapping" bean? */private boolean detectAllHandlerMappings = true;/** Detect all HandlerAdapters or just expect "handlerAdapter" bean? */private boolean detectAllHandlerAdapters = true;/** Detect all HandlerExceptionResolvers or just expect "handlerExceptionResolver" bean? */private boolean detectAllHandlerExceptionResolvers = true;/** Detect all ViewResolvers or just expect "viewResolver" bean? */private boolean detectAllViewResolvers = true;/** Throw a NoHandlerFoundException if no Handler was found to process this request? **/private boolean throwExceptionIfNoHandlerFound = false;/** Perform cleanup of request attributes after include request? */private boolean cleanupAfterInclude = true;/** MultipartResolver used by this servlet */private MultipartResolver multipartResolver;/** LocaleResolver used by this servlet */private LocaleResolver localeResolver;/** ThemeResolver used by this servlet */private ThemeResolver themeResolver;/** List of HandlerMappings used by this servlet */private List<HandlerMapping> handlerMappings;/** List of HandlerAdapters used by this servlet */private List<HandlerAdapter> handlerAdapters;/** List of HandlerExceptionResolvers used by this servlet */private List<HandlerExceptionResolver> handlerExceptionResolvers;/** RequestToViewNameTranslator used by this servlet */private RequestToViewNameTranslator viewNameTranslator;private FlashMapManager flashMapManager;/** List of ViewResolvers used by this servlet */private List<ViewResolver> viewResolvers;public DispatcherServlet() {super();}public DispatcherServlet(WebApplicationContext webApplicationContext) {super(webApplicationContext);}@Overrideprotected void onRefresh(ApplicationContext context) {initStrategies(context);}protected void initStrategies(ApplicationContext context) {initMultipartResolver(context);initLocaleResolver(context);initThemeResolver(context);initHandlerMappings(context);initHandlerAdapters(context);initHandlerExceptionResolvers(context);initRequestToViewNameTranslator(context);initViewResolvers(context);initFlashMapManager(context);}}

DispatcherServlet类中的属性beans:
HandlerMapping:用于handlers映射请求和一系列的对于拦截器的前处理和后处理,大部分用@Controller注解。

HandlerAdapter:帮助DispatcherServlet处理映射请求处理程序的适配器,而不用考虑实际调用的是 哪个处理程序。- - -

ViewResolver:根据实际配置解析实际的View类型。

ThemeResolver:解决Web应用程序可以使用的主题,例如提供个性化布局。

MultipartResolver:解析多部分请求,以支持从HTML表单上传文件。-

FlashMapManager:存储并检索可用于将一个请求属性传递到另一个请求的input和output的FlashMap,通常用于重定向。

在Web MVC框架中,每个DispatcherServlet都拥自己的WebApplicationContext,它继承了ApplicationContext。WebApplicationContext包含了其上下文和Servlet实例之间共享的所有的基础框架beans。
HandlerMapping

HandlerMapping接口处理请求的映射HandlerMapping接口的实现类:
1)SimpleUrlHandlerMapping类通过配置文件把URL映射到Controller类。
2)DefaultAnnotationHandlerMapping类通过注解把URL映射到Controller类。
HandlerAdapter

HandlerAdapter接口-处理请求映射
AnnotationMethodHandlerAdapter:通过注解,把请求URL映射到Controller类的方法上。
HandlerExceptionResolver

HandlerExceptionResolver接口-异常处理接口
1)SimpleMappingExceptionResolver通过配置文件进行异常处理。
2)AnnotationMethodHandlerExceptionResolver:通过注解进行异常处理。
ViewResolver

ViewResolver接口解析View视图。
UrlBasedViewResolver类 通过配置文件,把一个视图名交给到一个View来处理。

SpringMVC 工作原理详解相关推荐

  1. SpringMVC工作原理详解

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 先来看一下什么是 MVC 模式 MVC 是一种设计模式. MVC 的原理图如下: SpringMV ...

  2. nginx配置文件及工作原理详解

    nginx配置文件及工作原理详解 1 nginx配置文件的结构 2 nginx工作原理 1 nginx配置文件的结构 1)以下是nginx配置文件默认的主要内容: #user nobody; #配置用 ...

  3. sync.Map低层工作原理详解

    sync.Map低层工作原理详解 目录 为什么需要sync.Map?适合什么场景? sync.Map内部实现基本原理及结构体分析 sync.Map低层工作原理 1. 为什么需要sync.Map?适合什 ...

  4. ASP.NET页面与IIS底层交互和工作原理详解 (二)

    第三回: 引言 Http 请求处理流程 和 Http Handler 介绍 这两篇文章里,我们首先了解了Http请求在服务器端的处理流程,随后我们知道Http请求最终会由实现了IHttpHandler ...

  5. camera (13)---智能手机双摄像头工作原理详解:RBG +RGB, RGB + Mono

    智能手机双摄像头工作原理详解:RBG +RGB, RGB + Mono 由于双摄技术的快速发展,目前已经衍生出了几种不同的双摄硬件和算法配置解决方案.不同手机厂商可能有不同的双摄配置,比如华为荣耀P9 ...

  6. ASP.NET页面与IIS底层交互和工作原理详解(一)

    第一回: 引言 我查阅过不少Asp.Net的书籍,发现大多数作者都是站在一个比较高的层次上讲解Asp.Net.他们耐心.细致地告诉你如何一步步拖放控件.设置控件属性.编写CodeBehind代码,以实 ...

  7. 有刷直流电机工作原理详解

    有刷直流电机工作原理详解 来源:网络整理• 2018-05-10 09:00 • 56380次阅读 有刷直流电机被广泛用于从玩具到按钮调节式汽车坐椅的应用中.有刷直流 (Brushed DC,BDC) ...

  8. 晶体三极管结构及其工作原理详解

    晶体三极管基本概述 晶体管是一种与其他电路元件结合使用时可产生电流增益.电压增益和信号功率增益的多结半导体器件.因此,晶体管称为有源器件,而二极管称为无源器件.晶体管的基本工作方式是在其两端施加电压时 ...

  9. FTP协议及工作原理详解

    FTP协议及工作原理详解 1. FTP协议 什么是FTP呢?FTP 是 TCP/IP 协议组中的协议之一,是英文File Transfer Protocol的缩写. 该协议是Internet文件传送的 ...

  10. 卡尔曼滤波工作原理详解

    卡尔曼滤波工作原理详解 网上看到有不少的博客翻译 How a Kalman filter works, in pictures, 这篇文章中非常有趣的解释了卡尔曼滤波,. 但是目前很多翻译的文章中公式 ...

最新文章

  1. 【十大经典排序算法】java实现--选择排序(2)
  2. 你的微信昵称,正在暴露你!
  3. Spring Boot【快速入门】
  4. jsp文件能转换html吗,html怎么转换成jsp
  5. VUE报错:Module build failed: Error: Cannot find module ‘node-sass‘
  6. 数据引用Data References
  7. phpcms列表页内容如何替换?
  8. Citrx XenDesktop 7 实施五 配置 XenDesktop Delivery Controller
  9. 伪造邮件***,社工钓鱼,你中招了吗【一】
  10. 数据结构与算法分析 C++语言描述(第四版)参考答案
  11. 高等数学总结(无穷级数)
  12. pandas对索引列index重新整理顺序
  13. 倒立摆c语言程序设计,清华大学倒立摆控制系统实验指导书.pdf
  14. Linux下的exec系统调用详解
  15. 安卓,加密drawable图像资源、从类文件生成drawable
  16. 计算机网络世界(知识扫盲一)
  17. 华为交换机ARP防网关冲突
  18. 计算机开机其他用户,Win8.1系统下取消开机显示“其他用户”的方法
  19. teamview删除设备
  20. 企业小程序应该如何开发?

热门文章

  1. 企业oa系统是什么,有什么好用的办公软件推荐?
  2. Python + Graphviz 绘制神经网络结构图
  3. applyTo、renderTo 区别
  4. 如何用 nginx 做 postfix 的 SMTP 反向代理,以及 XCLIENT 的支持
  5. 加速基于flash的嵌入式应用程序
  6. java毕业设计源码介绍 基于SSM美好生活九宫格日志网日记网站
  7. linux下的系统监控软件,管理员必备的20个Linux系统监控工具
  8. linux培训哪家好?Linux520内部培训教程
  9. 黑客工具软件大全100套(转)
  10. 百度离线地图示例之一:地图展示