希望各位网友在看完<<how tomcat works>>一书或者鄙人的tomcat专栏文章后再看这篇博客

这里主要是梳理各个章节的核心概念

第一章 一个简单的Web服务器

第1章从这本书一开始就介绍了一个简单的HTTP服务器。要建立一个可工作的HTTP服务器,你需要知道在 java.net 包里边的 2 个类的内部运作:Socket 和 ServerSocket。这里有关于这 2个类足够的背景资料,使得你能够理解附带程序是如何工作的。

类图如下:



程序的main方法中,建立HttpServer,调用await方法,从ServerSocket中取得inputstream与outputstream分别传递给Request类与Response类,最后调用Response的sendStaticResource方法.静态资源的处理方法就是,在默认的文件路径下按照分析出来的uri读取对应的文件,然后再调用outputstream的write方法。

第二章 一个简单的servlet容器

第一章的程序,只能处理静态资源,这一章的程序就能处理简单的servlet。

第 2 章说明简单的 servlet 容器是如何工作的。这一章带有 2 个 servlet 容器应用,可以处理静态资源和简单的 servlet 请求。尤其是你将会学到如何创建 request 和 response 对象,然后把它们传递给被请求的 servlet 的 service 方法。在 servlet 容器里边还有一个 servlet,你可以从一个 web 浏览器中调用它。

类图如下:

核心代码如下:

HttpServer有两个处理器,分别为ServletProcessor与StaticResourceProcessor。到底使用哪个,取决于分析到的uri的开头。

在ServletProcessor中,会指定默认的文件路径,路径下有servlet的class文件,我们用URLClassLoader加载从uri中分析得到的servletname,得到servlet后,调用service方法即可。

在StaticResourceProcessor中,直接调用Response的sendStaticResource方法。

不过这里有些问题

Request方法会作为参数被传递到servelt中,而Request类里面有public型的parse方法与sendStaticResource方法,但是这两个方法不应该在servlet中被调用!总不能把两个方法改为private吧.一种方法是将两个方法的访问限制符置空,就是默认的限制符,它是不能在包外被访问的。

不过还有另一种方法,门面模式

如下图:

RequestFacade类接收一个Request对象传递给其成员变量ServletRequest,

public class RequestFacade implements ServletRequest {

  private ServletRequest request = null;

  public RequestFacade(Request request) {
    this.request = request;
  }

  /* implementation of the ServletRequest*/
  public Object getAttribute(String attribute) {
    return request.getAttribute(attribute);
  }
}

看到了吧,RequestFacade只是一个二传手,不过里面根本就没有parse方法。所以把RequestFacade作为参数传递给servlet是安全的。

所以,以后什么地方要用parse方法,就给它传Request对象;不能用parse的地方就传RequestFacade。

第三章 连接器

第3章介绍了一个简化版本的Tomcat 4默认连接器。这章里边的程序提供了一个学习工具,用于理解第 4 章里边的讨论的连接器。

本章类图



这里的HttpConnector做的工作就创建一个套接字,然后传递给HttpProcessor,在HttpProcessor的process方法中

      parseRequest(input, output);

      parseHeaders(input);

以上两个方法是最重要的;

这一章最复杂的地方其实在于解析HTTP请求

可以分为5步:

读取套接字的输入流;

解析请求行

解析请求头

解析cookie

获取参数

后面的代码如下:

      parseRequest(input, output);
      parseHeaders(input);

      //check if this is a request for a servlet or a static resource
      //a request for a servlet begins with "/servlet/"
      if (request.getRequestURI().startsWith("/servlet/")) {
        ServletProcessor processor = new ServletProcessor();
        processor.process(request, response);
      }
      else {
        StaticResourceProcessor processor = new StaticResourceProcessor();
        processor.process(request, response);
      }

分析完http请求,把它交给ServletProcessor或者StaticResourceProcessor即可。

第四章 tomcat默认的连接器

第 4 章介绍了 Tomcat 4 的默认连接器。这个连接器已经不推荐使用,推荐使用一个更快的连接器,Coyote。不过,默认的连接器更简单,更易于理解。

在这一章里,即引入了连接器的概念,也引入了容器的概念。咱们慢慢说,先看uml图。



先说连接器,在第三章的简易连接器里,我们只有一个HttpProcessor,在这一章里,我们有了一个Processor连接池,这样的好处就是我们同时可以处理多个请求了!

另一方面,这里在解析请求头的时候,使用的是字符数组来代替字符串。为什么?效率高?效率为什么高?自己看源码找资料。(我怎么觉得自己好赖皮呀)

这里newProcessor与createProcessor的区别在于

newProcessor一定会产生一个新的HttpProcessor;

而createProcessor大部分情况是从processor池中拿;

httpprcessor启动后,(在run方法中)会调用

  process(socket);

待通过分析socket,把httprequest填充完毕后,

connector.getContainer().invoke(request, response);

连接器的任务就算是完成了!

这一节的容器是simplecontainer,它的invoke干的事情,其实就是前面几章里ServletProcessor类里process()方法干的事情,通过urlclassloader加载类,调用加载类的service方法。

后面几章的内容,咱们明天接着说。

