如果把整个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. 数据结构之Treap

    1. 概述 同splay tree一样,treap也是一个平衡二叉树,不过Treap会记录一个额外的数据,即优先级.Treap在以关键码构成二叉搜索树的同时,还按优先级来满足堆的性质.因而,Treap ...

  2. reload(sys)后print失效问题解决

    python版本: python2.7.6 #查看python默认编码格式 >>> import sys >>> print sys.getdefaultencod ...

  3. markdowm写博客测试

    markdowm测试文档 #include <bits/stdc++.h> using namespace std; int main() { printf("Hello Wor ...

  4. 如何处理JS,css与smarty标签的冲突

    smarty的默认标记符是大括号:{}, 假如我们页面上有JS且定义了函数或者对象,或者有CSS定义了样式,就会出现大括号, smary引擎就会把这些大括号当作smarty语法来解释, 很明显,这些C ...

  5. Activity的四种启动模式任务栈图解

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 今天带来另一篇Activity的文章--Activity的四种启动模式.该篇文章,会以图文讲解的方式带你彻底掌握Activity的启动 ...

  6. Android开发过程中在sh,py,mk文件中添加log信息的方法

    Android开发过程中在sh,py,mk文件中添加log信息的方法 在sh文件中: echo "this is a log info" + $info 在py文件中: print ...

  7. proc文件系统探索 之 以数字命名的目录

    在proc根目录下,以数字命名的目录表示当前一个运行的进程,目录名即为进程的pid.其内的目录和文件给出了一些关于该进程的信息. niutao@niutao-desktop:/proc/6584$ l ...

  8. Android简易实战教程--第三十八话《自定义通知NotifiCation》

    上一篇小案例,完成了一个普通的通知,点击通知启动了一个活动.但是那里的通知没有加入些"靓点",这一篇就给它加入自定义的布局,完成自定义的通知. 应用:比如QQ音乐为例,当点击音乐播 ...

  9. Spark:聚类算法

    Spark:聚类算法 Kmeans聚类 KMeans算法的基本思想是初始随机给定K个簇中心,按照最邻近原则把待分类样本点分到各个簇.然后按平均法重新计算各个簇的质心,从而确定新的簇心.一直迭代,直到簇 ...

  10. 用Python最原始的函数模拟eval函数的浮点数运算功能(2)

    这应该是我编程以来完成的难度最大的一个函数了.因为可能存在的情况非常多,需要设计合理的参数来控制解析流程.经验概要: 1.大胆假设一些子功能能够实现,看能否建立整个框架.如果在假设的基础上都无法建立, ...