`
youyun_2008
  • 浏览: 114641 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

学习tomcat 小记(6)

阅读更多
StandardWrapper

tomcat中有4种类型的container:engine, host, context, wrapper。
一般情况下,context中包含一个或多个wrapper,每个wrapper表示一个servlet定义。

1)方法调用序列
对与每个接收到的http请求,connector调用与其关联的container的invoke方法,然后,container会调用其子container的invoke方法。例如,若connector与一个StandardContext相关联,那么connector会调用StandardContext实例的invoke方法,而StandardContext实例会调用其子container的invoke方法(本例中就是调用StandardWrapper的invoke方法)。

具体过程如下:
(1)connector创建request和response对象;
(2)connector调用StandardContext实例的invoke方法;
(3)StandardContext接着调用其pipeline的invoke方法,StandardContext中pipeline的basic valve是StandardContextValve,因此,StandardContext的pipeline会调用StandardContextValve的invoke方法;
(4)StandardContextValve的invoke方法获取wrapper处理请求,调用wrapper的invoke方法;
(5)StandardWrapper是Wrapper接口的标准实现,StandardWrapper实例的invoke方法会调用其pipeline的invoke方法;
(6)StandardWrapper的pipeline中的basic valve是StandardWrapperValve,因此,会调用其invoke方法,StandardWrapperValve调用wrapper的allocate方法获取servlet实例;
(7)allocate方法调用load方法载入servlet类,若已经载入,则无需重复载入;
(8)load方法调用servlet的init方法;
(9)StandardWrapperValve调用servlet的service方法。


2)SingleThreadModel
若servlet类实现了SingleThreadModel接口,则可以保证绝不会有两个线程同时执行某个servlet的service方法。servlet容器是通过控制对单一servlet实例的同步访问实现,或者维护一个servlet对象池,然后将每个新请求分发到一个新的servlet实例上。该接口并不能防止servlet访问共享资源造成的同步问题,例如访问类的静态变量或访问servlet作用域之外的类。

事实上,实现了SingleThreadModel接口的servlet只保证在同一时刻,只有一个线程在执行servlet的service方法。但是,为了提高效率,servlet容器会创建多个STM servlet实例。也就是说,STM servlet的service方法会在多个STM servlet实例中并发执行。这就有可能引起同步问题。
在servlet2.4中,SingleThreadModel已经被标识为deprecated,因为它会是程序员误以为实现了该接口的servlet就是线程安全的。但,servlt2.3和servlet2.4都还对该接口提供了支持。

3)StandardWrapper
StandardWrapper对象的主要任务是载入它所表示的servlet,并进行实例化。但是,StandardWrapper类并不调用servlet的service方法。该任务由StandardWrapperValve对象(StandardWrapper实例中pipeline的basic valve)完成。StandardWrapperValve对象通过allocate方法从StandardWrapper中获取servlet实例,并调用servlet的service方法。

如果,StandardWrapper通过单例模式使用STM servlet,下面是实现代码:
Servlet instance = <get an instance of the servlet>;
//同步锁的变量instance必须大于该方法范围。

    if (<servlet implementing SingleThreadModel>)  {
      synchronized (instance) {
        instance.service(request, response);
      }
    }
    else {
        instance.service(request, response);
    }
但是,为了更好的性能,StandardWrapper会维护一个STM servlet的对象池。

生成servlet
StandardWrapperValve调用wrapper的allocate方法获取某个指定的servlet对象。StandardWrapper类要负责实现allocate方法。

载入servlet
StandardWrapper类实现了Wrapper接口的load方法,load方法调用loadServlet方法载入servlet类,并调用其init方法(此时要传入一个javax.servlet.ServletConfig实例作为参数)。
loadServlet方法首先会检查当前的StandardWrapper类是不是一个STM servlet,若不是,且变量instance不为null(表示以前已经载入过这个类),就直接返回该引用

ServletConfig对象
StandardWrapper类的loadServlet方法在载入servlet后会调用init方法。init方法需要传入一个javax.servlet.ServletConfig实例作为参数。StandardWrapper类实现了javax.servlet.ServletConfig接口和Wrapper接口。在ServletConfig接口有以下几个方法:getServletContext,getServletName,getInitParameter和getInitParameterNames。接下来分别说明这几个方法的实现。
注意,StandardWrapper类并不将自身实例传给init方法,而是将自身的包装类StandardWrapperFacade的实例传入,这样就很好的将一些public方法隐藏起来了,防止被servlet程序员调用。


StandardWrapperValve类

StandardWrapperValve类是StandardWrapper实例的basic valve,要做两件事:
(1)执行与该servlet关联的全部过滤器 ;
(2)调用servlet的service方法。

为完成上述任务,在StandardWrapperValve的invoke方法中会做以下几件事:
(1)获取servlet实例;
(2)调用私有方法createFilterChain,创建过滤器链;
(3)调用过滤器链的doFilter方法,包括调用servlet的service方法;
(4)释放过滤器链;
(5)调用wrapper的deallocate方法;
(6)若该servlet再也不会被使用到,调用wrapper的unload方法。


FilterDef类
org.apache.catalina.deploy.FilterDef类表示了一个filter定义

ApplicationFilterConfig类
org.apache.catalina.core.ApplicationFilterConfig类实现了javax.servlet.FilterConfig接口。ApplicationFilterConfig类用于管理web应用中的filter。通过传入一个org.apache.catalina.Context实例和一个FilterDef实例创建一个ApplicationFilterConfig实例。

ApplicationFilterChain类
org.apache.catalina.core.ApplicationFilterChain类实现了javax.servlet.FilterChain接口,StandardWrapperValve对象的invoke方法会创建ApplicationFilterChain对象,并调用其doFilter方法。ApplicationFilterChain类的doFilter方法会调用过滤器链中第一个过滤器的doFilter方法。

分享到:
评论

相关推荐

    Tomcat6 Tomcat6。0

    Tomcat6 Tomcat6。0 tomcatTomcat6 Tomcat6。0 tomcatTomcat6 Tomcat6。0 tomcatTomcat6 Tomcat6。0 tomcatTomcat6 Tomcat6。0 tomcatTomcat6 Tomcat6。0 tomcatTomcat6 Tomcat6。0 tomcat

    tomcat6的源码

    这个源码包,"apache-tomcat-6.0.43-src",是Tomcat 6的官方源代码,非常适合开发者进行深入学习和自定义修改。以下是基于这个源码包的一些关键知识点: 1. **Servlet容器**:Tomcat作为Servlet容器,其主要任务是...

    tomcat6,用于idea适配低版本的tomcat

    标题中的“tomcat6”指的是Apache Tomcat 6,这是一个开源的应用服务器,主要用来部署和运行Java Servlet和JavaServer Pages(JSP)应用程序。在Java Web开发领域,Tomcat是应用最广泛的轻量级服务器之一,尤其对于...

    windows下部署tomcat项目小记

    在Windows环境下部署Apache Tomcat服务器是一项常见的任务,尤其对于开发和测试环境来说。在这个过程中,可能会遇到各种问题,本文将详细解析如何在Windows系统中部署Tomcat项目,并着重解决两个常见问题:数据库不...

    tomcat 版本6、7、8

    Tomcat6、Tomcat7和Tomcat8是三个重要的版本,每个版本都有其特定的功能改进和性能提升,下面将详细介绍它们之间的差异和演化。 【Tomcat6】: Tomcat6是基于Java Servlet 2.5和JavaServer Pages 2.1标准的。这个...

    学习tomcat源码+英文《How Tomcat Work》和每一章的相关项目+tomcat6源码依赖jar

    总之,学习Tomcat源码不仅能够提升你对Web服务器底层工作的理解,还能够提高你在Java Web开发中的问题排查能力,让你成为一名更出色的开发者。通过阅读《How Tomcat Works》并结合实际项目实践,你将能够逐步揭开...

    Tomcat学习总结.zip

    《Tomcat学习总结》 Tomcat,作为Java Web应用程序的开源服务器,是Apache软件基金会Jakarta项目的一个核心组件。在本文中,我们将深入探讨Tomcat 8.5版本的学习要点,包括其工作原理、配置与优化,以及在实际开发...

    tomcat6 32位系统

    标题中的“tomcat6 32位系统”指的是Apache Tomcat 6版本,这是一个专为32位操作系统设计的开源Web应用服务器,主要用于部署和运行Java Servlet和JavaServer Pages(JSP)应用程序。Tomcat是Java EE(现在称为...

    tomcat6学习笔记【原创】

    ### Tomcat 6 学习笔记 #### 一、Tomcat 6 平台搭建与配置 ##### 1. 下载与安装 Tomcat 6 是一个免费且开源的Servlet容器,由Apache软件基金会下的Jakarta项目开发。可以通过官方网站进行下载:...

    tomcat6免安裝版

    tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6

    Tomcat学习资料1

    【标题】:“Tomcat学习资料1”所涵盖的知识点包括了Tomcat服务器的使用、配置以及Web项目的部署。Tomcat是Apache软件基金会的Jakarta项目中的一个核心项目,是一款开源的Java Servlet容器,广泛用于搭建Java Web...

    Tomcat 6 Linux版

    编写一个名为 `tomcat6` 的启动脚本,并将其放置在 `/etc/init.d/` 目录下。然后,使用 `chkconfig` 添加到开机启动: ``` chkconfig --add tomcat6 chkconfig tomcat6 on ``` 7. **配置防火墙** 如果Linux...

    tomcat6、tomcat7、tocmat8、tomcat9 linux版、windox版百度云

    tomcat6、tomcat7、tocmat8、tomcat9 linux版、windox版 32位 64位

    Tomcat源码学习:一个最简单的“Tomcat”

    【标题】"Tomcat源码学习:一个最简单的‘Tomcat’",这篇博客主要探讨的是如何通过学习Tomcat的源代码来理解这个流行的开源Java Servlet容器的工作原理。Tomcat是Apache软件基金会的一个项目,它是Java Web应用...

    tomcat官网版本Tomcat+Java学习资源

    【标题】:“Tomcat官网版本Tomcat+Java学习资源”是一个综合的学习资料包,主要针对的是Java开发中的关键工具——Apache Tomcat服务器以及相关的Java技术。Apache Tomcat是一款开源的Servlet容器,它实现了Java ...

    最新Tomcat6

    最新Tomcat6

    tomcat6和tomcat7

    标题中的“tomcat6和tomcat7”指的是Apache Tomcat的两个不同版本。Apache Tomcat是一款开源的Java Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,是运行Java Web应用的重要服务器组件。Tomcat6...

    tomcat6到8windows版本.zip

    【标题】"tomcat6到8windows版本.zip" 涵盖了三个不同版本的Apache Tomcat,分别是Tomcat 6、Tomcat 7和Tomcat 8.5,这些都是针对Windows操作系统设计的64位版本。Apache Tomcat是一款开源的Java Servlet容器,主要...

    tomcat7tomcat8tomcat9

    Tomcat 7还加强了与Java EE 6的兼容性,提供了一个更稳定的运行环境。 Tomcat 8是在2013年推出的,它是Tomcat历史上最大的一次更新。这个版本引入了Servlet 3.1、JSP 2.3和EL 3.0等新规范,增加了对WebSocket的支持...

Global site tag (gtag.js) - Google Analytics