关闭

tomcat中Servlet的工作机制

标签: tomcatservletwrapper规范
5432人阅读 评论(8) 收藏 举报
分类:

在研究Servlet在tomcat中的工作机制前必须先看看Servlet规范的一些重要的相关规定,规范提供了一个Servlet接口,接口中包含的重要方法是init、service、destroy等方法,Servlet在初始化时要调用init方法,在销毁时要调用destroy方法,而对客户端请求处理时则调用service方法。对于这些机制的支持都必须由Tomcat内部去支持,具体则是由Wrapper容器提供支持。

在tomcat中消息流的流转机制是通过四个不同级别的容器管道机制进行流转的,对于每个请求都是一层一层处理的。如下图,当客户端请求到达服务端后请求被抽象成request对象后向四个容器进行传递,首先经过Engine容器的管道通过若干阀门,最后通过StandardEngineValve阀门流转到Host容器的管道,处理后继续往下流转,通过StandardHostValve阀门流转到Context容器的管道,继续往下流转,通过StandardContextValve阀门流转到Wrapper容器的管道,而对Servlet的核心处理也正是在StandardWrapperValve阀门中。StandardWrapperValve阀门调用Servlet的service方法队请求进行处理,然后对客户端响应。

这里写图片描述

下面更深入了解下StandardWrapperValve阀门调用Servlet的过程。
web应用的Servlet类都是根据Servlet接口,例如一般我们在写业务处理Servlet类时都会继承HttpServlet类,为了遵循Servlet规范,它其实最终也是实现了Servlet接口,只是HttpServlet定义了HTTP协议的Servlet,将协议共性的东西抽离出来复用。Servlet处理客户端请求的核心方法为service方法,所以对于HttpServlet来说,它需要针对http协议的GET、POST、PU、DELETE、HEAD、OPTIONS、TRACE等请求方法做出不同的分发处理,为方便理解,下面用个简化的代码展示:

public abstract class HttpServlet extends Servlet{
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        HttpServletRequest  request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        String method = req.getMethod();
        if (method.equals("GET")) {
            doGet(request, response);
        }else if (method.equals("POST")) {
            doPost(request, response);
        }else if (method.equals("HEAD")) {
            doHead(request, response);
        } 
    }
protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
}

service方法将请求对象和响应对象转换成HttpServletRequest和HttpServletResponse,然后获取请求方法,根据请求方法调用不同的处理方法,例如如果为GET方法则调用doGet方法,那么在继承了HttpServlet类的Servlet只需重写doGet或doPost方法完成业务逻辑处理,这就是我们熟悉的Servlet了。

这样一来,StandardWrapperValve阀门调用Servlet的工作其实就是通过反射机制实现对Servlet对象的控制,例如在不配置load-on-startup情况下,客户端首次访问该Servlet时由于还不存在该Servlet对象,需要通过反射机制实例化出该Servlet对象,并且调用初始化方法,所以这也是为什么第一次访问某个Servlet时会比较耗时的原因,后面客户端再对该Servlet访问时都会使用该Servlet对象,无需再做实例化和初始化操作。有了Servlet对象后调用其service方法即完成了对客户端请求的处理。
实际上通过反射机制实例化Servlet对象是一个比较复杂的过程,它除了完成实例化和初始化工作外还要解析该Servlet类包含的各种注解并作处理,另外,对于实现了SingleThreadModel接口的Servlet类,它还要维护一个该Servlet对象池。

综上所述,Servlet工作机制大致流程是:request -> StandardEngineValve -> StandardHostValve -> StandardContextValve -> StandardWrapperValve -> 实例化并初始化Servlet对象 -> 调用该Servlet对象的service方法 -> response。

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

公众号的菜单已分为“分布式”、“机器学习”、“深度学习”、“NLP”、“Java深度”、“Java并发核心”、“JDK源码”、“Tomcat内核”等,可能有一款适合你的胃口。

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以购买。感谢各位朋友。

