How tomcat works 读书笔记十五 Digester库 下
在这一节里我们说说ContextConfig这个类。
这个类在很早的时候我们就已经使用了(之前那个叫SimpleContextConfig),但是在之前它干的事情都很简单,就是吧context里的configured变量置为true。在这里我们看看完整版的ContextConfig都干了什么。
在tomcat的实际部署中,StandContext类的实际监听器是org.apache.catalina.startup.ContextConfig的实例。
ContextConfig完成加载验证器阀,许可阀到StandContext的管道阀中。但最重要的就是应用上一节的Digester库,解析两个xml文件。一个是整个tomcat的配置文件,web.xml,在conf目录下。另一个是单个web应用的xml文件,在WEB-INF目录下。
在这里我主要说说如何让系统根据我们在某个web应用下的web.xml里面指定的那样,自动创建StandWrapper。
LifecycleListener listener = new ContextConfig();
((Lifecycle) context).addLifecycleListener(listener);
首先得在StandContext里注入ContextConfig这个监听器。
在StandContext的启动与关闭中,会触发以下的事件:
START_ENENT
STOP_ENENT
ContextConfig.java
public void lifecycleEvent(LifecycleEvent event) {
...
// Process the event that has occurred
if (event.getType().equals(Lifecycle.START_EVENT))
start();
else if (event.getType().equals(Lifecycle.STOP_EVENT))
stop();
}
我们看看ContextConfig的start方法。
private synchronized void start() {
...
// Process the default and application web.xml files
defaultConfig(); //解析conf/xml.xml
applicationConfig(); //解析WEB-INF/web.xml
...
}
我们先不管整个tomcat的xml就看单个项目的:
private void applicationConfig() {
...
// Process the application web.xml file
synchronized (webDigester) {
//public static final String ApplicationWebXml = "/WEB-INF/web.xml";
URL url =servletContext.getResource(Constants.ApplicationWebXml);
InputSource is = new InputSource(url.toExternalForm());
is.setByteStream(stream);
webDigester.setDebug(getDebug());
if (context instanceof StandardContext) {
((StandardContext) context).setReplaceWelcomeFiles(true);
}
webDigester.clear();
webDigester.push(context);//此时的栈里面就有context了
webDigester.parse(is); //开始解析
}
...
}
现在的问题是,那webDigester是怎么来的?
在ContextConfig中有下面的一个类变量。
private static Digester webDigester = createWebDigester();
我们看看createWebDigester
private static Digester createWebDigester() {
...
Digester webDigester = new Digester();
...
webDigester.addRuleSet(new WebRuleSet()); //addRuleSet 对这个不清楚的看上一节
return (webDigester);
}
现在我们就要去看WebRuleSet类了,还记得主要看哪个方法吗?
WebRuleSet.java
public void addRuleInstances(Digester digester) {
....
digester.addRule(prefix + "web-app/servlet",new WrapperCreateRule(digester));
...
digester.addCallMethod(prefix + "web-app/servlet/servlet-class",
"setServletClass", 0);
digester.addCallMethod(prefix + "web-app/servlet/servlet-name",
"setName", 0);
digester.addCallMethod(prefix + "web-app/servlet-mapping",
"addServletMapping", 2);
//setServletClass这个方法最后在哪里调用的? 请大家自己想一想
}
final class WrapperCreateRule extends Rule {
public void begin(Attributes attributes) throws Exception {
Context context =(Context) digester.peek(digester.getCount() - 1);
Wrapper wrapper = context.createWrapper();
digester.push(wrapper);
if (digester.getDebug() > 0)
digester.log("new " + wrapper.getClass().getName());
}
}
大家看出流程了吗?
首先加入一个规则
digester.addRule(prefix + "web-app/servlet",new WrapperCreateRule(digester));
碰到web-app/servlet就调用begin方法,产生了一个wrapper。
web-app/servlet/servlet-name 碰到这个后,调用wrapper的那个方法就ok。
How tomcat works 读书笔记十五 Digester库 下的更多相关文章
- How tomcat works 读书笔记十五 Digester库 上
Digester库 在前面的几个章节里,我们对tomcat里各个组件的配置完全是使用写硬编码的形式完成的. 如 Context context = new StandardContext(); Loa ...
- How tomcat works 读书笔记十四 服务器组件和服务组件
之前的项目还是有些问题的,例如 1 只能有一个连接器,只能处理http请求,无法添加另外一个连接器用来处理https. 2 对容器的关闭只能是粗暴的关闭Bootstrap. 服务器组件 org.apa ...
- How tomcat works 读书笔记十二 StandardContext 下
对重载的支持 tomcat里容器对重载功能的支持是依靠Load的(在目前就是WebLoader).当在绑定载入器的容器时 public void setContainer(Container cont ...
- How tomcat works 读书笔记十二 StandardContext 上
在tomcat4中,StandardContext.java是最大的一个类,有117k.废话不说,开始分析吧. 其实要分析StandardContext,也就主要分析两个方法,一个start,一个in ...
- how tomcat works 读书笔记(二)----------一个简单的servlet容器
app1 (建议读者在看本章之前,先看how tomcat works 读书笔记(一)----------一个简单的web服务器 http://blog.csdn.net/dlf123321/arti ...
- how tomcat works 读书笔记四 tomcat的默认连接器
事实上在第三章,就已经有了连接器的样子了,只是那仅仅是一个学习工具,在这一章我们会開始分析tomcat4里面的默认连接器. 连接器 Tomcat连接器必须满足下面几个要求 1 实现org.apache ...
- how tomcat works读书笔记 七 日志记录器
大家可以松一口气了,这个组件比较简单,这一节和前面几节想比,也简单的多. Logger接口 Tomcat中的日志记录器都必须实现org.apache.catalina.Logger接口. packag ...
- How Tomcat Works读书笔记三-------连接器
几个概念 HttpServlet,Servlet Servlet是一个接口,定义了一种网络服务,我们所有的servlet都要实现它(或它的子类) HttpServlet是一个抽象类,它针对的就是htt ...
- How tomcat works 读书笔记十七 启动tomcat 上
一路跋山涉水,这是最后一章了. 关于tomcat的启动,有两个类,一个是Catalina类,一个是Bootstrap类. 理论上,两个类可以和到一起,但是为了支持多种运行模式,又把他们分开了. 为了让 ...
随机推荐
- 插件开发之360 DroidPlugin源码分析(五)Service预注册占坑
请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52264977 在了解系统的activity,service,broa ...
- Dynamics CRM 检测访问CRM延迟及带宽的工具
直接在浏览器中访问如下地址"http://CRMHOST/organization/tools/diagnostics/diag.aspx"(这里的CRMHOST和organiza ...
- Web开发技术的演变
原文出处: WildFly 欢迎分享原创到伯乐头条 受到好文<Web开发的发展史>(英文)激发的灵感,写下我对web开发技术的认识. 1. 静态页面时代 大学时候,上机还得换卡穿拖鞋, ...
- Unity UGUI基础之InputField
InputField(输入域):为文本输入控件,等同于NGUI的Input. 一.InputField组件: Text Component(文本组件):此输入域的文本显示组件,需带有Text组件. T ...
- 最简单的基于FFmpeg的AVDevice例子(读取摄像头)
=====================================================最简单的基于FFmpeg的AVDevice例子文章列表: 最简单的基于FFmpeg的AVDev ...
- Sql表注释
1 创建表的时候写注释 create table test1 ( field_name int comment '字段的注释' )comment='表的注释'; 2 修改表的注释 alter tabl ...
- linux服务器批量部署应用系统shell脚本(Tomcat/jetty)
linux服务器批量部署应用系统shell脚本: 1.请更换代码内的服务器地址(Tomcat或jetty服务器) serverRoot=/home/undoner/java_tool/apache-t ...
- javascript之数组对象与数组常用方法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- go-mysql: database/sql 接口适配
go-mysql已经支持golang database/sql接口,并通过https://github.com/bradfitz/go-sql-test测试用例. 现在go-mysql可以直接通过go ...
- 【leetcode80】Reverse Vowels of a String(元音字母倒叙)
题目描述: 写一个函数,实现输入一个字符串,然后把其中的元音字母倒叙 注意 元音字母包含大小写,元音字母有五个a,e,i,o,u 原文描述: Write a function that takes a ...