tomcat 首先启动
1. 启动的时候对配置文件进行解析。
2. tomcat解析conf/server.xml文件,这里的设计非常的巧妙。
3. Digester类里面的startElement方法
// Fire "begin" events for all relevant rules
List rules = getRules().match(namespaceURI, match);
matches.push(rules);
if ((rules != null) && (rules.size() > 0)) {
for (int i = 0; i < rules.size(); i++) {
try {
Rule rule = (Rule) rules.get(i);
if (debug) {
log.debug(" Fire begin() for " + rule);
}
rule.begin(namespaceURI, name, list);
} catch (Exception e) {
log.error("Begin event threw exception", e);
throw createSAXException(e);
} catch (Error e) {
log.error("Begin event threw error", e);
throw e;
}
}
} else {
if (debug) {
log.debug(" No rules found matching '" + match + "'.");
}
}
注意这里面的
rule.begin(namespaceURI, name, list);
方法,调用的是
/**
* Process the beginning of this element.
*
* @param attributes The attribute list of this element
*/
public void begin(Attributes attributes) throws Exception {
// Identify the name of the class to instantiate
String realClassName = className;
if (attributeName != null) {
String value = attributes.getValue(attributeName);
if (value != null) {
realClassName = value;
}
}
if (digester.log.isDebugEnabled()) {
digester.log.debug("[ObjectCreateRule]{" + digester.match +
"}New " + realClassName);
}
// Instantiate the new object and push it on the context stack
Class clazz = digester.getClassLoader().loadClass(realClassName);
Object instance = clazz.newInstance();
digester.push(instance);
}
注意这里:
digester.push(instance);
下面是实现:
/**
* Push a new object onto the top of the object stack.
*
* @param object The new object
*/
public void push(Object object) {
if (stack.size() == 0) {
root = object;
}
stack.push(object);
}
下面是标签在结束的时候调用的方法。
public void end() throws Exception {
// Identify the objects to be used
Object child = digester.peek(0);
Object parent = digester.peek(1);
if (digester.log.isDebugEnabled()) {
if (parent == null) {
digester.log.debug("[SetNextRule]{" + digester.match +
"} Call [NULL PARENT]." +
methodName + "(" + child + ")");
} else {
digester.log.debug("[SetNextRule]{" + digester.match +
"} Call " + parent.getClass().getName() + "." +
methodName + "(" + child + ")");
}
}
// Call the specified method
IntrospectionUtils.callMethod1(parent, methodName,
child, paramType, digester.getClassLoader());
}
再通过
/**
* Process the end of this element.
*/
public void end() throws Exception {
Object top = digester.pop();
if (digester.log.isDebugEnabled()) {
digester.log.debug("[ObjectCreateRule]{" + digester.match +
"} Pop " + top.getClass().getName());
}
}
总结来说,就是通过一个栈,将解析xml转换为对象,因为上下级(xml之间的父子关系)。这里面使用栈巧妙的实现。
详细的说:
stack.push(object);
栈压入一个对象parent,第一个对象为root。
压入第二个对象child,在其解析结束end的时候,分别获取当前的上一个对象parent和当前对象child。
调用方法,假设方法为addXxx
parent.addXxx(child);
调用方法完毕后。
执行stack.pop();
将栈顶元素取出,执行完毕。
分享到:
相关推荐
### tomcat源码解析 #### 简介与概览 Tomcat作为一款开源的Servlet容器,被广泛应用于Java Web应用的开发与部署环境中。它不仅支持Servlet API,还支持JSP规范,使得开发者能够轻松地构建动态网页。本文旨在深入...
### Tomcat源码解析知识点概览 #### 一、Tomcat概述 - **定义**:Apache Tomcat是一款开源的Servlet容器,它实现了Servlet规范,并且提供了作为Web服务器的一些特性,但其提供的性能远不及专业的Web服务器,如...
这份Tomcat源码解析文档详细地介绍了Tomcat从启动到最后结束的过程,包括其中涉及的类和方法的调用过程。这份文档对于想要深入研究Java底层源码启动过程的人来说十分有用。除了介绍Tomcat的启动过程,这份文档还可以...
Tomcat源码剖析 : 整体架构 层层分析 源码解析 架构分析 (Http服务器功能:Socket通信(TCP/IP)、解析Http报文 Servlet容器功能:有很多Servlet(自带系统级Servlet+自定义Servlet),Servlet处理具体的业务逻辑...
源码解析部分则是对Tomcat源码的深度剖析,涵盖了关键类和方法的作用、设计模式的运用以及性能优化技巧。这有助于开发者理解Tomcat内部的工作流程,例如,如何处理HTTP请求的生命周期,以及线程池是如何调度和管理的...
总之,Apache Tomcat的源码解析是一次深入学习Java Web技术的宝贵机会,它可以帮助你更好地理解Servlet和JSP的运行机制,提升你的开发和调试技能。通过实际操作编译源码,你可以进一步掌握Maven和Java构建流程,为...
【Apache Tomcat源码解析】 Apache Tomcat,作为开源的Java Servlet容器,是实现Java EE Web应用程序规范的主要工具之一。Tomcat 7.0.50版本是它的一个重要里程碑,提供了许多稳定性和性能的改进。这个源码压缩包...
【标题】"Tomcat源码分析系列文档"深入解析了Apache Tomcat服务器的内部工作原理,涵盖了一系列关键知识点,如HTTP协议、类加载机制、容器设计模式等。这些文档为理解Tomcat的运行机制提供了宝贵的资源。 【描述】...
二、Tomcat源码解析 1. **启动过程**:从`bin/catalina.sh`或`catalina.bat`开始,通过`Bootstrap`类启动`Catalina`,接着加载`Server.xml`配置,初始化各个组件。 2. **请求处理**:当请求到达时,Coyote连接器...
Tomcat源码解析: Tomcat作为Servlet容器,其源码中包含了对Servlet和JSP规范的实现。主要的组件有Coyote(处理HTTP连接)、Apr(Apache Portable Runtime,提高性能)、Jasper(JSP编译器)等。Coyote负责接收和...
带目录的《深入剖析TOMCAT》中文版,带目录,便于大家阅读
【标题】"Tomcat源码导入MyEclipse"是一个针对Java开发者的重要实践操作,它涉及到两个关键组件:Tomcat服务器和MyEclipse集成开发环境。Tomcat是Apache软件基金会的一个开源项目,它作为Servlet和JavaServer Pages...
《深入理解Tomcat源码:必备依赖包解析》 Tomcat作为一款广泛应用的开源Java Servlet容器,其源码的编译与理解对于开发者来说具有重要的价值。为了能够顺利地编译Tomcat源码,了解并掌握相关的依赖包是至关重要的。...
在Tomcat源码中,Catalina的脚本解析是了解其启动流程的关键。首先,Tomcat会解析conf/server.xml文件,该文件中定义了所有容器组件的配置。脚本解析的过程涉及到几个关键类,如Digester,它负责将XML文件中的配置...
《深入解析Tomcat源码编译所需jar包》 Tomcat作为一款广泛应用的开源Web服务器和Servlet容器,其源码的编译与理解对于开发者来说是提升技术水平的重要途径。源码编译过程中,jar包的正确配置至关重要。本文将详细...
【标题】"Tomcat源码学习:一个最简单的‘Tomcat’",这篇博客主要探讨的是如何通过学习Tomcat的源代码来理解这个流行的开源Java Servlet容器的工作原理。Tomcat是Apache软件基金会的一个项目,它是Java Web应用...
《深入剖析Tomcat7源码》 Tomcat7是一款广泛使用的开源Java Servlet容器,它实现了Java EE中的Servlet和JSP规范。源码分析是提升开发者对服务器内部运作机制理解的重要途径,尤其对于Tomcat这样的核心组件,源码的...