博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC、Tomcat怎样完成一次Http请求的?
阅读量:6171 次
发布时间:2019-06-21

本文共 2694 字,大约阅读时间需要 8 分钟。

hot3.png

 

 

引言

都SpringMVC了为什么还要学Servlet?

今天面试一个工程师,tomcat、springmvc都懂,基础还不错,最后问了这个问题:SpringMVC、Tomcat是怎样完成一次Http请求的?

能回答说tomcat把请求分配给springmvc,具体业务逻辑由springmvc执行,听着有些含糊。

其实这个问题只是把各自独立的内容整合在一起问而已,就把面试者难住了。要回答这个问题并不难。

首先,我们来看看Tomcat、SpringMVC各自的定位和职责。

Tomcat和SpringMVC的职责

  1. Tomcat:The Apache Tomcat software is an open source implementation of the Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket technologies.
  2. SpringMVC:Spring推出的基于Servlet标准的MVC框架实现

正是因为上面的定义,程序员经常把Tomcat是一个Servlet容器,其实Tomcat实现的功能比这个要更多一些。

由上面两个的职责描述,可以看出SpringMVC和Tomcat的结合点是Servlet。其实SpringMVC的DispatchServlet实现了HttpServlet,那么SpringMVC在Tomcat看来,其实就是一个Servlet。

Tomcat和Servlet的工作原理

Tomcat作为Servlet容器,当然也可以当作web服务器直接使用,负责把接收和返回http请求。 

这里写图片描述 
下面,我们通过一个更细致的时序图来看一下具体工作过程: 
这里写图片描述

从上图我们看出一个Http的具体处理流程:

  1. Web客户向Servlet容器(Tomcat)发出Http请求
  2. Servlet容器分析客户的请求信息
  3. Servlet容器创建一个HttpRequest对象,将客户请求的信息封装到这个对象中
  4. Servlet容器创建一个HttpResponse对象
  5. Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与HttpResponse对象作为参数传给 HttpServlet对象
  6. HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息
  7. HttpServlet调用HttpResponse对象的有关方法,生成响应数据
  8. Servlet容器把HttpServlet的响应结果传给Web客户

Tomcat下Servlet的配置文件:web.xml

web.xml的作用是配置Http和Servlet之间的映射关系、filter、context参数等。这样通过这份约定的配置文件,Tomcat可以把Http请求映射到不同的Servlet实例上。所以,在Servlet时代的web.xml中,会有很多的项配置。

SpringMVC的改变

我们上面说过,SpringMVC也是Servlet的实现,只不过SpringMVC增加了一个DispatchServlet,所有的http请求都是映射到这个Servlet上,请求进入到这个Servlet中之后,就算进入到了框架之中了,由这个Servlet来统一的分配http请求到各个Controller,接下来的事情大家就清楚了

=============================================================

转载者补充:

这是SpringMVC在web.xml中的配置。可以看出SpringMVC在Tomcat看来就是一个servlet,所有请求都交由这个Servlet处理。org.springframework.web.servlet.DispatcherServlet实现了HttpServlet

springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc-servlet.xml
springmvc
/*

 这个是Struts在web中的配置。同样可以看出Struts在Tomcat看来是一个Filter,所有的请求都会先交给这个Filter处理。org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter实现了javax.servlet.Filter。Tomcat内部应该是通过调用javax.servlet.Filter的方法(在StrutsPrepareAndExecuteFilter中实现的,实际就是将请求交由Struts了)

struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*

这个是Spring在web.xml中的配置。实际就是Tomcat在启动时,会触发这个Listener,然后这个Listener里就会执行Spring的初始化、bean的创建等操作。

org.springframework.web.context.ContextLoaderListener
contextConfigLocation
classpath:applicationContext.xml

 

转载于:https://my.oschina.net/henryking/blog/1512479

你可能感兴趣的文章
mask rcnn和roi-align
查看>>
在WPF应用程序中利用IEditableObject接口实现可撤销编辑的对象
查看>>
Java9 modules (Jigsaw)模块化迁移
查看>>
Java数据结构之线性表
查看>>
csharp:using Newtonsoft.Json.Net2.0 in .net 2.0 webform
查看>>
Web前端开发工程师必读的15个设计博客
查看>>
Mozilla公布Firefox 2011年开发计划
查看>>
使用WC“.NET研究”F实现SOA面向服务编程——简单的WCF开发实例
查看>>
GetHashCode(一)为啥 如何重写
查看>>
修炼九阴真经Windows Phone开发 (12):计划任务Background Schedule Tasks总结及示例
查看>>
iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一)
查看>>
(译+原)std::shared_ptr及std::unique_ptr使用数组
查看>>
C语言 三级指针的应用
查看>>
【转】WinForm不同版本覆盖安装
查看>>
idea 自动根据屏幕代码换行
查看>>
Linux进程管理专题
查看>>
SilverLight单元测试1:框架
查看>>
QQ强制聊天工具,教你如何强制用QQ与陌生人聊天
查看>>
在VS中查看文件是谁签出的
查看>>
指针参数 引用参数
查看>>