`
- 浏览:
113515 次
- 性别:
- 来自:
苏州
-
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方法。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
Tomcat6 Tomcat6。0 tomcatTomcat6 Tomcat6。0 tomcatTomcat6 Tomcat6。0 tomcatTomcat6 Tomcat6。0 tomcatTomcat6 Tomcat6。0 tomcatTomcat6 Tomcat6。0 tomcatTomcat6 Tomcat6。0 tomcat
这个源码包,"apache-tomcat-6.0.43-src",是Tomcat 6的官方源代码,非常适合开发者进行深入学习和自定义修改。以下是基于这个源码包的一些关键知识点: 1. **Servlet容器**:Tomcat作为Servlet容器,其主要任务是...
标题中的“tomcat6”指的是Apache Tomcat 6,这是一个开源的应用服务器,主要用来部署和运行Java Servlet和JavaServer Pages(JSP)应用程序。在Java Web开发领域,Tomcat是应用最广泛的轻量级服务器之一,尤其对于...
在Windows环境下部署Apache Tomcat服务器是一项常见的任务,尤其对于开发和测试环境来说。在这个过程中,可能会遇到各种问题,本文将详细解析如何在Windows系统中部署Tomcat项目,并着重解决两个常见问题:数据库不...
Tomcat6、Tomcat7和Tomcat8是三个重要的版本,每个版本都有其特定的功能改进和性能提升,下面将详细介绍它们之间的差异和演化。 【Tomcat6】: Tomcat6是基于Java Servlet 2.5和JavaServer Pages 2.1标准的。这个...
总之,学习Tomcat源码不仅能够提升你对Web服务器底层工作的理解,还能够提高你在Java Web开发中的问题排查能力,让你成为一名更出色的开发者。通过阅读《How Tomcat Works》并结合实际项目实践,你将能够逐步揭开...
《Tomcat学习总结》 Tomcat,作为Java Web应用程序的开源服务器,是Apache软件基金会Jakarta项目的一个核心组件。在本文中,我们将深入探讨Tomcat 8.5版本的学习要点,包括其工作原理、配置与优化,以及在实际开发...
标题中的“tomcat6 32位系统”指的是Apache Tomcat 6版本,这是一个专为32位操作系统设计的开源Web应用服务器,主要用于部署和运行Java Servlet和JavaServer Pages(JSP)应用程序。Tomcat是Java EE(现在称为...
### Tomcat 6 学习笔记 #### 一、Tomcat 6 平台搭建与配置 ##### 1. 下载与安装 Tomcat 6 是一个免费且开源的Servlet容器,由Apache软件基金会下的Jakarta项目开发。可以通过官方网站进行下载:...
tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6tomcat6
【标题】:“Tomcat学习资料1”所涵盖的知识点包括了Tomcat服务器的使用、配置以及Web项目的部署。Tomcat是Apache软件基金会的Jakarta项目中的一个核心项目,是一款开源的Java Servlet容器,广泛用于搭建Java Web...
编写一个名为 `tomcat6` 的启动脚本,并将其放置在 `/etc/init.d/` 目录下。然后,使用 `chkconfig` 添加到开机启动: ``` chkconfig --add tomcat6 chkconfig tomcat6 on ``` 7. **配置防火墙** 如果Linux...
tomcat6、tomcat7、tocmat8、tomcat9 linux版、windox版 32位 64位
【标题】"Tomcat源码学习:一个最简单的‘Tomcat’",这篇博客主要探讨的是如何通过学习Tomcat的源代码来理解这个流行的开源Java Servlet容器的工作原理。Tomcat是Apache软件基金会的一个项目,它是Java Web应用...
【标题】:“Tomcat官网版本Tomcat+Java学习资源”是一个综合的学习资料包,主要针对的是Java开发中的关键工具——Apache Tomcat服务器以及相关的Java技术。Apache Tomcat是一款开源的Servlet容器,它实现了Java ...
最新Tomcat6
标题中的“tomcat6和tomcat7”指的是Apache Tomcat的两个不同版本。Apache Tomcat是一款开源的Java Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,是运行Java Web应用的重要服务器组件。Tomcat6...
Tomcat 7还加强了与Java EE 6的兼容性,提供了一个更稳定的运行环境。 Tomcat 8是在2013年推出的,它是Tomcat历史上最大的一次更新。这个版本引入了Servlet 3.1、JSP 2.3和EL 3.0等新规范,增加了对WebSocket的支持...
【标题】"Tomcat6-X64位"指的是Apache Tomcat服务器的一...总之,"Tomcat6-X64位"是一个方便开发者和学习者使用的64位Tomcat版本,包含了运行Java Web应用所需的所有组件,提供了一条便捷的途径进入Java Web开发世界。