一、WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象(每个web应用程序唯一),它代表当前web应用web容器提供其一个全局的上下文环境,其为后面的spring IoC容器提供宿主环境;

二、读取web.xml

服务器软件或容器如(tomcat)加载项目中的web.xml文件,通过其中的各种配置来启动项目,只有其中配置的各项均无误时,项目才能正确启动。web.xml有多项标签,在其加载的过程中顺序依次为:context-param >> listener >> fileter >> servlet​。(同类多个节点以出现顺序依次加载)

1、ServletContext创建后,通过启动WebApplicationContext的Servlet(org.springframework.web.context.ContextLoaderServlet)或Web容器监听器(org.springframework.web.context.ContextLoaderListener)触发初始化WebApplicationContext事件,这个就是spring的ioc容器;(application context的初始化过程,可参考:http://www.cnblogs.com/hantalk/p/6647772.html)

2、容器会读取context-param(springmvc中可以没有这个context-param,即WebApplicationContext不用配置具体数据),spring以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE为属性Key,context-param为属性value对并存入servletContext;

servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,this.context);

例如:

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring-common-config.xml,
classpath:spring-budget-config.xml
</param-value>
</context-param>

3、读取listener创建监听,根据指定的类路径来实例化过滤器filter;

4、初始化web.xml中的dispatcherservlet

首先,利用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE从ServletContext中获取之前的WebApplicationContext作为自己上下文的parent上下文。

然后,读取/WEB-INF/[servlet名字]-servlet.xml文件,初始化自己持有的上下文。初始化完毕后,spring也将dispatcherservlet的上下文存到ServletContext中。

DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,读下面代码,可以在initStrategies方法中看到主要职责如下:

1、文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;

2、通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);

3、通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);

4、通过ViewResolver解析逻辑视图名到具体视图实现;

5、本地化解析;

6、渲染具体的视图等;

7、如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。

public class DispatcherServlet extends FrameworkServlet {
//实现子类的onRefresh()方法,该方法委托为initStrategies()方法。
@Override
protected void onRefresh(ApplicationContext context) {
initStrategies(context);
} //初始化默认的Spring Web MVC框架使用的策略(如HandlerMapping)
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
}
}

三、具体的请求处理

1、首先用户发送请求http://localhost:9080/springmvc-chapter2/hello到web容器,web容器根据“/hello”路径映射到DispatcherServlet(url-pattern为/)进行处理;

2、当收到请求时,dispatcherservlet将请求交给handlerMapping,让它找出对应请求的handlerExecutionChain对象,handlerExecutionChain返回拦截器和处理器。handlerExecutionChain是一个执行链,它包含一个处理该请求的handler(处理器,就是代码中的xxxController),同时还可能包括若干个对该请求实施拦截的handlerInterceptor(拦截器);

3、SimpleControllerHandlerAdapter将HandlerExecutionChain中的处理器(xxxController)适配为SimpleControllerHandlerAdapter;

4、SimpleControllerHandlerAdapter将会调用xxxController中的具体方法进行功能处理,该处理方法返回一个ModelAndView给DispatcherServlet;handlerAdapter对外有三个方法API:

//判断这个adapter是否可以处理这类handler

boolean supports(Object handler);

//封装handler处理request的逻辑

ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

long getLastModified(HttpServletRequest request, Object handler);

handlermapping是把请求找到对应的处理对象,具体用什么方法处理它不管。而handlerAdapter正是调用具体的方法处理请求。

5、dispatherServlet通过配置文件中的ViewResolver,把controller中的modelAndview的数据传递到前端模板freemarker/velocity;

6、前端模板渲染,将在处理器传入的模型数据在视图中展示出来;

7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。

参考:

http://www.imooc.com/article/5385

https://segmentfault.com/q/1010000000210417

http://sishu ok.com/forum/blogPost/list/5188.html(去掉空格)

http://sishuo k.com/forum/blogPost/list/5160.html(去掉空格)

