TOMCAT内核之旅--连接器(Connector)--学习心得(三)

3.1 前言

    首先我先针对上一小节最后出现的问题,作出回答,其实很简单,我们要加载一个类的实例,则不粗得到其字节码文件(class文件),eclipse是一个IDE工具,它具有自编译功能,src包下的目录为我们编写的java源文件,而其会自动生成bin包,其下拥有和src包下相同目录,但是其为对应的java文件编译后的字节码文件。
    所以,上节课我们出现的异常问题就得以解释,我们只需找到其字节码文件,放在我们要加载的文件目录下即可!并且我已经测试成功,大家自己可以测试。

3.2 概述

    今天我给大家分享学习心得之TOMCAT的连接器(Connector)。
    catalina本身是一个成熟的软件,设计开发结构十分优雅,功能结构模块化。从servlet容器的功能角度看,catalian可以划分为两大模块:connector模块和container模块。
    这里connector的功能是将用户请求与container连接。connector的任务的是为每个接收到的HTTP请求建立request对象和response对象。然后,将处理过程交给container模块。container模块从connector模块中接收到request对象和response对象,并负责调用相应的servlet的服务方法。
    一个符合Servlet 2.3和2.4规范的连接器必须创建javax.servlet.http.HttpServletRequest(以下简用HttpServletRequest)的实例对象和javax.servlet.http.HttpServletResponse(以下简用HttpServletResponse)的实例对象,并传递给被调用的servlet的service方法。
    上小节,我们的简单的servlet容器只实现了Servlet的servlet,并传递ServletRequest和javax.servlet.ServletResponse实例给service方法。因为连接器并不知道servlet的类型(例如它是否实现了Servlet,继承了GenericServlet,或者继承了HttpServlet),所以连接器必须始终提供HttpServletRequest和HttpServletResponse的实例。这就是connector的重点!!!

3.3 概要设计

    由于书本内容过于混乱,为了大家能后清楚地认识连接器,我按照自己的理解给大家介绍。
    他的本质就是将请求和响应两个模块集成起来处理,成为一个连接模块。整体思路:连接器等待浏览器的请求,建立连接之后,对请求进行处理,这里就要实例化两个重要的对象,httpservletrequest对象和httpservletresponse对象,而,connector要做的就是,对这两个对象进行“填充修饰”。连接器解析HTTP请求头部(头部, cookies, 参数名/值)来实例化request对象,而response对象通过调用其request对象,得到其请求内容,相应的给予响应。将这两个对象传递给servlet对象的service()方法。以供大家应用!

3.3 详细设计

3.3.1 StringManager类

    在我们解释该应用程序之前,让我们先来说说TOMCAT内部jar包org.apache.catalina.util里边的StringManager类。这个类用来处理这个程序中不同模块和Catalina自身的错误信息的国际化。
    一个像Tomcat这样的大型应用需要仔细的处理错误信息。在Tomcat中,错误信息对于系统管理员和servlet程序员都是有用的。例如,Tomcat记录错误信息,让系统管理员可以定位发生的任何异常。对servlet程序员来说,Tomcat会在抛出的任何一个 javax.servlet.ServletException中发送一个错误信息,这样程序员可以知道他/她的servlet究竟发送什么错误了。
    Tomcat所采用的方法是在一个属性文件里边存储错误信息,这样,可以容易的修改这些信息。不过,Tomcat中有数以百计的类。把所有类使用的错误信息存储到一个大的属性文件里边将会容易产生维护的噩梦。为了避免这一情况,Tomcat为每个包都分配一个属性文件。例如,在包 org.apache.catalina.connector里边的属性文件包含了该包所有的类抛出的所有错误信息。每个属性文件都会被一个 StringManager类的实例所处理。
    当Tomcat运行时,将会有许多 StringManager实例,每个实例会读取包对应的一个属性文件。此外,由于Tomcat的受欢迎程度,提供多种语言的错误信息也是有意义的。目前,有三种语言是被支持的。英语的错误信息属性文件名为LocalStrings.properties。另外两个是西班牙语和日语,分别放在 LocalStrings_es.properties和LocalStrings_ja.properties里边。
    这里有必要给大家看一下TOMCAT的内部结构图:


当包里边的一个类需要查找放在该包属性文件的一个错误信息时,它首先会获得一个StringManager实例。不过,相同包里边的许多类可能也需要 StringManager,为每个对象创建一个StringManager实例是一种资源浪费。因此,StringManager类被设计成一个StringManager实例可以被包里边的所有类共享。假如你熟悉设计模式,你将会正确的猜到StringManager是一个单例 (singleton)类。仅有的一个构造方法是私有的,所有你不能在类的外部使用new关键字来实例化。你通过传递一个包名来调用它的公共静态方法 getManager来获得一个实例。每个实例存储在一个以包名为键(key)的Hashtable中。

private static Hashtable managers = new Hashtable();
public synchronized static StringManager
getManager(String packageName) {
    StringManager mgr = (StringManager)managers.get(packageName);
    if (mgr == null) {
        mgr = new StringManager(packageName);
        managers.put(packageName, mgr);
    }
    return mgr;
}

3.3.1 应用程序

3.3.1.1 程序框架

神奇

3.3.1.1 程序功能
    其实我们这一小节的内容就是上一节的升级版,因有大量源码,这里就不一一附上了,大家有兴趣的可以留言,我会将源码发给大家,大家也可以下载书中的源码

3.4 小结

    大家下去一定要看源码,了解其内部实现详细过程。

猜你喜欢

转载自blog.csdn.net/L970524/article/details/78442594
今日推荐