在tomcat中Catalina类启动后,读取sever.xml初始化整个环境,此处使用了一个核心的工具类,搞定了这些,这个类是:Digester,此类继承自 jdk的DefaultHandler;
我们可以从一个简单的例子来窥视,此处使用server.xml的初始化原理,
Digester规则的设定是这样进行的,选取一组简单的代码如下:
digester.addObjectCreate("Server",
"org.apache.catalina.core.StandardServer",
"className");
digester.addSetProperties("Server");
digester.addSetNext("Server",
"setServer",
"org.apache.catalina.Server");
第一行addObjectCreate的详细内容是这样的:
public void addObjectCreate(String pattern, String className,
String attributeName) {
addRule(pattern,
new ObjectCreateRule(className, attributeName));
}
内部ObjectCreateRule 实现了Rule接口的两个方法:
public void begin(String namespace, String name, 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);
}
if (realClassName == null) {
throw new NullPointerException("No class name specified for " +
namespace + " " + name);
}
// Instantiate the new object and push it on the context stack
Class<?> clazz = digester.getClassLoader().loadClass(realClassName);
Object instance = clazz.newInstance();
digester.push(instance);
}
public void end(String namespace, String name) throws Exception {
Object top = digester.pop();
if (digester.log.isDebugEnabled()) {
digester.log.debug("[ObjectCreateRule]{" + digester.match +
"} Pop " + top.getClass().getName());
}
}
所以在解析server.xml文件时,如果遇到Server标签,就会触发public void begin(String namespace, String name, Attributes attributes);
然后在内部利用反射,org.apache.catalina.core.StandardServer进行实例化。
如图:
第二行的: digester.addSetProperties("Server");
也是注册了相应的规则:
public void addSetProperties(String pattern) {
addRule(pattern,
new SetPropertiesRule());
}
在SetPropertiesRule中实现了 public void begin(String namespace, String theName, Attributes attributes)方法。
在其中有
for (int i = 0; i < attributes.getLength(); i++) {
String name = attributes.getLocalName(i);
if ("".equals(name)) {
name = attributes.getQName(i);
}
String value = attributes.getValue(i);
.....
然后重要的在这里:
if (!digester.isFakeAttribute(top, name)
&& !IntrospectionUtils.setProperty(top, name, value)
&& digester.getRulesValidation())
其中:
IntrospectionUtils.setProperty(top, name, value)
完成了对top对象中name属性设置值为value的动作,这样在server.xml中读取的对应标签的属
性就这样设置到对应的对象中。
第三行:
digester.addSetNext("Server",
"setServer",
"org.apache.catalina.Server");
这种规则是这样设置的:
public void addSetNext(String pattern, String methodName,
String paramType) {
addRule(pattern,
new SetNextRule(methodName, paramType));
}
再看如下:
public void end(String namespace, String name) 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());
}
在SetNextRule中只实现了end方法,所以在触发此方法时,调用parent方法中的methodName,设置值为child;
tomcat中的Catalina-->Server->Service->Connector这样的树状结构,正好xml文件的结构也类似如此,所以此处选用这种方法,以灵活的方式初始化整个环境,值得学习。
- 大小: 128.3 KB
分享到:
相关推荐
总之,学习Tomcat源码不仅能够提升你对Web服务器底层工作的理解,还能够提高你在Java Web开发中的问题排查能力,让你成为一名更出色的开发者。通过阅读《How Tomcat Works》并结合实际项目实践,你将能够逐步揭开...
云的学习笔记-云的学习笔记系统-云的学习笔记系统源码-云的学习笔记管理系统-云的学习笔记管理系统java代码-云的学习笔记系统设计与实现-基于ssm的云的学习笔记系统-基于Web的云的学习笔记系统设计与实现-云的学习...
在《Spring Boot》源码学习笔记中,我们可以深入理解其内部工作机制,包括自动配置、起步依赖、命令行接口(CLI)以及如何集成各种组件如JSP等。JSP(JavaServer Pages)是一种用于动态创建网页的技术,Spring Boot ...
【标题】:“Web学习笔记——Tomcat” 在Web开发领域,Tomcat是一个广泛使用的Java Servlet容器,它实现了Java EE中的Web部分,特别是Servlet和JSP规范。Tomcat以其开源、轻量级和高效的特性,成为了许多小型项目和...
【标题】"Tomcat笔记+源码"涵盖了关于Apache Tomcat服务器的重要学习资源,这包括了实际操作的笔记以及源代码分析。Tomcat是Java Servlet和JavaServer Pages(JSP)技术的开源应用服务器,是Java EE应用部署的常用...
这个"spring学习笔记,包括源码学习"的资料很可能包含了一系列关于Spring框架的核心概念、配置、使用方法以及深入源码的解析。 首先,让我们来了解一下Spring框架的基础知识。Spring的核心特性是依赖注入,它允许...
**Tomcat源码研究** Tomcat是一款开源的Java Servlet容器,是Apache软件基金会下的Jakarta项目的一部分。它被广泛用于部署Web应用程序,因为其轻量级、高效且易于理解和定制的特性。以下是对Tomcat源码研究的一些...
总的来说,Tomcat源码分析涉及了从启动流程到核心组件的各个方面,深入学习这些内容能够提升开发者对Web服务器的理解,从而提高开发和维护效率。通过对源码的解读,我们可以更有效地解决性能瓶颈、优化配置,以及...
在本章"Eclipse开发学习笔记第17章源码"中,我们将深入探讨如何使用Eclipse集成开发环境(IDE)来构建一个实际的在线购物系统。这个实例将涵盖多个关键的IT知识点,包括软件工程的设计原则、Java编程、Web应用程序...
这个压缩包文件包含了相关的源码和笔记,可以帮助我们深入理解和学习JavaWeb的核心概念。 首先,JavaWeb开发的核心是Servlet技术。Servlet是Java提供的一种服务器端的Java应用程序接口,用于生成动态Web内容。它...
7. IDEA 安装JREBEL插件 7 8. IDEA不能实时编译的一个临时解决办法 8 8.1. 可以用(CTRL+S和CTRL+F9)进行保存和编译 8 8.2. 通过IDEA录制宏的功能,内容是CTRL+S和CTRL+F9 8 9. IDEA 设置代码提示或自动补全的...
2、包含web部分的代码需要在Tomcat运行,请测试这些程序前先安装Tomcat程序,并在 eclipse中配置好tomcat。 3、有些章包含访问数据库的例子,这些章的代码下面包含db.sql的数据库脚本,请运行这些 代码之前先使用...
《How Tomcat Works》这本书是理解Apache Tomcat服务器工作原理的重要资源,第三章主要探讨了Tomcat的架构和核心...通过深入学习这一章,开发者能够更好地掌握如何配置和管理Tomcat,以及如何设计高效的Web应用程序。
这个"springboot学习笔记源码"包含了基于JSP、JPA和FreeMarker的实践项目,非常适合初学者或者希望深入理解SpringBoot集成这些技术的开发者进行学习。 1. **SpringBoot核心概念** SpringBoot的核心特性包括自动...
Spring源码分析,web源码分析,Tomcat架构源码分析都是非常深入的源码级课程,期待研究设计模式和深入学习源码内功的朋友们,一定要仔细的学习研究。 (0);目录中文件数:1个 ├─3.代码.zip (1)\1.笔记;目录中文...
【标题】"Tomcat学习笔记 - 使用JNDI数据源" 在Java应用服务器如Tomcat中,使用JNDI(Java Naming and Directory Interface)数据源是一种标准的方式,它允许我们集中管理和配置数据库连接,提高应用的可移植性和可...
**Eclipse 开发学习笔记** Eclipse是一款强大的集成开发环境(IDE),主要用于Java应用程序的开发,但通过插件也可以支持其他编程语言,如C++, Python等。这份《Eclipse开发学习笔记》是针对想要深入理解和掌握...
本学习笔记源码提供了全面的学习资源,涵盖了这两个技术的基础到高级应用,旨在帮助开发者深入理解并熟练掌握JSP和Servlet。 1. **JSP基础**: JSP是一种服务器端的脚本语言,它将HTML、CSS、JavaScript与Java代码...