在介绍中提到,Catalina中有两个主要的模块:连接器和容器。本章中你将会写一个可以创建更好的请求和响应对象的连接器,用来改进第2章中的程序。一个符合Servlet 2.3和2.4规范的连接器必须创建javax.servlet.http.HttpServletRequest和javax.servlet.http.HttpServletResponse,并传递给被调用的servlet的service方法。
    在本章的应用程序中,连接器解析HTTP请求头部并让servlet可以获得头部, cookies, 参数名/值等等。你将会完善第2章中Response类的getWriter方法,让它能够正确运行。由于这些改进,你将会从 PrimitiveServlet中获取一个完整的响应,并能够运行更加复杂的ModernServlet。

本章你建立的连接器是将在第4章详细讨论的Tomcat4的默认连接器的一个简化版本。Tomcat的默认连接器在Tomcat4中是不推荐使用的,但它仍然可以作为一个非常棒的学习工具。在这章的剩余部分,"connector"指的是内置在我们应用程序的模块。
    注意:和上一章的应用程序不同的是,本章的应用程序中,连接器和容器是分离的。

    本章的应用程序可以在包ex03.pyrmont和它的子包中找到。组成连接器的这些类是包 ex03.pyrmont.connector 和ex03.pyrmont.connector.http的一部分。在本章的开头,每个附带的程序都有个bootstrap类用来启动应用程序。不过,在这个阶段,尚未有一个机制来停止这个应用程序。一旦运行,你必须通过关闭控制台(Windows)或者杀死进程(UNIX/Linux)的方法来鲁 莽的关闭应用程序。
    先来说说包org.apache.catalina.util里边的StringManager类。这个类用来处理这个程序中不同模块和Catalina自身的错误信息的国际化
一、StringManager类:
    该类基本功能是实现国际化错误提示,由于在整个tomcat中只用一个配置文件的话会难以维护,所以这里的做法是每个包都会对于一个配置文件,每个属性文件都会被一个 org.apache.catalina.util.StringManager类的实例所处理。所以当tomcat运行的时候,会有多个StringManager实例。为了避免资源浪费,该类被设计为单例模式。
    基本用法:
    StringManager sm =  StringManager.getManager("ex03.pyrmont.connector.http");
    public String getString(String key)
二、应用程序说明:
    本节共有三个包:connector+startup+core.
    startup模块只有一个类,Bootstrap,用来启动应用的。
    connector模块的类可以分为五组:
        连接器和它的支撑类(HttpConnector和HttpProcessor)。
        指代HTTP请求的类(HttpRequest)和它的辅助类。
        指代HTTP响应的类(HttpResponse)和它的辅助类。
        Facade类(HttpRequestFacade和HttpResponseFacade)。
        Constant类
    core模块由两个类组成:ServletProcessor和StaticResourceProcessor。
    第2章中的HttpServer类被分离为两个类:HttpConnector和HttpProcessor,Request被 HttpRequest所取代,而Response被HttpResponse所取代。同样,本章的应用使用了更多的类。
三、启动应用程序Bootstrap:
    该类中的main方法中就是简单的创建了一个HttpConnector对象,然后调用了其connector.start();方法。仅仅是一个入口。
四、 connector模块:
    1、HttpConnector:
        该类作为一个单独的线程启动,定义了一个ServerSocket,监听8080端口。然后提供了一个阻塞式的循环。
        当接受到一个Socket对象时,创建一个HttpProcessor对象,执行其process方法。
        总体来说,HttpConnector仅仅是用于监听请求,剩余的事情都完全交给HttpProcessor去处理。
    2、HttpProcessor:
        该类最重要的方法是:public void process(Socket socket);
        A、在该方法中首先获取Socket的输入、输出流,将其封装成一个自定义的流对象。
        B、创建HttpRequest对象,该对象实现了HttpServletRequest接口。同样使用了外观对象HttpRequestFacade.
        C、创建HttpResponse对象,该对象实现了HttpServletResponse接口。同样使用了外观对象HttpResponseFacade.
        D、private void parseRequest(SocketInputStream input, OutputStream output)方法解析请求行。
        E、private void parseHeaders(SocketInputStream input)解析头部,生成一个HttpHeader对象。
        F、获取参数只会在第一次调用getParameter()等方法时才会对查询字符串或者POST请求内容进行解析,目的是提高效率。
        G、根据是否包含“/servlet/”选择ServletProcessor或者StaticResourceProcessor。
    3、HttpResponse:该类和第二节最大的区别在于对getWriter()方法进行了改进,返回的是一个自定义的Writer,可以实现自动刷新。