为什么写《Tomcat内核设计剖析》

============================================
点击订购作者《Tomcat内核设计剖析》

博主的书

5
2
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Tomcat装载Servlet的三种情况

1.Servlet容器启动时自动装载某些Servlet,实现它只需要在web.xml文件中的之间添加如下代码:1数字越小表示优先级别越高。       TestServlet1     servlet.TestServlet1   ...
  • gplihf
  • gplihf
  • 2016-05-25 10:19
  • 890

Servlet运行机制与生命周期

前面的例子可以看出,一个Servlet在服务器上最多只会驻留一个实例,在此期间会涉及到HttpServlet的方法,如下所示: 在编写Servlet程序时,都是让它继承HttpServlet这个类,然后根据需要去覆盖HttpServlet中的方法。比较常用的方法有:init()...
  • suwu150
  • suwu150
  • 2016-05-24 09:03
  • 6145

Tomcat运行机制及工作原理

  • 2011-06-28 10:12
  • 2.49MB
  • 下载

Tomcat工作原理详解

Tomcat简介   作者:杨晓(http://blog.sina.com.cn/u/1237288325) 一、Tomcat背景   自从JSP发布之后,推出了各式各样的JSP引擎。Apache Group在完成GNUJSP1.0的开发以后,开始考虑在SUN的JSWD...
  • res_cue
  • res_cue
  • 2014-03-22 00:41
  • 76984

Servlet工作机制解析

一、Web容器 在研究Servlet在tomcat中的工作机制前必须先看看Servlet规范的一些重要的相关规定,规范提供了一个Servlet接口,接口中包含的重要方法是init、service、destroy等方法,Servlet在初始化时要调用init方法,在销毁时要调用destroy方法,而...
  • supersnow0622
  • supersnow0622
  • 2017-01-18 17:32
  • 570

Servlet的运行机制

  • 2014-05-13 09:39
  • 16KB
  • 下载

tomcat 架构 分析

  • 2014-11-13 09:15
  • 968KB
  • 下载

Tomcat源码分析(一)------ 架构

废话少说,拉代码,导入eclipse开干,具体步骤可以参考http://hi.baidu.com/hateeyes/blog/item/7f44942a20ad8f9d023bf66d.html下面谈谈我对Tomcat架构的理解总体架构:面向组件架构基于JMX事件侦听1)面向组件架构tomcat代码...
  • cutesource
  • cutesource
  • 2009-12-14 19:51
  • 84991

tomcat 运行机制

一、Tomcat背景   自从JSP发布之后,推出了各式各样的JSP引擎。Apache Group在完成GNUJSP1.0的开发以后,开始考虑在SUN的JSWDK基础上开发一个可以直接提供Web服务的JSP服务器,当然同时也支持Servlet, 这样Tomcat就诞生了。Tomcat是jakart...
  • frank_good
  • frank_good
  • 2015-09-02 10:48
  • 5142

Tomcat整体架构浅析

整体结构 1各组件解释 组件包含关系 其它组件 2组件的生命线Lifecycle 启动流程 pipeline valve机制 1名词解释 2总体分析 3接口及默认实现 pipeline Valve Value继承体系类图 自定义Valve Tomcat中的设计模式 1模板方法模式 2责任链模式 3观...
  • cx520forever
  • cx520forever
  • 2016-10-07 10:30
  • 3354
    作者
    https://github.com/sea-boat

    公众号:(内容包括分布式、机器学习、深度学习、NLP、Java深度、Java并发核心、JDK源码、Tomcat内核等等)



    微信:

    打赏作者

    如果您觉得作者写的文章有帮助到您,您可以打赏作者一瓶汽水(*^__^*)

    个人资料
    • 访问:1020517次
    • 积分:13638
    • 等级:
    • 排名:第1096名
    • 原创:321篇
    • 转载:5篇
    • 译文:1篇
    • 评论:342条
    博客专栏
    最新评论