`
uule
  • 浏览: 6358312 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

《How Tomcat Works》读书笔记(二):Connector

 
阅读更多

在Web应用中通过TomcatAPI对Tomcat进行访问与控制 

Tomcat StringManager阅读学习

查看tomcat启动文件都干点啥---server对象

 

处理流程为:

  1. Bootstrap启动HttpConnector
  2. HttpConnector监听Socket端口,将得到的Socket对象交给HttpProcessor
  3. HttpProcessor通过调用parseRequest和parseHeaders方法,解析底层Socket流中的字节,生成Request对象和Response对象
  4. 把Request对象和Response对象交给“容器”处理,即ServletProcessor或者StaticResourceProcessor
  5. 载入Servlet对象,利用Facade模式,将Request对象和Response对象传入Servlet的service方法,处理,然后通过Response对象的writer,把响应内容返回给客户端

 

Chapter Three:Connector

tomcat的Connector名字叫做Coyote,我之前也写了几篇关于coyote的博客,不过在看了第三章后,才对tomcat的Connector有了更加深入的认识。需要说明的是,这一章的Connector只是一个简化版,而第四章介绍的也只是“默认”(旧版本)的Tomcat的Connector,正因为“默认”的Connector性能不佳,才产生了后来的coyote,这是后话。

StringManager

在讲述连接器前,首先介绍一个tomcat内部使用频率非常高的工具类——StringManager,简称sm(O(∩_∩)O有点歧义~)。我们知道tomcat是一个大项目,里面的package很多,而每个package内的类都需要输出很多信息,包括错误信息、调试信息,等等。为了降低耦合性,tomcat开发人员专门设计了这个sm类,用来存取相关的输出信息。每个package都有一个“LocalStrings.properties”文件,就像ini文件那样保存了这些信息。我们只需要像下面这样:

StringManager sm = StringManager.getManager("ex03.pyrmont.connector.http");

就可以获得一个特定于某个package输出信息的sm,然后直接getString即可。为了便于支持多语言,一般还包括了LocalStrings_es.properties和LocalStrings_ja.properties,sm会自动根据本地语言设置来选择相应的语种,这和Struts非常像(兴许Struts就是模仿tomcat的)。可惜,没有LocalStrings_cn.properties

 

Bootstrap

像我们看到的tomcat6一样,在这一章的小例子中,也专门将Bootstrap类提取出来,用于启动tomcat,当然这里还是非常简单的new了一个Connector,以后的章节会陆续添加功能。在这里,Connector实现了Runnable接口

public final class Bootstrap { 
   public static void main(String[] args) { 
     HttpConnector connector = new HttpConnector(); 
     connector.start(); 
   } 
}

Connector

终于可以一睹Connector的“芳容”了!很遗憾,这一章的Connector还非常简陋,只是把前一章中监听Socket的部分代码copy了过来,略微有点不同的是:

// Hand this socket off to an HttpProcessor 
       HttpProcessor processor = new HttpProcessor(this); 
       processor.process(socket);

很明显,这里多了一个HttpProcessor ,其实就相当于“容器”的角色。tomcat发展到现在,其架构也还是:Connector+Container

 

HttpProcessor

可以说,HttpProcessor 是这一章的重头戏,大部分功能都是通过这个类,直接或间接地实现的。

照旧,在HttpProcessor 的process方法中,首先获取Socket的输入输出流、new 一个Request和Response,然后调用:

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

这两个方法是本类的核心,parseRequest是处理http请求行(就是类似“GET http://xxx.xxx/xxx?name=xxx”,位于http请求的第一行),parseHeaders则处理请求行之后的一堆header,比如content-length、cookie等。别看只有两个方法,深入进去其实调用了很多其他类的方法,看来解析一个http请求也不是那么容易的。

 

SocketInputStream

这个类转自tomcat源代码,它对Socket的原始inputstream进行了封装,负责将以下字段分离出来:

  • http schema:请求行中的GET,POST等等
  • URI:例如,http://xxx.xxx/xxx,这里还要区分是绝对路径还是相对路径
  • 查询字符串:就是“?”后面的那些键值对
  • header:http 请求的headers

当然,分离出来的字段都是以char数组的形式保存的,因为生成String的开销很大,通常都是“lazy load”,不到不得已不会随便new string

 

Populate Request

所谓populate,即是“赋值”的意思,就是调用Request的那些set方法,把之前解析出来的那些字段一个个放进Request对象中,供后续使用。考虑到解析、分割字符串的开销很大,tomcat的原则是把查询字符串(query string)和cookie的解析工作放到Servlet中,因为这些字段未必一定会用到,要的时候在生成也不迟,从而节省了系统资源。

具体的解析过程很啰嗦,基本上都是字符串处理,在一堆字节中摸爬滚打,这里就不赘述了。

 

Create Response

相比Request,Response的工作量就小了一些。但也有不少改进之处。首先,之前的Response.getWriter方法,单纯的返回一个包装了Socket的OutputStream的PrintWriter,但这是JAVA自带的PrintWriter,功能上不能完全满足tomcat的需要,例如它的print方法不能自动flush(具体可以参考JavaDoc)。所以,在这里通过两个类:ResponseStream和ResponseWriter,分别拓展了原始的ServletOutputStream和PrintWriter。下面摘取其中一部分代码:

public void write(String s, int off, int len) { 
    super.write(s, off, len); 
    super.flush(); 
  }

这是ResponseWriter的write方法,可见就是在PrintWriter的方法上多了一个flush而已

其他

搞定Request后,还是像上一章那样,把Request交给ServletProcessor或者StaticResourceProcessor,基本没有大的变动

总结

首先,这一章的服务器架构如下:(图片源自原书)

image

 

分享到:
评论

相关推荐

    How Tomcat Works 中文版.pdf

    通过阅读《How Tomcat Works》中文版,读者将能够获得对Tomcat架构的全面理解,学习到如何从源码级别研究和开发一个高性能的Java应用服务器,以及如何将其应用于实际的Web开发和服务器管理工作中。

    How Tomcat Works 读书笔记(第三章)

    《How Tomcat Works》这本书是理解Apache Tomcat服务器工作原理的重要资源,第三章主要探讨了Tomcat的架构和核心组件。以下是对这部分内容的详细解读: Tomcat作为一款开源的Java Servlet容器,其核心功能是解析...

    How Tomcat Works【英文PDF+中文HTML+源码】.zip

    通过阅读《How Tomcat Works》的英文PDF文档和中文HTML翻译,可以系统地了解Tomcat的各个方面,并结合源代码进行深入研究,这对于提升开发和运维能力,优化Java Web应用的性能具有重要意义。无论你是初学者还是经验...

    How Tomcat Works 中文版+例程源码

    《How Tomcat Works》是一本深入探讨Apache Tomcat工作原理的书籍,中文版的提供使得国内开发者能够更方便地理解这一流行的开源Java Servlet容器。这本书不仅涵盖了Tomcat的基础知识,还详细解析了其内部机制,对于...

    How Tomcat Works中文

    ### How Tomcat Works中文版深度解析 #### 一、引言与概述 《How Tomcat Works》是一本针对Apache Tomcat服务器内部工作机制进行深入剖析的专业书籍。本书详细介绍了Tomcat 4.1.12和5.0.18两个版本的内部结构与...

    How Tomcat Works 英文书及源码

    《How Tomcat Works》这本书是理解Apache Tomcat服务器工作原理的宝贵资源,它全面深入地讲解了这个流行的Java Servlet和JavaServer Pages(JSP)容器的内部机制。书中的20个章节涵盖了从基础概念到高级特性的广泛...

    How Tomcat Works 中文版

    《How Tomcat Works中文版》这本书是一本深入探讨Apache Tomcat服务器工作原理的专著。Apache Tomcat服务器,或简称为Tomcat,是世界上广泛使用的Java Servlet容器和JavaServer Pages(JSP)引擎,负责处理基于Java...

    How Tomcat works(PDF)

    《How Tomcat Works》这本书深入浅出地介绍了Apache Tomcat这款广泛应用的Java Servlet容器的工作原理。Tomcat作为开源软件,是许多Web应用的基础,尤其在轻量级开发和测试环境中非常常见。以下是对Tomcat核心知识点...

    HowTomcatWorks 中文版+源码.rar

    《HowTomcatWorks》是一本深入解析Apache Tomcat工作原理的书籍,中文版的发布使得更多的中国...通过阅读《HowTomcatWorks》中文版和分析源码,开发者可以提升对Tomcat的理解,从而更好地优化和管理自己的Web应用。

    how tomcat works

    《how tomcat works》是一本深入探讨Apache Tomcat内部工作原理的专业书籍。Apache Tomcat是一个开源的Java Servlet容器,它实现了Java Servlet和JavaServer Pages技术规范,提供了Java Web服务器的功能。对于Java ...

    译How Tomcat Works(第二章)

    《译How Tomcat Works(第二章)》这篇文章主要讲解了Apache Tomcat服务器的工作原理,它是一个开源的Java Servlet容器,广泛用于部署Web应用程序。在这一章中,我们将深入探讨Tomcat如何处理HTTP请求,以及其内部架构...

    HowTomcatWorks(书和源码)

    《How Tomcat Works》是一本深入解析Apache Tomcat工作原理的书籍,同时也包含了源码,为读者提供了理论与实践相结合的深入学习体验。Tomcat是一款广泛使用的开源Java Servlet容器,它是Apache软件基金会 Jakarta...

    HowTomcatWorks书籍代码

    HowTomcatWorks书籍课程实例工程与代码 书籍剖析了Tomcat 4.1.12和Tomcat 5.0.18--一个免费的、开源的、深受大众欢迎的、代号为Catalina的servlet容器,并讲解其容器的内部运行机制。通过迭代实现一个简化版软件来...

    How Tomcat Works以及案例的项目源码

    《How Tomcat Works》是一本深入探讨Apache Tomcat工作原理的专业书籍,对于任何希望深入了解Java Servlet和JavaServer Pages (JSP)容器的人来说,都是一份宝贵的资源。Tomcat作为最流行的开源Servlet容器,其内部...

Global site tag (gtag.js) - Google Analytics