攻城狮在路上(肆)How tomcat works(三) 连接器:Connector的更多相关文章

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

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

  2. 攻城狮在路上(肆)How tomcat works(二) 一个简单的servlet容器

    该节在上一节的基础上增加了所谓对静态资源和动态资源访问的不同控制流程.示例里面采用的是对路径“/servlet/”进行了特殊处理. 一. 主要还是从HttpServer1中的main方法开始,先解析出 ...

  3. 攻城狮在路上(肆)How tomcat works(一) 简单的web服务器

     该节总共三个类:Request\Response\HttpServer---user.dir     该节的目的是实现简单web服务器对静态文件的访问.需要对请求头.请求体的格式有所了解,不然就没有 ...

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

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

  5. 攻城狮在路上(壹) Hibernate(十五)--- Hibernate的高级配置

    一.配置数据库连接池: 1.使用默认的数据库连接池: Hibernate提供了默认了数据库连接池,它的实现类为DriverManegerConnectionProvider,如果在Hibernate的 ...

  6. 攻城狮在路上(陆)-- 提交运行MapReduce程序到hadoop集群运行

    此种方式不能直接在eclipse中调试代码. 首先需要在src下放置服务器上的hadoop配置文件:core-site.xml\yarn-site.xml\hdfs-site.xml\mapred-s ...

  7. 攻城狮在路上(陆)-- 配置hadoop本地windows运行MapReduce程序环境

    本文的目的是实现在windows环境下实现模拟运行Map/Reduce程序.最终实现效果:MapReduce程序不会被提交到实际集群,但是运算结果会写入到集群的HDFS系统中. 一.环境说明:     ...

  8. 攻城狮在路上(陆)-- hadoop分布式环境搭建(HA模式)

    一.环境说明: 操作系统:Centos6.5 Linux node1 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 ...

  9. 攻城狮在路上(陆)-- hadoop单机环境搭建(一)

    一.环境说明:     操作系统:Centos6.5 Linux node1 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86 ...

随机推荐

  1. linux回收站设计

    linux回收站设计 在windows下有一个很好的东西,那就是回收站,虽然有很多人批评它.linux不是没有回收站,很多桌面环境都可以看到是有回收站的. 这里是讨论如何设计一个回收站,而不是有没有的 ...

  2. hustoj1353 节点选择 树形dp

    1353: 结点选择 时间限制: 1 Sec  内存限制: 128 MB提交: 6  解决: 2[提交][状态][讨论版] 题目描述 问题描述 有一棵 n 个节点的树,树上每个节点都有一个正整数权值. ...

  3. Objective C 快速入门学习三

    1.数据类型 和C语言基本一样. 有一个特别数据类型id,可以储存任何类型的对象,它是实现多态和动态绑定的基础. Objective-C 2.程序结构 Objective-C和C的程序结构一模一样,具 ...

  4. C#中使用ADOMD.NET查询多维数据集

    ADOMD.NET 是用于与 Microsoft SQL Server Analysis Services 进行通信的 Microsoft .NET Framework 数据访问接口. ADOMD.N ...

  5. 【leetcode】First Missing Positive

    First Missing Positive Given an unsorted integer array, find the first missing positive integer. For ...

  6. <转>VPN技术原理

    原文地址:VPN技术原理 VPN,Virtual Private Network(虚拟专用 网络),被定义为通过一个公用网络(通常是因特网)建立一个临时的.安全的连接,是一条穿过公用网络的安全.稳定的 ...

  7. Mac下安装MySQL

    2015-07-13 15:10:32 Mac下用homebrew安装软件还是很方便的 brew install mysql 等待一会儿安装完毕后到安装目录: /usr/local/Cellar/my ...

  8. ACM/ICPC 之 简单DP-记忆化搜索与递推(POJ1088-滑雪)

    递推型DP 将每个滑雪点都看作起点,从最低点开始逐个由四周递推出到达此点的最长路径的长度,由该点记下. 理论上,也可以将每一点都看作终点,由最高点开始计数,有兴趣可以试试. //经典DP-由高向低海拔 ...

  9. [转]Android How to Download and Make Volley.jar

    原文来自:http://tips.androidhive.info/2015/08/android-how-to-download-and-make-volley-jar/   1 Comment . ...

  10. STL:原地归并排序模板(InplaceMergeSort)

    原理:就是在归并排序上改进,以时间复杂度换空间复杂度,利用元素反转完成排序 具体过程如下: 具体操作看代码吧,应该没什么难度,主要是reverse要反转三次 typedef int Position; ...