《深入剖析tomcat》读书笔记3--servlet容器

本文详细解读了《深入剖析Tomcat》中关于Servlet容器的关键点,包括Pipeline的概念及Valve的执行顺序,StandardWrapper处理HTTP请求的调用序列,以及基础阀加载Servlet的过程。同时,讨论了Filter在Tomcat中的位置和调用顺序,解释了容器的层级结构(Engine、Host、Context、Wrapper),以及Wrapper如何管理Servlet的生命周期。
摘要由CSDN通过智能技术生成

主要是《深入剖析tomcat》的第五章和第十一章。个人觉得如下3点是关键:

1. pipeline相关概念及其执行valve的顺序;

2. standardwrapper的接受http请求时候的调用序列;

3. standardwrapper基础阀加载servlet的过程(涉及到STM);

顺便问一句,应该每一个servlet程序员都知道filter。但是你知道Filter在tomcat的哪一个地方出现的吗?答案是standardwrapper基础阀会创建Filter链,并调用doFilter()方法

servlet容器的作用

管理servlet资源,并为web客户端填充response对象。

不同级别的容器

Engine:表示整个Catalina的servlet引擎、

Host:表示一个拥有数个上下文的虚拟主机

Context:表示一个Web应用,一个context包含一个或多个wrapper

Wrapper:表示一个独立的servlet

容器都实现了Container接口,继承了ContainerBase抽象类。

管道任务

3个概念:pipeline、valve、valveContext

pipeline包含servlet容器将要调用的任务集合,定义如下:

public interface Pipeline { 
public Valve getBasic(); 
public void setBasic(Valve valve); 
public void addValve(Valve valve); 
public Valve[] getValves(); 
public void invoke(Request request, Response response) throws IOException, ServletException; 
public void removeValve(Valve valve);
}

valve表示一个具体的执行任务,定义如下:

public interface Valve { 
	public String getInfo(); 
	public void invoke(Request request, Response response, ValveContext context) throws IOException, ServletException;
}

valveContext按照字面意思就是阀门的上下文,用于遍历valve

public interface ValveContex{ 
	public String getInfo(); 
	public void invokeNext(Request request, Response response) throws IOException, ServletException;
}

valveContext的invokeNext()方法的实现:

public final void invokeNext(Request request, Response response) throws IOException, ServletException { 
	int subscript = stage; stage = stage + 1;
	if (subscript < valves.length) 
		{ valves[subscript].invoke(request, response, this); } 
			else if ((subscript == valves.length) && (basic != null)) 
				{ 
					basic.invoke(request, response, this); 
					}
				else 
				{ 
					throw new ServletException (sm.getString("standardPipeline.noValve"));
				} 
			}

一个阀门的invoke方法可以如下实现:

public void invoke(Request request, Response response, ValveContext valveContext) throws IOException, ServletException {  
 //Pass the request and response on to the next valve in our pipeline 
 valveContext.invokeNext(request, response); 
 // now perform what this valve is supposed to do ... 
 }

如果pipeline由valve1、valve2、valve3组成,调用valve1. Invoke()会发生什么?执行顺序是什么样的?假设valveN(N=1,2,3)的invoke()方法实现如下:

valveContext.invokeNext(request, response);
System.out.println(“valve1 invoke!”);

如果注意到了invokeNext()的实现,这层调用类似与下面的图:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值