如果把整个tomcat内核最高抽象程度模块化,可以看成是由连接器Connector和容器Container组成,连接器负责HTTP请求接收及响应,生成请求对象及响应对象并交由容器处理,而容器则根据请求路径找到相应的servlet进行处理。请求响应对象从连接器传送到容器需要一个桥梁,这个桥梁正是此节讨论的主角——CoyoteAdapter。

这个组件的结构非常简单,仅仅包含两个工具类,URLEncoder负责对字符串URL编码,StringManager负责日志的国际化,这两个工具前面已详细介绍过。这个组件的作用很明显就是充当一个适配器,把连接器与容器连接起来,它的主要工作包括:①根据底层Request和Response生成Connector使用的Request和Response(使用门面模式实现数据隔离机制导致存在多种Request和Response,详情移步前面“讲究门面的Request”章节);②调用容器管道。它的功能简单到没必要更多去讨论,但对于为什么要引入这个适配器我们还是有必要深入研究。

首先得先了解适配器模式,简单说就是在两个对象之间添加一个对象使两个对象能正确连接起来。化简CoyoteAdapter并以此为例,

①   定义适配器接口

public interface Adapter {

public voidservice(Request req, Response res) throws Exception;

}

②   适配器类,负责调用容器

public class CoyoteAdapter implements Adapter {

public void service(Request req,Response res)throws Exception {

container.invoke();  //some operator about invoke container

}

}

③   连接器,初始化方法使用适配器,并将adapter作为参数传入protocolHandler,protocolHandler看成一个对象即可,必须保证以Adapter作为参数传入。

public class Connector{

protected void initInternal(){

Adapter adapter = new CoyoteAdapter();

   protocolHandler.setAdapter(adapter);

}

}

④   新的适配器类,假如有一个新的容器newContainer调用方法定义为newInvoke,这时只要重新定义一个新的适配器并实例化一个NewAdapter对象传入protocolHandler即可,保证了以Adapter作为参数传入,不必做其他大量的更改动作。

public class NewAdapter implements Adapter {

public void service(Request req,Response res)throws Exception {

newContainer.newInvoke();

}

}

容器的调用本来可以直接在连接器中进行,但为了后期扩展及适配其他容器,于是添加了一个适配器CoyoteAdapter,引入适配器增加了代码的复杂性,但对于它带来的好处是完全值得的。

喜欢研究java的同学可以交个朋友,下面是本人的微信号:

连接器与容器的桥梁——CoyoteAdapter的更多相关文章

  1. Tomcat系列(3)——Tomcat 组件及架构核心部分 4类主要组件(顶层,连接器,容器,嵌套)

    1.架构图 2. 定义 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta ...

  2. 探秘Tomcat——连接器和容器的优雅启动

    前言: 上篇<探秘Tomcat——启动篇>粗线条的介绍了在tomcat在启动过程中如何初始化Bootstrap类,加载并执行server,从而启动整个tomcat服务,一直到我们看到控制台 ...

  3. 75篇关于Tomcat源码和机制的文章

    75篇关于Tomcat源码和机制的文章 标签: tomcat源码机制 2016-12-30 16:00 10083人阅读 评论(1) 收藏 举报  分类: tomcat内核(82)  版权声明:本文为 ...

  4. 攻城狮在路上(伍)How tomcat works(四)Tomcat的默认连接器

     在第4章中将通过剖析Tomcat4的默认连接器的代码,讨论需要什么来创建一个真实的Tomcat连接器.     注意:本章中提及的“默认连接器”是指Tomcat4的默认连接器.即使默认的连机器已经被 ...

  5. 攻城狮在路上(肆)How tomcat works(三) 连接器:Connector

     在介绍中提到,Catalina中有两个主要的模块:连接器和容器.本章中你将会写一个可以创建更好的请求和响应对象的连接器,用来改进第2章中的程序.一个符合Servlet 2.3和2.4规范的连接器必须 ...

  6. Tomcat剖析(三):连接器(1)

    Tomcat剖析(三):连接器(1) 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三):连接器(1) 4 ...

  7. Tomcat剖析(五):Tomcat 容器

    Tomcat剖析(五):Tomcat 容器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三):连接器(1 ...

  8. Docker学习笔记之运行和管理容器

    0x00 概述 容器是基于容器技术所建立和运行的轻量级应用运行环境,它是 Docker 封装和管理应用程序或微服务的“集装箱”.在 Docker 中,容器算是最核心的部分了,掌握容器的操作也是 Doc ...

  9. 【转】Tomcat连接器:Coyote框架

    不论Tomcat的容器设计得如何精妙,本质上Tomcat就是个http服务器,需要从socket中获得HTTP数据流:另一方面,容器只能处理封装好的org.apache.coyote.Request ...

随机推荐

  1. 在vue中操作DOM--this.$nextTick()

    虽然 Vue.js 通常鼓励开发人员沿着"数据驱动"的方式思考,避免直接接触 DOM,但是有时我们确实要这么做.比如一个新闻滚动的列表项.如果在这里需要操作dom, 应该是等待 V ...

  2. 【DotNet加密方式解析】-- 好文收藏

    By -- 彭泽 一. DotNet加密方式解析--散列加密 笔记: 散列加密种类: 1.MD5  128位 2.SHA-1  160位 3.SHA-256  256位 4.SHA-384  384位 ...

  3. [self init]

    在字典转模型中遇到了这样的代码: #import "HMAppInfo.h" @implementation HMAppInfo - (instancetype)initWithD ...

  4. MongoDB 原子操作

    mongodb不支持事务,所以,在你的项目中应用时,要注意这点.无论什么设计,都不要要求mongodb保证数据的完整性. 但是mongodb提供了许多原子操作,比如文档的保存,修改,删除等,都是原子操 ...

  5. 粗浅看Struts2和Hibernate框架

    ----------------------------------------------------------------------------------------------[版权申明: ...

  6. Bootstrap3 栅格系统-列排序

    通过使用 .col-md-push-* 和 .col-md-pull-* 类就可以很容易的改变列(column)的顺序. <div class="row"> <d ...

  7. Android系统对话框——自定义关闭

    Android系统对话框--自定义关闭 Dialog是我们在项目中经常用到的,5.x以后的Dialog也很好看,很安卓风,Android也给我们提供了新的包,低版本可以显示一样的效果.我们在使用的导入 ...

  8. 长度为N的数组乱序存放着0带N-1.现在只能进行0与其他数的swap操作,请设计并实现排序,必须通过交换实现排序。

    void sort(int* arr, int len) { if (!arr) { return; } for (int i = 1; i < len; ++i) { while (arr[0 ...

  9. 使用maven执行单元测试总结

    maven本身没有单元测试框架,但是maven的default生命周期的test阶段绑定了maven-surefire-plugin插件,该插件可以调用Junit3.Junit4.TestNG等Jav ...

  10. C++ 虚函数表 单继承

    本文研究单继承情况下,c++对象的虚函数表的具体情况. 假设有两个类A,B, 其中B由A派生出来,A含有虚函数fun1,B含有虚函数fun2. 测试的代码如下: #include<iostrea ...