How tomcat work 之 第十五章之Digester之ContextConfig之the defaultConfig Method
来源:互联网 发布:淘宝白芷粉面膜 编辑:程序博客网 时间:2024/04/30 01:47
the defaultConfig Method
defaultConfig方法读取和解析默认的web.xml文件,这个文件在CATALINA_HOME/conf目录下。其代码清单如15.13所示:
private void defaultConfig() { // Open the default web.xml file, if it exists File file = new File(Constants.DefaultWebXml); if (!file.isAbsolute()) file = new File(System.getProperty("catalina.base"),Constants.DefaultWebXml); FileInputStream stream = null; try{ stream = new FileInputStream(file.getCanonicalPath()); stream.close(); stream = null; } catch (FileNotFoundException e) { log(sm.getString("contextConfig.defaultMissing")); return; } catch (IOException e) { log(sm.getString("contextConfig.defaultMissing"), e); return; } // Process the default web.xml file synchronized (webDigester) { try { InputSource is =new InputSource("file://" + file.getAbsolutePath()); stream = new FileInputStream(file); is.setByteStream(stream); webDigester.setDebug(getDebug()); if (context instanceof StandardContext) ((StandardContext) context).setReplaceWelcomeFiles(true); webDigester.clear(); webDigester.push(context); webDigester.parse(is); catch (SAXParseException e) { log(sm.getString("contextConfig.defaultParse"), e); log(sm.getString("contextConfig.defaultPosition","" + e.getLineNumber(), "" + e.getColumnNumber())); ok = false; } catch (Exception e) { log(sm.getString("contextConfig.defaultParse"), e); ok = false; } finally { try { if (stream != null) { stream.close(); } } catch (IOException e) { log(sm.getString("contextConfig.defaultClose"), e); } } } }
defaultConfig方法首先创建一个与default.xml文件相关联的文件对象。
File file = new File(Constants.DefaultWebXml);
DefaultWebXML的值是在一个常量类中定义:
public static final String DefaultWebXml = "conf/web.xml";
defaultConfig方法稍后处理web.xml文件。其持有webDigester的内部锁,之后解析文件:
synchronized (webDigester) { try { InputSource is = new InputSource("file://" + file.getAbsolutePath()); stream = new FileInputStream(file); is.setByteStream(stream); webDigester.setDebug(getDebug()); if (context instanceof StandardContext) ((StandardContext) context).setReplaceWelcomeFiles(true); webDigester.clear(); webDigester.push(context); webDigester.parse(is);
与Digester实例关联的webDigester对象已经设置了处理web.xml文件的规则。这会在稍后的章节中讲解。
the applicationConfig method
这个方法与defaultConfig方法相似,除了它处理的是应用部署描述符。部署描述符位于应用程序目录的WEB-INF目录下。
private void applicationConfig() { // Open the application web.xml file, if it exists InputStream stream = null; ServletContext servletContext = context.getServletContext(); if (servletContext != null) stream = servletContext.getResourceAsStream(Constants.ApplicationWebXml); if (stream == null) { log(sm.getString("contextConfig.applicationMissing")); return; } // Process the application web.xml file synchronized (webDigester) { try { 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); webDigester.parse(is); } catch (SAXParseException e) { log(sm.getString("contextConfig.applicationParse"), e); log(sm.getString("contextConfig.applicationPosition","" + e.getLineNumber(),"" + e.getColumnNumber())); ok = false; } catch (Exception e) { log(sm.getString("contextConfig.applicationParse"), e); ok = false; } finally { try { if (stream != null){ stream.close(); } } catch (IOException e) { log(sm.getString("contextConfig.applicationClose"),e); } } } }
create Web Digester
一个Digester对象引用,叫做webDigester,存在于ContextConfig类中:
private static Digester webDigester = createWebDigester();
Digester用于解析默认的web.xml和应用程序中的web.xml文件。当调用createWebDigester方式时,添加处理web.xml文件的规则。其代码清单如下:
private static Digester createWebDigester() { URL url = null; Digester webDigester = new Digester(); webDigester.setValidating(true); url = ContextConfig.class.getResource(Constants.WebDtdResourcePath_22); webDigester.register(Constants.WebDtdPublicId_22,url.toString()); url = ContextConfig.class.getResource(Constants.WebDtdResourcePath_23); webDigester.register(Constants.WebDtdPublicId_23,url.toString()); url.toString()); webDigester.addRuleSet(new WebRuleSet()); return (webDigester);}
注意 createWebDigester方法调用了webDigester的addRuleSet方法,来解析WebRuleSet的一个实例。WebRuleSet是RuleSetBase的一个子类。如果熟悉一个Servlet应用程序的部署描述符的语法并且阅读了这章开头的Digester部分,你应该能够理解其实如何工作的。
WebRuleSet的代码清单如下。注意为了节省空间,移除了addRuleInstance部分。
package org.apache.catalina.startup;import java.lang.reflect.Method;import org.apache.catalina.Context;import org.apache.catalina.Wrapper;import org.apache.catalina.deploy.SecurityConstraint;import org.apache.commons.digester.Digester;import org.apache.commons.digester.Rule;import org.apache.commons.digester.RuleSetBase;import org.xml.sax.Attributes;public class WebRuleSet extends RuleSetBase { protected String prefix = null; public WebRuleSet () { this(""); } public WebRuleSet(String prefix) { super(); this.namespaceURI = null; this.prefix = prefix; } public void addRuleInstances(Digester digester) { digester.addRule(prefix + "web-app",new SetPublicIdRule(digester, "setPublicId")); digester.addCallMethod(prefix + "web-app/context-param","addParameter", 2); digester.addCallParam(prefix +"web-app/context-param/param-name", 0); digester.addCallParam(prefix +"web-app/context-param/param-value", 1); digester.addCallMethod(prefix + "web-app/display-name","setDisplayName", 0); digester.addRule(prefix + "web-app/distributable",new SetDistributableRule(digester)); ... digester.addObjectCreate(prefix + "web-app/filter","org.apache.catalina.deploy.FilterDef"); digester.addSetNext(prefix + "web-app/filter", "addFilterDef","org.apache.catalina.deploy.FilterDef"); digester.addCallMethod(prefix + "web-app/filter/description","setDescription", 0); digester.addCallMethod(prefix + "web-app/filter/display-name", "setDisplayName", 0); digester.addCallMethod(prefix + "web-app/filter/filter-class","setFilterClass", 0); digester.addCallMethod(prefix + "web-app/filter/filter-name","setFilterName", 0); digester.addCallMethod(prefix + "web-app/filter/large-icon","setLargeIcon", 0); digester.addCallMethod(prefix + "web-app/filter/small-icon","setSmallIcon", 0); digester.addCallMethod(prefix + "web-app/filter/init-param","addInitParameter", 2); digester.addCallParam(prefix +"web-app/filter/init-param/param-name", 0); digester.addCallParam(prefix +"web-app/filter/init-param/param-value", 1); digester.addObjectCreate(prefix + "web-app/filter-mapping","org.apache.catalina.deploy.FilterMap"); digester.addSetNext(prefix + "web-app/filter-mapping","addFilterMap", "org.apache.catalina.deploy.FilterMap"); digester.addCallMethod(prefix +"web-app/filter-mapping/filter-name", "setFilterName", 0); digester.addCallMethod(prefix +"web-app/filter-mapping/servlet-name", "setServletName", 0); digester.addCallMethod(prefix +"web-app/filter-mapping/url-pattern", "setURLPattern", 0); digester.addCallMethod (prefix +"web-app/listener/listener-class", "addApplicationListener", 0); ... digester.addRule(prefix + "web-app/servlet",new WrapperCreateRule(digester)); digester.addSetNext(prefix + "web-app/servlet","addChild", "org.apache.catalina.Container"); digester.addCallMethod(prefix + "web-app/servlet/init-param","addInitParameter", 2); digester.addCallParam(prefix +"web-app/servlet/init-param/param-name", 0); digester.addCallParam(prefix +"web-app/servlet/init-param/param-value", 1); digester.addCallMethod(prefix + "web-app/servlet/jsp-file","setJspFile", 0); digester.addCallMethod(prefix +"web-app/servlet/load-on-startup", "setLoadOnStartupString", 0); digester.addCallMethod(prefix +"web-app/servlet/run-as/role-name", "setRunAs", 0); digester.addCallMethod(prefix +"web-app/servlet/security-role-ref", "addSecurityReference", 2); digester.addCallParam(prefix +"web-app/servlet/security-role-ref/role-link", 1); digester.addCallParam(prefix +"web-app/servlet/security-role-ref/role-name", 0); digester.addCallMethod(prefix + "web-app/servlet/servlet-class","setServletdass", 0); digester.addCallMethod(prefix + "web-app/servlet/servlet-name","setName", 0); digester.addCallMethod(prefix + "web-app/servlet-mapping","addServletMapping", 2); digester.addCallParam(prefix +"web-app/servlet-mapping/servlet-name"/ 1); digester.addCallParam(prefix +"web-app/servlet-mapping/url-pattern", 0); digester.addCallMethod (prefix +"web-app/session-config/session-timeout", "setSessionTimeout", 1,new Class[] { Integer.TYPE }); digester.addCallParam(prefix +"web-app/session-config/session-timeout", 0); digester.addCallMethod(prefix + "web-app/taglib","addTaglib", 2); digester.addCallParam(prefix + "web-app/taglib/taglib-location",1); digester.addCallParam(prefix + "web-app/taglib/taglib-uri", 0); digester.addCallMethod(prefix +"web-app/welcome-file-list/welcome-file", "addWelcomeFile", 0); } } // --------------------------------------------- Private Classes final class SetAuthConstraintRule extends Rule { public SetAuthConstraintRule(Digester digester) { super(digester); } public void begin(Attributes attributes) throws Exception { SecurityConstraint securityConstraint = (SecurityConstraint) digester.peek(); securityConstraint.setAuthConstraint(true); if (digester.getDebug() > 0) digester.log("Calling SecurityConstraint.setAuthConstraint(true)"); }}...final class WrapperCreateRule extends Rule { public WrapperCreateRule(Digester digester) { super(digester); } 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()); }public void end() throws Exception { Wrapper wrapper = (Wrapper) digester.pop(); if (digester.getDebug() > 0) digester.log("pop " + wrapper.getclass().getName()); }}
- How tomcat work 之 第十五章之Digester之ContextConfig之the defaultConfig Method
- How Tomcata work之第十五章之ContextConfig
- How Tomcat work 之第十五章之Digester
- How Tomcat work之第十五章之Digester之setting property
- How Tomcat Work 之Digester之The Applicaition
- Tomcat学习之ContextConfig
- Tomcat学习之ContextConfig
- How Tomcat work 之第十四章之service
- How Tomcat Work 之 第十六章 之 ShutDown Hook
- How Tomcat Work 之 第十七章:Tomcat Startup
- how tomcat work之第十四章:server and service
- tomcat源码阅读之Digester
- How Tomcat work 之第十四章之server and services 之application
- How Tomcat works之第十一章之The ServletConfig 对象
- How Tomcat works 之The Application 应用
- xml 解析之digester
- Apache之Digester (1)
- Apache之Digester (2)
- 用VS2012 VS2013编写的程序无法再xp运行的解决方法
- JPDA
- C文件包含.h文件和包含.c文件总结
- 各种基本排序算法的总结
- 如何通过使用Xmanager的图形化界面修改系统
- How tomcat work 之 第十五章之Digester之ContextConfig之the defaultConfig Method
- Blizzard 哈希算法
- 图像全参考客观评价算法比较
- C/C++字节对齐问题总结
- LA 6449 IQ Test
- 【iOS】Toll-Free Bridging 对象桥接(Xcode文档翻译)
- 持续集成(二)环境搭建篇—内网邮件服务器搭建
- Lua语言学习之IO库
- Java基础入学考blog-11