Chapter 5: Container
Chapter 5: Container
A container is a module that processes the requests for a servlet and populates the response objects for web clients. A container is represented by the org.apache.catalina.Container interface and there are four types of containers: Engine, Host, Context, Wrapper. This chapter covers Context and Wrapper and leaves Engine and Host to Chapter 13. This chapter starts with the discussion of the Container interface, followed by the piplining mechanism in a container. It then looks at the Wrapper and Context interfaces by presenting 2 applications.
The Container Interface
A container must implements org.apache.catalina.Container interface. Recall the folling the code from the Bootstrap class in the application in Chapter 4.
HttpConnector connector = new HttpConnector();
SimpleContainter container = new SimpleContainer();
connector.setContainer(container);
The first thing to note about containers in Catalina is that there are four types of containers at different conceptual levels:
- Engine. Represents the entire Catalina servlet engine.
- Host. Represents a virtual host with a number of contexts
- Context. Represents a web application. A context contains one or more wrappers.
- Wrapper. Represents an individual servlet.
Figure 5.1 shows the class diagram of the Container interface and its sub-interfaces and implementations. Note that all interfaces are part of the org.apache.catalina package and all classes are part of the org.apache.catalina.core package.

A functional Catalina deployment does not need all the 4 types of containers. For example, the container module in this chapter's first application consists of only a wrapper.
A container can have zero or more child containers of the lower level. For instance, a context normally has one or more wrappers and a host can have zero or more context. However, a wrapper, being the lowest in the hierachy, cannot contain a child container. There are serveral methods in the Container interface.
public void addChild(Container child);
public void removeChild(Conainter child);
public Container findChind(String name);
public Container[] findChildren();
A container can also contain a number of support components such as Loader, Logger, Manager, Realm, and Resources. We will discuss thest components in later chapter.
More interestingly, the Container interface has been designed in such a way that at the time of deployment, a Tomcat administrator can determine what a container performs by editing the configuration file(server.xml). This is achieved by introducing a pipline and a set of valves in a container, which we'll disucss in the next section, "Piplining Tasks".
Note: The container interface in Tomcat 4 is slightly different from that in Tomcat 5. For example, in Tomcat 4 this interface has a map method, which no longer exists in the Container interface in Tomcat 5.
Piplining Tasks
This section explain what happens when a container's invoke method is called by the connector.
A pipeline contains tasks that the container will invoke. A valve represents a specific task. There is one basic valve in a container's pipeline, but you can add as many valves as you can. The number of valves is defined to be the number of additional valves, i.e. not including the basic valve. Vavles can be added dynamically by editing Tomcat's configuration file(server.xml).
If you understand servlet filters, it is no hard to imagine how a pipeline and its valves work. A pipeline is like a fiter chain and each valve is filter. Like a filter, a valve can manipulate the request and response objects passed to it. After a valve finishes processing, it calls the next valve in the pipeline. The basic valve is always called the last.
A container can have one pipeline.
When a container's invoke method is called, the container passes processing to its pipeline and the pipeline invokes the first valve in it, which will then invoke the next valve, and so on, until there is no more valve in the pipeline. You might imagine that you have the following pseudo code inside the pipeline's invoke method:
// invoke each valve added to the pipeline
for(i=0; i<valves.length; i++) {
valves[i].invoke(...);
}
// then, invoke the basic valve
basicValve.invoke(....);
Howere, the tomcat designer chose a different approach by introducing the org.apache.cataline.ValveContext interface. Here is how it works.
A container does not hard code what it is supposed to do when its invoke method is called by the connector. Instead, the container calls its pipeline's invoke method. The Pipeline interface's invoke method has the following signature, which is exactly the same as the invoke method of the Container interface.
public void invoke(Request request, Response response) throws IOException, ServletException;
Here is the implementation of the Container interface's invoke method in the org.apache.catalina.core.ContainerBase class.
public void invoke(Request request, Response response) throws IOException, ServletException {
pipeline.invoke(request, response);
}
where pipeline is an instance of the Pipeline interface inside the container.
Now, the pipeline has to make sure that all the valves added to it as well as its basic valve must be invoked once. The pipeline does this by creating an instance of the ValveContext interface. The ValveContext is implemented as an inner class of the pipeline so that the ValveContext has access to all members of the pipeline. The most important method of the ValveContext interface is:
public void invokeNext(Request request, Response response) throws IOException, ServletException;
The Wrapper Interface
The Context Interface
The Wrapper Application
The Context Application
Summary
Chapter 5: Container的更多相关文章
- qt 总结
Qt中的每个类,都有一个对应的同名头文件,其中包含其类定义.例如要使用QApplication类,则需要在程序中添加" #include <QApplication>" ...
- Unity文档阅读 第三章 依赖注入与Unity
Introduction 简介In previous chapters, you saw some of the reasons to use dependency injection and lea ...
- Chapter 2: A Simple Servlet Container
一.这一章从头构建一个简单的Servlet容器,可以处理Servlet和静态资源(如html文件/图片等). 要处理Servlet,必须遵循javax.servlet.Servlet规范,而处理静态资 ...
- Chapter 4: Tomcat Default Connector
一.概述 第三章介绍的connector是一个很好的学习工具,但是我们还可以做的更多.这一章介绍的是Tomcat4默认的connector. 一个Tomcat的connector是一个独立的模块,能够 ...
- Chapter 3: Connector(连接器)
一.概述 Tomcat或者称之为Catalina(开发名称),可以简化为两个主要的模块,如下图: 多个Connector关联一个Container.之所以需要多个Connector,是为了处理多种协议 ...
- Spring Batch Concepts Chapter
Spring Batch Concepts Chapter The below figure shows two kinds of Spring Batch components:infrastruc ...
- JavaScript- The Good Parts Chapter 5 Inheritance
Divides one thing entire to many objects;Like perspectives, which rightly gazed uponShow nothing but ...
- JavaScript- The Good Parts Chapter 3 Objects
Upon a homely object Love can wink.—William Shakespeare, The Two Gentlemen of Verona The simple type ...
- Chapter 6 — Improving ASP.NET Performance
https://msdn.microsoft.com/en-us/library/ff647787.aspx Retired Content This content is outdated and ...
随机推荐
- [Java] 数据库连接管理类
package com.wdcloud.monitoring.common; /** * @Description: TODO * @date: 2015��11��19�� ����10:23:16 ...
- OSVERSIONINFO
OSVERSIONINFO结构 OSVERSIONINFO结构包含了操作系统的版本信息,包括操作系统的主版本号.副版本号.创建号.以及操作系统平台ID号和关于操作系统的其他描述信息.其定义为: typ ...
- hdu-----(2807)The Shortest Path(矩阵+Floyd)
The Shortest Path Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 张艾迪Eidyzhang:解码天才Eidyzhang的诞生
AOA解码:天才Eidyzhang的诞生AOA深度解读:世界第一天才Eidyzhang: (TheWorldNo.1Girl+TheWorldNo.1InterentGirl+世界第一女孩+世界第一互 ...
- iOS项目的目录结构和开发流程
转自无网不剩的博客 网上相关的资源不多,开源的且质量还不错的iOS项目也是少之又少,最近正好跟同事合作了一个iOS项目,来说说自己的一些想法. 目录结构 AppDelegate Models Ma ...
- Testin
http://www.testin.cn/ http://news.ccidnet.com/art/66/20150416/5815927_1.html 百度百科上面的 Testin是全球最大的移 ...
- WordPress怎么在页面上添加目录
要实现的如下功能,在页面上添加一个文章目录: 步骤: 1)在wordpress中,在Posts----Categories中建立目录, 2) 3)add new post,指定post所属的cat ...
- 用HTML5实现手机摇一摇的功能(转)
在百度开发者大会上我介绍过HTML5另外一个重要特性就是DeviceOrientation,它将底层的方向传感器和运动传感器进行了高级封装,提供了DOM事件的支持.这个特性包括两种事件: 1.devi ...
- spring+springmvc+mybatis整合
1.web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app version=&qu ...
- HookSSDT 通过HookOpenProcess函数阻止暴力枚举进程
首先要知道Ring3层调用OpenProcess的流程 //当Ring3调用OpenProcess //1从自己的模块(.exe)的导入表中取值 //2Ntdll.dll模块的导出表中执行ZwOpen ...