1 Digester
Digester在tomcat中的作用是对conf下的server.xml文件进行实例化,其是从Catalian这个组件开始,创建Digester实例,再添加对应的规则,然后将其实例化,通过setServer方法,将其实例话的对象作为当前Catalian实例的句柄。这样就实现了对象句柄之间的关联引用,从而实现整个平台的递进启动。
1.1 UML类图
1.2 UML时序图
1.3 规则添加解析
1.3.1 添加对应解析规则
规则的添加实在Catalia.java的load()方法之中。规则主要是根据各个标签创建对应对象的规则,以及解析对象的通过何种方法设为相应句柄属性。其主要实现过程是创建Digester实例,设置规则
protected Digester createStartDigester() {
long t1=System.currentTimeMillis();
//创建一个digester实例
Digesterdigester = new Digester();
//是否需要验证xml文档的合法性,false表示不需要进行DTD规则校验
digester.setValidating(false);
//是否需要进行节点设置规则校验
digester.setRulesValidation(true);
//将xml节点中的className作为假属性,不用调用默认的setter方法
//在解析时,调用相应对象的setter方法来设置属性值,setter的参数就是节点属性,
//而有className的话,则直接使用className来直接实例化对象
HashMap<Class<?>,List<String>> fakeAttributes = new HashMap<>();
ArrayList<String> attrs = new ArrayList<>();
attrs.add("className");
fakeAttributes.put(Object.class, attrs);
digester.setFakeAttributes(fakeAttributes);
digester.setUseContextClassLoader(true);
//遇到xml中Server节点,就创建一个StandardServer对象注意在这里只是添加了这个规则
digester.addObjectCreate("Server",
"org.apache.catalina.core.StandardServer",
"className");
//根据Server节点中的属性信息,调用属性的setter方法,比如说server节点中会有port=“8080”属性,则会调用setPort方法
digester.addSetProperties("Server");
//在上面的load方法中有个digester.push(this),this对象就是栈顶了
//这里将Server节点对应的对象作为参数,调用this对象,也就是Catalina对象的setServer方法
//意思即将addObjectCreate 在解析后的对象通过this在digester.push(this)中通过setServer方法注入当前server对象
//注意这里只是添加规则
digester.addSetNext("Server",
"setServer",
"org.apache.catalina.Server");
//Server节点下的GlobalNamingResources节点,创建一个NamingResource对象
digester.addObjectCreate("Server/GlobalNamingResources",
"org.apache.catalina.deploy.NamingResourcesImpl");
digester.addSetProperties("Server/GlobalNamingResources");
digester.addSetNext("Server/GlobalNamingResources",
"setGlobalNamingResources",
"org.apache.catalina.deploy.NamingResourcesImpl");
//Server下的Listener节点
digester.addObjectCreate("Server/Listener",
null, // MUST bespecified in the element
"className");
digester.addSetProperties("Server/Listener");
digester.addSetNext("Server/Listener",
"addLifecycleListener",
"org.apache.catalina.LifecycleListener");
//Server下的Service节点
digester.addObjectCreate("Server/Service",
"org.apache.catalina.core.StandardService",
"className");
digester.addSetProperties("Server/Service");
digester.addSetNext("Server/Service",
"addService",
"org.apache.catalina.Service");
//Service节点下的Listener节点
digester.addObjectCreate("Server/Service/Listener",
null, // MUST bespecified in the element
"className");
digester.addSetProperties("Server/Service/Listener");
digester.addSetNext("Server/Service/Listener",
"addLifecycleListener",
"org.apache.catalina.LifecycleListener");
//Executor节点
digester.addObjectCreate("Server/Service/Executor",
"org.apache.catalina.core.StandardThreadExecutor",
"className");
digester.addSetProperties("Server/Service/Executor");
digester.addSetNext("Server/Service/Executor",
"addExecutor",
"org.apache.catalina.Executor");
//给Connector添加规则,就是当遇到Connector的时候,会调用ConnectorCreateRule里面定义的规则
//跟上面的作用是一样的,只不过该节点的规则比较多,就创建一个规则类
digester.addRule("Server/Service/Connector",
new ConnectorCreateRule());
digester.addRule("Server/Service/Connector",
new SetAllPropertiesRule(new String[]{"executor"}));
digester.addSetNext("Server/Service/Connector",
"addConnector",
"org