已经是SpringMVC了为什么还要学Servlet?
今天我面试了一个工程师。tomcat和springmvc都懂,基础不错。最后问了这个问题:SpringMVC和Tomcat是如何完成一个Http请求的?可以说tomcat把请求分配给springmvc,具体的业务逻辑由springmvc执行,听起来有点模糊。其实这次失败只是把他们独立的内容放在一起问,难倒了面试官。这个问题不难回答。
首先,我们来看看Tomcat和SpringMVC各自的定位和职责。
Tomcat和SpringMVC的职责
Tomcat:Apache Tomcat软件是Java Servlet、JavaServer Pages、Java Expression Language和Java WebSocket技术的开源实现。
Spring MVC:Spring推出的基于Servlet标准的MVC框架的实现。
由于上面的定义,程序员通常将Tomcat视为一个Servlet容器。其实Tomcat实现的功能不止这些。
从上面两个职责的描述可以看出,SpringMVC和Tomcat的结合就是Servlet。其实SpringMVC的DispatchServlet实现的是HttpServlet,所以SpringMVC在Tomcat看来其实就是一个Servlet。
Tomcat和Servlet如何工作
Tomcat作为Servlet容器,当然也可以直接用作web服务器,负责接收和返回http请求。
Tomcat和Servlet的工作原理
下面,我们通过更详细的时序图来看看具体的工作过程:
Tomcat和Servlet时序图
从上图我们可以看到Http的具体处理流程:
Web向Servlet容器(Tomcat)发出Http请求。
Servlet容器分析客户的请求信息
Servlet创建一个HttpRequest对象,并将客户请求的信息封装到这个对象中。
Servlet容器创建一个HttpResponse对象。
Servlet容器调用HttpServlet对象的服务方法,以HttpRequest对象和HttpResponse对象为参数。
传递给HttpServlet对象
HttpServlet调用HttpRequest对象的相关方法来获取Http请求信息。
HttpServlet调用HttpResponse对象的相关方法生成响应数据。
Servlet容器将HttpServlet的响应结果发送给Web客户端。
Tomcat下Servlet的配置文件:web.xml
web.xml的作用是配置Http和Servlet的映射关系,过滤器,上下文参数等。有了这个同意的配置文件,Tomcat可以将Http请求映射到不同的Servlet实例。所以在Servlet时代的web.xml中,会有很多项的配置。
SpringMVC的变化
我们上面说过,SpringMVC也是Servlet的实现,只不过SpringMVC增加了一个DispatchServlet,所有的http请求都映射到这个Servlet上。请求进入这个Servlet后,即使进入框架,这个Servlet也会把http请求统一分发到所有控制器,接下来的事情大家都清楚了。
PS:最后给大家一些建议:
很多人问我为什么有了SpringMVC还需要学习Servlet?如果我能给这篇文章加个小标题,我会加的。好吧,我就当它是标题吧。
技术学习一定要认真,多问问题。比如http服务器、web服务器、应用服务器都是常用的名称。两者有什么区别?
多想想自己学到了什么,尤其是现在很多同学都是通过微信号一条一条的学习文章学习,甚至学的不多。它们直接来自百度,所以要注意把点连成线,把线展开成面。