springMVC的运行流程:

1、用户发送请求至前端控制器DispatcherServlet

2、DispatcherServlet收到请求调用HandlerMapping处理器映射器

3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)并返回给DispatcherServlet

4、DispatcherServlet通过HandlerAdapter处理器适配器调用处理器

5、执行处理器(Controller,也叫后端控制器)

6、Controller执行完成返回ModelAndView

7、HandlerAdapter将controller执行结果(ModelAndView)返回给DispatchServlet

8、DispatchServlet将ModelAndView传给ViewResolver视图解析器(如果加上@responsebody注解,则返回值不通过viewResolver,而是直接返回object)

9、ViewResolver解析后返回具体View

10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)

11、DispatcherServlet响应用户

从以上过程可以看出,DispatcherServlet有接受请求,响应结果,转发等作用。有了DispatcherServlet之后,可以减少组件之间的耦合度。

简要过程如下:

下面我们从源码来详细分析请求的执行过程:

我们从页面发送的请求,进入DispatcherServlet类Service方法(位于DispatcherServlet类继承的——FrameworkServlet类中)捕获该请求:

    @Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { HttpMethod httpMethod = HttpMethod.resolve(request.getMethod());
if (HttpMethod.PATCH == httpMethod || httpMethod == null) {
processRequest(request, response);
}
else {
super.service(request, response);
}
}

获取到对应方法之后会调用对应(此处为doGet)方法:

    @Override
protected final void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { processRequest(request, response);
} @Override
protected final void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { processRequest(request, response);
} //还有方法不列举......

进入processRequest方法——执行其doService方法:

而此doService方法也就是DispatcherServlet中的doService方法(该方法将一些值传如request对象中):

然后执行其中的doDispatch方法:

进入该方法可知该方法处理了适配器以及GET请求:

 然后执行Handler方法并构建视图processDispatchResult:

 我们进入processDispatchResult方法查看构建,其中可看到

如果出现请求出现异常将会构建一个异常视图(如404页面等)

而在这之前我们需要的视图构建在render里创建:

 我们沿着这一条线索往下走找到其实现的AbstractView中的render:

 其中的renderMergedOutputModel(mergedModel, getRequestToExpose(request), response);用于将请求和数据进行处理

继续往下走找到其实现的InternalResourceView中的renderMergedOutputModel

 其中的红线标注的就是处理的Dispatch

标蓝部分就是请求转发

springMVC的执行请求过程的更多相关文章

  1. springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。为了区别不同的异常通常根据异常类型自定义异常类,这里我们创建一个自定义系统异常,如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。

    springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑. 1.1 异常处理思路 系统中异常包括两类:预期异常和运行时异常RuntimeEx ...

  2. (二)SpringMVC之执行的过程

    (DispatcherServlet在Spring当中充当一个前端控制器的角色,它的核心功能是分发请求.请求会被分发给对应处理的Java类,Spring MVC中称为Handle.) ①   用户把请 ...

  3. 15.SpringMVC之异步请求

    SpringMVC中异步请求相关组件 SpringMVC在此基础上对异步请求进行了封装.提供了AsyncWebRequest类型的request,并提供了处理异步请求的管理器WebAsyncManag ...

  4. SpringMVC处理客户端请求的过程

    SpringMVC处理客户端请求的过程 以程序部署在Tomcat上为例,网站程序使用SpringMVC框架开发. 1.客户端发起一个访问网站的请求(如: localhost:8080/index). ...

  5. springmvc组件组成以及springmvc的执行过程

    springmvc三大组件 处理器映射器:用户请求路径到Controller方法的映射 处理器适配器:根据handler(controlelr类)的开发方式(注解开发/其他开发) 方式的不同区寻找不同 ...

  6. SpringBoot对比SpringMVC,SpringMVC 处理请求过程

    (问较多:1.SpringBoot对比SpringMVC.2.SpringMVC 处理请求过程.问:springboot的理解 Spring,Spring MVC,Spring Boot 三者比较 S ...

  7. 在浏览器中输入URL后,执行的全部过程。会用到哪些协议?(一次完整的HTTP请求过程)

    在浏览器中输入URL后,执行的全部过程.会用到哪些协议?(一次完整的HTTP请求过程) 整个流程如下: 域名解析 为了将消息从你的PC上传到服务器上,需要用到IP协议.ARP协议和OSPF协议. 发起 ...

  8. SpringMVC的执行流程

    解析SpringMVC执行流程 SpringMVC的执行图大概如下所示 1.首先它是由客户端发起请求,到DispatcherServlet,被拦截后到HandlerMapping这里充当一个路由器,通 ...

  9. spring mvc请求过程

    spring mvc处理请求过程 1.    首先客户端发送一个HTTP请求,Web服务器接收这个请求,如果匹配DispatcherServlet的请求映射路径,web容器将请求转交给Dispatch ...

随机推荐

  1. iOS 实现 摇一摇

    摇一摇功能:调用了系统自带加速器,当设备摇动时,系统会 计算出加速器的加速值,然后告诉设备是否发生摇动手势,系统只会运动开始和结束时通知你,并不会在运动发生的整个过程中始终向你报告每一次运动.例如,你 ...

  2. mysql错误问题处理

    问题1.mysql 黑窗口出现错误 无法启动此应用程序 ,计算机中丢失MSVCP120.DLL,请重新安装 因为是从虚拟机上安装的新的系统,所以dos窗口输入mysql -v的时候出现了上述的错误,之 ...

  3. Centos610快照克隆后网络配置

    VMware中安装的Centos610快照并克隆后网络配置 1.网卡配置 vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 HWADDR ...

  4. 基于Tesseract实现图片文字识别

    一.简介  Tesseract是一个开源的文本识别[OCR]引擎,可通过Apache 2.0许可获得.它可以直接使用,或者使用API从图像中提取打印的文本,支持多种语言.该软件包包含一个ORC引擎[l ...

  5. sql注入小姿势

    利用/*!union*/可以绕过对union的过滤

  6. 世界协调时间(UTC)与中国标准时间

    整个地球分为二十四时区,每个时区都有自己的本地时间.在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated).UTC与格 ...

  7. 给博客页面添加 live2d 小萝莉

    添加依赖 在页脚HTML代码的地方添加下面的代码: <script src="https://eqcn.ajz.miesnfu.com/wp-content/plugins/wp-3d ...

  8. maven打jar包(包括依赖jar)

    <build> <plugins> <plugin> <artifactId> maven-assembly-plugin </artifactI ...

  9. Linux OS 集群 免密登录

    1. ssh-keygen  生成密钥 2. ssh-copy-id  集群主机名 参考: [图文详解]linux下配置远程免密登录

  10. Codeforces Round #600 (Div. 2) - B. Silly Mistake(模拟)

    题意:有一个公司,每天有员工进出,$a[i]>0$时表示$a[i]$这个员工进入公司,$a[i]<0$时表示$-a[i]$这个员工出公司,公司对进出办公室有一些严格的规定 员工每天最多只能 ...