希望各位网友在看完<<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. Xcode7.3.1中通过最新的CocoaPod安装pop动画引擎

    CocoaPod是一个用ruby实现,用于方便的管理Xcode中第三方插件的管理器.用它我们可以很方便的安装和升级插件而不用担心破坏原有的项目. 而pop是一个用于实现App中动画的引擎,它是由Fac ...

  2. Java 8 新特性之 Lambda表达式

    Lambda的出现就是为了增强Java面向过程编程的深度和灵活性.今天就来分享一下在Java中经常使用到的几个示例,通过对比分析,效果应该会更好. – 1.实现Runnable线程案例 其存在的意义就 ...

  3. XML之SAX解析模型

    DOM解析会把整个XML文件全部映射成Document里的树形结构,当遇到比较大的文件时,它的内存占用很大,查找很慢 SAX就是针对这种情况出现的解决方案,SAX解析器会从XML文件的起始位置起进行解 ...

  4. 如何将Provisioning Profile安装到开发的Mac系统上

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交 ...

  5. FFmpeg源代码简单分析:结构体成员管理系统-AVClass

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  6. 【一天一道LeetCode】#299. Bulls and Cows

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 You are ...

  7. 08 ListView 优化

    ListVie的优化 1 固定ListView长宽高 如下图在清单文件中: <ListView android:id="@+id/lv" android:layout_wid ...

  8. Java EE 之 过滤器入门学习与总结(1)

    使用Filter技术来配合开发会使得开发变得简单起来.简单的一个例子就表现在"乱码问题"上.不使用Filter的话,我们有可能需要为每一个网页设置字符编码集,如request.se ...

  9. 精通CSS+DIV网页样式与布局--初探CSS

    CSS英文名Cascading Style Sheet,中文名字叫层叠样式表,是用于控制页面样式并允许将样式信息与网页内容分离的一种标记性语言,DIV+CSS是WEB设计标准,它是一种网页的布局方法. ...

  10. Mysql group by语句的优化

    默认情况下,MySQL排序所有GROUP BY col1, col2, ....,查询的方法如同在查询中指定ORDER BY  col1, col2, ....如果显式包括一个包含相同的列的ORDER ...