在介绍中提到,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. Colorful tree

    cnbb 我被数组清零卡了一天.. 子树改色询问子树颜色数.. 先考虑颜色为x的节点对祖先答案的贡献,那么我们考虑把所有这些节点都搞出来,按dfs序排序,然后考虑每个节点a掌管的祖先是它和按dfs序的 ...

  2. Nunit-Writing Tests

    Nunit 测试可以被任意支持attributes的.net语言使用 Attributes被用于去标识测试类和测试方法,然后通过不同的方式修改他们的行为 Assertions针对一个或多个约束,测试一 ...

  3. The Imitation Game

    <The Imitation Game>是一部非常好的电影,讲述了人工智能之父——阿兰图灵的传奇一生. 重点讲述了他通过破译德国的通讯密码缩短了二战的持续时间,因而拯救了无数生命的伟大事迹 ...

  4. cocos2dx 2.x实现闪电效果(贴画版)

    cocos2dx 2.x实现闪电效果(非画线版) 在网上搜索到一个直接用opengl画线实现的版本,但放在游戏中效果不太搭,要求用贴图的.我这个版本用的也是画线版的算法. 闪动的时候效果还可以,每段衔 ...

  5. windows hosts

    2015年6月29日 11:10:56 星期一 windows 的 hosts 文件生效机制 以最前边的为准, 重复的硬解析只有第一次出现的地方生效

  6. vc++创建文件目录

    #include "stdafx.h" #include <iostream> #include <fstream> #include <string ...

  7. java web 学习 --第一天(Java三级考试)

    1.Servlet servlet是运行在web server或 application server端的Java程序,主要用于在服务器端产生动态内容. servlet 在服务器端主要有以下作用 读取 ...

  8. perl q qq qr qw qx 区别与使用方法

    1.q 相当于 单引号' ' 转义字符无效 q可以使用()[] {} // ,, 2.qq 相当于" " 转义字符有效 qq可以使用()[] {} // ,, 3.qw  相当于 ...

  9. ACM/ICPC 之 最短路径-Bellman Ford范例(POJ1556-POJ2240)

    两道Bellman Ford解最短路的范例,Bellman Ford只是一种最短路的方法,两道都可以用dijkstra, SPFA做. Bellman Ford解法是将每条边遍历一次,遍历一次所有边可 ...

  10. ACM/ICPC 之 Prim范例(ZOJ1586-POJ1789(ZOJ2158))

    两道Prim解法范例题型,简单的裸Prim,且两题相较以边为重心的Kruskal解法而言更适合以点为重心扩展的Prim解法. ZOJ1586-QS Network 题意:见Code 题解:直接的MST ...