tomcat中Servlet的工作机制

在研究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。

时间: 2024-12-27 07:56:30

tomcat中Servlet的工作机制的相关文章

Tomcat中JSP引擎工作原理

http://blog.csdn.net/linjiaxingqqqq/article/details/7164449 JSP运行环境: 执行JSP代码需要在服务器上安装JSP引擎,比较常见的引擎有WebLogic和Tomcat.把这些支持JSP的web服务器配置好后.就可以再客户端通过浏览器来访问JSP页面了.默认端口一般是7001. JSP生命周期: JSP处理请求的方法就是把这些请求都统一看做Servlet.由于这个原因,JSP的很多功能和生命周期,都由Java Servlet技术标准定义

关于tomcat中Servlet对象池

Servlet在不实现SingleThreadModel的情况下运行时是以单个实例模式,如下图,这种情况下,Wrapper容器只会通过反射实例化一个Servlet对象,对应此Servlet的所有客户端请求都会共用此Servlet对象,而对于多个客户端请求tomcat会使用多线程处理,所以应该保证此Servlet对象的线程安全,多个线程不管执行顺序如何都能保证执行结果的正确性.例如刚做web应用开发时可能会犯的一个错误:在某个Servlet中使用成员变量累加去统计访问次数,这就存在线程安全问题.

【Tomcat】Servlet 工作原理解析

Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的基本要求.本文将带你认识 Java Web 技术是如何基于 Servlet 工作,你将知道:以 Tomcat 为例了解 Servlet 容器是如何工作的?一个 Web 工程在 Servlet 容器中是如何启动的? Servlet 容器如何解析你在 web.xml 中定义的 Servlet ?用户的请

通过库函数API和C代码中嵌入汇编代码剖析系统调用的工作机制

作者:吴乐 山东师范大学<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本次实验的主要内容就是分别采用API和gcc嵌入汇编的方式调用system_call.系统调用其实就是操作系统提供的服务.我们平时编写的程序,如果仅仅是数值计算,那么所有的过程都是在用户态完成的,但是我们想将变量打印在屏幕上,就必须调用printf,而printf这个函数内部就使用了write这个系统调用.操作系统之所以以system ca

Scrapy(爬虫框架)中,Spider类中parse()方法的工作机制

parse(self,response):当请求url返回网页没有指定回调函数,默认的Request对象的回调函数,用来处理网页返回的response,和生成的Item或者Request对象 以下分析一下parse()方法的工作机制: 1.因为使用的yield,而不是return,parse函数将会当做一个生成器使用,scrapy会注意调用parse方法中生成的结果,并且判断该结果是一个什么样的类型 2.如果是request则会加入爬取队列中,如果是item类型则会使用pipeline处理,其他

HDFS中DataNode工作机制

1.DataNode工作机制 1)一个数据块在datanode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据(包括数据块的长度,块数据的校验和,以及时间戳). 2)DataNode启动后向namenode注册,通过后,周期性(1小时)的向namenode上报所有的块信息. 3)心跳是每3秒一次,心跳返回结果带有namenode给该datanode的命令如复制块数据到另一台机器,或删除某个数据块.如果超过10分钟没有收到某个datanode的心跳,则认为该节点不可用. 4)集

深入struts2(三)---工作机制和运行流程图

1     工作原理 1.1     体系架构 图2.1 struts2.0体系架构图 1.2     工作机制 针对上节体系架构图,以下分步说明运行流程 ?  client初始化一个指向Servlet容器(比如Tomcat)的请求: ?  这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其它框架的集成非常有帮助,比如:SiteMesh Plugin): 注:从struts2.1.3后就不须要配

[转]Tomcat中的Session小结

阅读目录 什么是Session Session的目的 实现机制 Tomcat中的session实现 session存在的问题 什么是Session 对Tomcat而言,Session是一块在服务器开辟的内存空间,其存储结构为ConcurrentHashMap: Session的目的 Http协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录: Session的主要目的就是为了弥补Http的无状态特性.简单的说,就是服务器可以利用sess

Tomcat 中的 JDBC Pool

什么是连接池 什么是 Connection Pool -- 连接池呢? 我就不解释了.不太清楚的看这篇文章 [生产级别Nodejs开发实践-使用连接池](这篇文章的前半部分讲述了什么是连接池) Tomcat中的jdbc连接池 它的英文文档在:[The Tomcat JDBC Connection Pool] Tomcat 不仅是非常受欢迎的 Servlet 容器,也是同时为我们提供了很多非常实用组件. jdbc pool 就是其中一个非常实用且高效的 jdbc 连接池的实现. Tomcat 官方