`
chongquanyumo
  • 浏览: 31100 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

tomcat7 源码学习笔记 1

阅读更多
tomcat7启动后,从启动,到对端口完成监听整个过程,如图:



其中Bootstrap为tomcat启动类,
调用顺序:

Bootstrap.start() --> 反射调用 Catalina.start() -->  StandardServer.start() -->

StandardService.start() --> Connector.start()(启动两个,一个为 HTTP:一个为 AJP)

--> Http11Protocol.start() --> JIoEndpoint.start()

以上类之间的关联方式:

1.在Bootstrap的init()方法中:是采用反射的方式建立对 Catalina 的引用关系:
            
  Class<?> startupClass = catalinaLoader.loadClass
	            ("org.apache.catalina.startup.Catalina");
	        Object startupInstance = startupClass.newInstance();
	
	        // Set the shared extensions class loader
	        if (log.isDebugEnabled())
	            log.debug("Setting startup class properties");
	        String methodName = "setParentClassLoader";
	        Class<?> paramTypes[] = new Class[1];
	        paramTypes[0] = Class.forName("java.lang.ClassLoader");
	        Object paramValues[] = new Object[1];
	        paramValues[0] = sharedLoader;
	        Method method =
	            startupInstance.getClass().getMethod(methodName, paramTypes);
	        method.invoke(startupInstance, paramValues);
	
	        catalinaDaemon = startupInstance;

               Bootstrap中调用Catalina的方式如下:
             
 Method method = catalinaDaemon.getClass().getMethod("start", (Class [] )null);
        method.invoke(catalinaDaemon, (Object [])null);

2.在Catalina 类中对 StandardServer的引用关系如何建立:
 
  在Bootstrap.load()在执行过程中,以反射的形式调用 Catalina.load(),
 
  在 Catalina.load()  中有:
              
               
Digester digester = createStartDigester();


  在createStartDigester() 方法中有如下程序完成了对 Catalina中server属性的初始化:
   首先定义Rule
digester.addObjectCreate("Server",
                                 "org.apache.catalina.core.StandardServer",
                                 "className");
        digester.addSetProperties("Server");
        digester.addSetNext("Server",
                            "setServer",
                            "org.apache.catalina.Server");

   然后在读取server.xml文件:
           
file = configFile();//conf/server.xml
            inputStream = new FileInputStream(file);
            inputSource = new InputSource(file.toURI().toURL().toString());

    最终在解析过程中将 StandardServer 的实例设置给 Catalina的 server 属性
     
 digester.parse(inputSource);


    此处digester的使用值得深入研究。

3.在读取server.xml进行解析时,因为server.xml中有配置
   
 <Service name="Catalina">
 <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
  <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
  </Service>

   所以 StandardServer对Connector的引用关系也完成了初始化。
4.Connector中对Http11Protocol的实例化是这样进行的,在server.xml中配置了protocol="HTTP/1.1",然后在代码中有如下创建过程:
   
     public void setProtocol(String protocol) {

        if (AprLifecycleListener.isAprAvailable()) {
            if ("HTTP/1.1".equals(protocol)) {
                setProtocolHandlerClassName
                    ("org.apache.coyote.http11.Http11AprProtocol");
            } else if ("AJP/1.3".equals(protocol)) {
                setProtocolHandlerClassName
                    ("org.apache.coyote.ajp.AjpAprProtocol");
            } else if (protocol != null) {
                setProtocolHandlerClassName(protocol);
            } else {
                setProtocolHandlerClassName
                    ("org.apache.coyote.http11.Http11AprProtocol");
            }
        } else {
            if ("HTTP/1.1".equals(protocol)) {
                setProtocolHandlerClassName
                    ("org.apache.coyote.http11.Http11Protocol");
            } else if ("AJP/1.3".equals(protocol)) {
                setProtocolHandlerClassName
                    ("org.apache.coyote.ajp.AjpProtocol");
            } else if (protocol != null) {
                setProtocolHandlerClassName(protocol);
            }
        }

    }
   

然后继续以反射方式实例化:
 Class<?> clazz = Class.forName(protocolHandlerClassName);
            this.protocolHandler = (ProtocolHandler) clazz.newInstance();


5.Http11Protocol 对 JIoEndpoint 实例化在构造函数中直接新型,这也是,此条路径下来,唯一一个面向实例的,没有再面向接口的关联方法

public Http11Protocol() {
        endpoint = new JIoEndpoint();
        cHandler = new Http11ConnectionHandler(this);
        ((JIoEndpoint) endpoint).setHandler(cHandler);
        setSoLinger(Constants.DEFAULT_CONNECTION_LINGER);
        setSoTimeout(Constants.DEFAULT_CONNECTION_TIMEOUT);
        setTcpNoDelay(Constants.DEFAULT_TCP_NO_DELAY);
    }

这样看下来,在第3步中,对server.xml的解析,确实做的很好,关于这块应该再写一篇。
  • 大小: 65.1 KB
分享到:
评论

相关推荐

    学习tomcat源码+英文《How Tomcat Work》和每一章的相关项目+tomcat6源码依赖jar

    总之,学习Tomcat源码不仅能够提升你对Web服务器底层工作的理解,还能够提高你在Java Web开发中的问题排查能力,让你成为一名更出色的开发者。通过阅读《How Tomcat Works》并结合实际项目实践,你将能够逐步揭开...

    Spring 学习笔记《Spring Boot》源码

    在《Spring Boot》源码学习笔记中,我们可以深入理解其内部工作机制,包括自动配置、起步依赖、命令行接口(CLI)以及如何集成各种组件如JSP等。JSP(JavaServer Pages)是一种用于动态创建网页的技术,Spring Boot ...

    云的学习笔记-云的学习笔记系统-云的学习笔记系统源码-云的学习笔记管理系统-基于ssm的云的学习笔记系统-ssm-java代码

    云的学习笔记-云的学习笔记系统-云的学习笔记系统源码-云的学习笔记管理系统-云的学习笔记管理系统java代码-云的学习笔记系统设计与实现-基于ssm的云的学习笔记系统-基于Web的云的学习笔记系统设计与实现-云的学习...

    web学习笔记 —— tomcat

    【标题】:“Web学习笔记——Tomcat” 在Web开发领域,Tomcat是一个广泛使用的Java Servlet容器,它实现了Java EE中的Web部分,特别是Servlet和JSP规范。Tomcat以其开源、轻量级和高效的特性,成为了许多小型项目和...

    Tomcat笔记+源码!!!!!!!!!!

    【标题】"Tomcat笔记+源码"涵盖了关于Apache Tomcat服务器的重要学习资源,这包括了实际操作的笔记以及源代码分析。Tomcat是Java Servlet和JavaServer Pages(JSP)技术的开源应用服务器,是Java EE应用部署的常用...

    spring学习笔记,包括源码学习

    这个"spring学习笔记,包括源码学习"的资料很可能包含了一系列关于Spring框架的核心概念、配置、使用方法以及深入源码的解析。 首先,让我们来了解一下Spring框架的基础知识。Spring的核心特性是依赖注入,它允许...

    Tomcat源码研究.pdf

    **Tomcat源码研究** Tomcat是一款开源的Java Servlet容器,是Apache软件基金会下的Jakarta项目的一部分。它被广泛用于部署Web应用程序,因为其轻量级、高效且易于理解和定制的特性。以下是对Tomcat源码研究的一些...

    tomcat源码分析

    总的来说,Tomcat源码分析涉及了从启动流程到核心组件的各个方面,深入学习这些内容能够提升开发者对Web服务器的理解,从而提高开发和维护效率。通过对源码的解读,我们可以更有效地解决性能瓶颈、优化配置,以及...

    Eclipse 开发学习笔记第17章源码

    在本章"Eclipse开发学习笔记第17章源码"中,我们将深入探讨如何使用Eclipse集成开发环境(IDE)来构建一个实际的在线购物系统。这个实例将涵盖多个关键的IT知识点,包括软件工程的设计原则、Java编程、Web应用程序...

    一些javaweb源码和笔记

    这个压缩包文件包含了相关的源码和笔记,可以帮助我们深入理解和学习JavaWeb的核心概念。 首先,JavaWeb开发的核心是Servlet技术。Servlet是Java提供的一种服务器端的Java应用程序接口,用于生成动态Web内容。它...

    IDEA14 学习笔记

    7. IDEA 安装JREBEL插件 7 8. IDEA不能实时编译的一个临时解决办法 8 8.1. 可以用(CTRL+S和CTRL+F9)进行保存和编译 8 8.2. 通过IDEA录制宏的功能,内容是CTRL+S和CTRL+F9 8 9. IDEA 设置代码提示或自动补全的...

    Eclipse 开发学习笔记(源码17)

    1、各章代码分别在各章的文件夹下,所有代码均包含eclipse工程文件,可以在eclipse中导 入、编译、部署。 2、包含web部分的代码需要在Tomcat运行,请测试这些程序前先安装Tomcat程序,并在 eclipse中配置好tomcat...

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

    《How Tomcat Works》这本书是理解Apache Tomcat服务器工作原理的重要资源,第三章主要探讨了Tomcat的架构和核心...通过深入学习这一章,开发者能够更好地掌握如何配置和管理Tomcat,以及如何设计高效的Web应用程序。

    springboot学习笔记源码

    这个"springboot学习笔记源码"包含了基于JSP、JPA和FreeMarker的实践项目,非常适合初学者或者希望深入理解SpringBoot集成这些技术的开发者进行学习。 1. **SpringBoot核心概念** SpringBoot的核心特性包括自动...

    最新设计模式超级详解+Tomcat架构源码分析+Spring源码分析 资深级设计模型课程

    Spring源码分析,web源码分析,Tomcat架构源码分析都是非常深入的源码级课程,期待研究设计模式和深入学习源码内功的朋友们,一定要仔细的学习研究。 (0);目录中文件数:1个 ├─3.代码.zip (1)\1.笔记;目录中文...

    Tomcat学习笔记 - 【使用JNDI数据源】

    【标题】"Tomcat学习笔记 - 使用JNDI数据源" 在Java应用服务器如Tomcat中,使用JNDI(Java Naming and Directory Interface)数据源是一种标准的方式,它允许我们集中管理和配置数据库连接,提高应用的可移植性和可...

    Eclipse 开发学习笔记.pdf

    **Eclipse 开发学习笔记** Eclipse是一款强大的集成开发环境(IDE),主要用于Java应用程序的开发,但通过插件也可以支持其他编程语言,如C++, Python等。这份《Eclipse开发学习笔记》是针对想要深入理解和掌握...

    JSP Servlet 学习笔记源码

    本学习笔记源码提供了全面的学习资源,涵盖了这两个技术的基础到高级应用,旨在帮助开发者深入理解并熟练掌握JSP和Servlet。 1. **JSP基础**: JSP是一种服务器端的脚本语言,它将HTML、CSS、JavaScript与Java代码...

Global site tag (gtag.js) - Google Analytics