【spring mvc】springmvc在tomcat中的执行过程的更多相关文章

  1. 转载:如何让spring mvc web应用启动时就执行

    转载:如何让spring mvc web应用启动时就执行特定处理 http://www.cnblogs.com/yjmyzz/p/4747251.html# Spring-MVC的应用中 一.Appl ...

  2. spring mvc web应用启动时就执行特定处理(线程启动)

    package com.sdt.platform.index.controller; import java.net.URL; import java.util.List; import java.u ...

  3. Spring MVC 原理探秘 - 一个请求的旅行过程

    1.简介 在前面的文章中,我较为详细的分析了 Spring IOC 和 AOP 部分的源码,并写成了文章.为了让我的 Spring 源码分析系列文章更为丰富一些,所以从本篇文章开始,我将来向大家介绍一 ...

  4. mysql中SQL执行过程详解与用于预处理语句的SQL语法

    mysql中SQL执行过程详解 客户端发送一条查询给服务器: 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器段进行SQL解析.预处理,在优化器生成对应的 ...

  5. Spring MVC:在jsp中引入css

    为了将css引入jsp中,今天可真是踩了好多坑,最后在stackoverflow上找到了解决方法,不多说贴出代码. 在web.xml中添加以下代码: <servlet-mapping> & ...

  6. Spring MVC如何获取请求中的参数

    目录 一.获取URL中路径参数 1.1 @PathVariable 注解 1.2 @PathParam 注解 二.获取请求参数: 2.1 GET请求 2.1.1 获取请求中的单个参数:@Request ...

  7. 如何让spring mvc web应用启动时就执行特定处理

    Asp.Net的应用中通过根目录下的Global.asax,在Application_Start方法中做一些初始化操作,比如:预先加载缓存项对网站热点数据进行预热,获取一些远程的配置信息等等. Spr ...

  8. spring mvc DispatcherServlet详解之四---视图渲染过程

    整个spring mvc的架构如下图所示: 现在来讲解DispatcherServletDispatcherServlet的最后一步:视图渲染.视图渲染的过程是在获取到ModelAndView后的过程 ...

  9. SpringMVC:自定义视图及其执行过程

    一:自定义视图 1.自定义一个实现View接口的类,添加@Component注解,将其放入SpringIOC容器 package com.zzj.view; import java.io.PrintW ...

随机推荐

  1. javascript常用数组算法总结

    1.数组去重 方法1: JavaScript //利用数组的indexOf方法 function unique (arr) { var result = []; for (var i = 0; i & ...

  2. rnqoj-99-配置魔药-dp

    比较好的题目~~ dp[j][k]: 第一个容器在第i秒和第二个容器在第j秒,所产生的最大魔力. if(num[i].t2<=j)dp[j][k]=max(dp[j][k],dp[num[i]. ...

  3. Jquery第二篇【选择器、DOM相关API、事件API】

    前言 前面已经介绍过了Jquery这门语言,其实就是一个javaScript的库-能够简化我们书写的代码-.本博文主要讲解使用Jquery定位HTML控件[定位控件就是获取HTML的标签],使用Jqu ...

  4. m3u8转码

    ffmpeg -i input.mp4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 0 -hls_time 5 output.m3u8

  5. JS中关于in运算符的问题

    转自:http://bbs.bccn.net/thread-412608-1-1.html in运算符 in运算符虽然也是一个二元运算符,但是对运算符左右两个操作数的要求比较严格.in运算符要求第1个 ...

  6. import 和 import {} 的区别

    http://es6.ruanyifeng.com/#docs/module#export

  7. Every Programmer Should Know These Latency Numbers

    Every Programmer Should Know These Latency Numbers 1秒=1000毫秒(ms) 1秒=1,000,000 微秒(μs) 1秒=1,000,000,00 ...

  8. Win7系统安装 MySQL 8.0.11

    1. 下载 MySQL 8.0.11 版本 下载地址: https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.11-winx64.zip 2. 下载 ...

  9. DVWA之文件包含(File inclusion)

    daFile inclusion的意思就是文件包含,当服务器开启了allow_url_include选项时,就可以通过PHP的某些特征函数 include,require和include_once,r ...

  10. parse.urljoin

    parse.urljoin(former,later): 用former的域名拼接later的路径,如果later有域名,则进行忽略