how tomcat works 总结的更多相关文章

  1. 攻城狮在路上(肆)How tomcat works(零) 前言说明

    最近几篇是关于How tomcat works一书的读书笔记. 通过数个章节逐渐实现一个tomcat的功能. 源码下载地址:http://zhidao.baidu.com/share/7007af0f ...

  2. How Tomcat works — 四、tomcat启动(3)

    上一节说到StandardService负责启动其子组件:container和connector,不过注意,是有先后顺序的,先启动container,再启动connector,这一节先来看看conta ...

  3. How Tomcat Works(十四)补充

    在How Tomcat Works(十四)中,本人并没有对javax.servlet.Filter及javax.servlet.FilterChain做详细的描述,本文在这里做一下补充 FilterC ...

  4. How Tomcat Works(十八)

    在前面的文章中,如果我们要启动tomcat容器,我们需要使用Bootstrap类来实例化连接器.servlet容器.Wrapper实例和其他组件,然后调用各个对象的set方法将它们关联起来:这种配置应 ...

  5. How Tomcat Works(十七)

    在前面的文章中,已经学会了如何通过实例化一个连接器和容器来获得一个servlet容器,并将连接器和容器相关联:但在前面的文章中只有一个连接器可用,该连接器服务8080端口上的HTTP请求,无法添加另一 ...

  6. How Tomcat Works(十六)

    本文接下来会介绍Host容器和Engine容器,在tomcat的实际部署中,总是会使用一个Host容器:本文介绍Host接口和Engine接口及其相关类 Host容器是org.apache.catal ...

  7. How Tomcat Works(十五)

    本文接下来分析Context容器,Context容器实例表示一个具体的Web应用程序,其中包括一个或多个Wrapper实例:不过Context容器还需要其他的组件支持,典型的如载入器和Session管 ...

  8. How Tomcat Works(十四)

    我们已经知道,在tomcat中有四种类型的servlet容器,分别为Engine.Host.Context 和Wrapper,本文接下来对tomcat中Wrapper接口的标准实现进行说明. 对于每个 ...

  9. How Tomcat Works(十三)

    本文分析tomcat容器的安全管理,servlet技术支持通过配置部署描述器(web.xml文件)来对受限内容进行访问控制:servlet容器是通过一个名为验证器的阀来支持安全限制的,当servlet ...

  10. How Tomcat Works(十二)

    tomcat容器通过一个称为Session管理器的组件来管理建立的Session对象,该组件由org.apache.catalina.Manager接口表示:Session管理器必须与一个Contex ...

随机推荐

  1. 01_数据库连接池,数据源,ResultSetMetaData,jdbc优化

     一.数据库连接池 1. 什么是连接池 传统的开发模式下,Servlet处理用户的请求,找Dao查询数据,dao会创建与数据库之间的连接,完成数据查询后会关闭数据库的链接. 这样的方式会导致用户每 ...

  2. Dynamics CRM 开启EmailRouter日志记录

    找到mailrouter的安装路径,在service文件夹下找到"Microsoft.Crm.Tools.EmailAgent.xml"这个文件,已管理员方式打开,找到loglev ...

  3. Android开发学习之路--MediaPlayer之简单音乐播放器初体验

    很多时候我们都会用手机来播放音乐,播放视频,那么具体地要怎么实现呢,其实主要是MediaPlayer类来完成的.下面通过简单的例子来实现一首歌曲的播放吧.新建工程MediaPlayerStudy,这里 ...

  4. 后端分布式系列:分布式存储-HDFS Client 设计实现解析

    前面对 HDFS NameNode 和 DataNode 的架构设计实现要点做了介绍,本文对 HDFS 最后一个主要构成组件 Client 做进一步解析. 流式读取 HDFS Client 为客户端应 ...

  5. Android的ProgressBar进度条-android学习之旅(三十一)

    ProgressBar 简介 ProgressBar是一种很常用的Ui,用于给复杂的操作显示进度,提供更好的用户相应.使用setProgress()incrementProgressBy()来设置进度 ...

  6. FFmpeg API 变更记录

    最近一两年内FFmpeg项目发展的速度很快,本来是一件好事.但是随之而来的问题就是其API(接口函数)一直在发生变动.这么一来基于旧一点版本的FFmpeg的程序的代码在最新的类库上可能就跑不通了. 例 ...

  7. 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)

    作者 : 韩曙亮  博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csd ...

  8. Oracle开发环境搭建

    一.软件准备 地址:oracle官网 安装包:因为个人学习用,所以就安装服务器端就可以了,不需要客户端. 一共两个压缩文件,解压时一起解压到到一个文件夹. 本人使用的:win32_11gR2_data ...

  9. OpenCV空洞填充算法

    讨论帖: http://bbs.csdn.net/topics/391542633 在Matlab下,使用imfill可以很容易的完成孔洞填充操作,感觉这是一个极为常用的方法,然而不知道为什么Op ...

  10. linux服务器批量部署应用系统shell脚本(Tomcat/jetty)

    linux服务器批量部署应用系统shell脚本: 1.请更换代码内的服务器地址(Tomcat或jetty服务器) serverRoot=/home/undoner/java_tool/apache-t ...