1.SpringMVC简介

SpringMVC框架是围绕一个DispatherServlet来设计的。这个Servlet会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等,甚至还支持文件上传。处理器是应用中使用注解@Controller和@RequestMapping的类和方法,Spring为处理器方法提供了极其灵活的配置。

“对扩展开放”是Spring web MVC 框架的一个重要的设计原则,而对应Spring整个框架来说,其设计原则是“对扩展开放,对修改关闭”。

2.关于DispatherServlet

从这张图可以清晰的看出,DispatherServlet本质上就是一个Servlet。

引申:Servlet生命周期

2.DispatherServlet初始化过程

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1" metadata-complete="true"> <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param> <servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> <listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> </web-app>

1.Servlet 是个接口

public void init(ServletConfig config) throws ServletException;

2.GenericServlet 中实现了初始化方法

public void init(ServletConfig config) throws ServletException {

this.config = config;
this.init();//空方法,留给子类实现
}

3.HttpServlet 没有对初始化相关的方法进行覆盖

4.HttpServletBean,重写了init()方法

其中又调用了一个initServletBean();方法,这本类中也是个空实现。

5.FrameworkServlet 重写了上边留空的方法:initServletBean();

在initServletBean方法中最重要的就是调用了一个initWebApplicationContext() 方法。

initWebApplicationContext()内部调用了onRefresh(), 这个方法在本类中为空实现,留给子类去实现。

6.DispatcherServlet,找到onRefresh()

@Override
protected 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);
}

至此,DispatherServlet初始化完毕!

3.DispatherServlet工作原理

①:DispatcherServlet是springmvc中的前端控制器(front controller),负责接收request并将request转发给对应的处理组件.

②:HanlerMapping是springmvc中完成url到controller映射的组件.DispatcherServlet接收request,然后从HandlerMapping查找处理request的controller.

③:Cntroller处理request,并返回ModelAndView对象,Controller是springmvc中负责处理request的组件(类似于struts2中的Action),ModelAndView是封装结果视图的组件.

④ ⑤ ⑥:视图解析器解析ModelAndView对象并返回对应的视图给客户端.

4.几个关键的类或接口

HandlerMapping

HandlerExecutionChain

HandlerInterceptor

HandlerAdapter

View

5.分步讲解源码

SpringMVC源码解读的更多相关文章

  1. SpringMVC源码解读 - HandlerMapping

    SpringMVC在请求到handler处理器的分发这步是通过HandlerMapping模块解决的.handlerMapping 还处理拦截器. 先看看HandlerMapping的继承树吧 可以大 ...

  2. SpringMVC源码解读 - RequestMapping注解实现解读 - RequestMappingInfo

    使用@RequestMapping注解时,配置的信息最后都设置到了RequestMappingInfo中. RequestMappingInfo封装了PatternsRequestCondition, ...

  3. SpringMVC源码解读 - RequestMapping注解实现解读 - RequestCondition体系

    一般我们开发时,使用最多的还是@RequestMapping注解方式. @RequestMapping(value = "/", param = "role=guest& ...

  4. SpringMVC源码解读 - RequestMapping注解实现解读

    SpringMVC源码解读 - RequestMapping注解实现解读 - RequestCondition体系  https://www.cnblogs.com/leftthen/p/520840 ...

  5. springMVC 源码解读系列(一)初始化

    先看看DispatcherServlet的类机构: 初始化时序图: servlet初始化会调用 init 方法,换句话说就是springMVC进行初始化的时候首先会去执行HttpServletBean ...

  6. springmvc源码解读(简介)

    1.客户端请求提交的DispatcherServlet 2.由DispatcherServlet控制器查询一个或者多个HandlerMapping,找到处理请求的Controller. 3.Dispa ...

  7. SpringMVC源码解读 - HandlerMapping - SimpleUrlHandlerMapping初始化

    摘要: SimpleUrlHandlerMapping只是参与Handler的注册,请求映射时由AbstractUrlHandlerMapping搞定. 初始化时,通过setMappings(Prop ...

  8. springMVC源码解读笔记

    1: DispatcherServlet 的初始化流程(调用的init方法) a) 初始化spring高级容器,WebApplicationContext(容器初始化12个步骤) Servlet类的i ...

  9. SpringMVC源码解读 - HandlerMapping - RequestMappingHandlerMapping请求分发

    AbstractHandlerMethodMapping实现接口getHandlerInternal,定义查找流程 RequestMappingInfoHandlerMapping根据RequestM ...

随机推荐

  1. socket status 的状态变化详解

    原文链接: http://www.diranieh.com/SOCKETS/SocketStates.htm --------------------------------------------- ...

  2. 安装好oracle后如何使用PLSQL连接【我】

    简单的说: 一.如果你本地安装的是32位的Oracle,可以直接在PLSQl中配置oracle安装路径下的相关目录文件,直接启动PLSQL 二.如果你本地安装的是64位的Oracle或者oracle服 ...

  3. QCamera检测摄像头

    The QCamera class provides interface for system camera devices. More... Header: #include <QCamera ...

  4. C/C++中回调函数【重要】

    参考学习:https://www.cnblogs.com/xuelisheng/p/9339924.html 1. 回调函数定义 回调函数就是一个通过函数指针调用的函数. 如果你把 函数的指针(地址) ...

  5. ABAP DEMO 下拉框

    效果展示: *&---------------------------------------------------------------------* *& Report YCX ...

  6. 最基础的Python的socket编程入门教程

    最基础的Python的socket编程入门教程 本文介绍使用Python进行Socket网络编程,假设读者已经具备了基本的网络编程知识和Python的基本语法知识,本文中的代码如果没有说明则都是运行在 ...

  7. centos 7 修改计算机名

      [root@centos7 ~]$ hostnamectl set-hostname test.xyz.com # 使用这个命令会立即生效且重启也生效 [root@centos7 ~]$ host ...

  8. iOS实现简单时钟效果

    实现的效果图如下 : 实现代码如下: #import "ViewController.h" //将旋转角度转换为弧度制#define angleToRadion(angle) (( ...

  9. 【Leetcode_easy】884. Uncommon Words from Two Sentences

    problem 884. Uncommon Words from Two Sentences 题意:只要在两个句子中单词出现总次数大于1次即可. 注意掌握istringstream/map/set的使 ...

  10. Angular cookies

    参考地址:https://stackoverflow.com/questions/34298133/angular-cookies/36093800#36093800 @Component({ sel ...