您的位置:首页 > 运维架构 > Tomcat

tomcat源码浅析(四)之web.xml解析

2017-04-01 17:57 183 查看
     Tomcat会先读取通用conf/web.xml,再读取应用程序下WEB-INF/web.xml。通用的cong/web.xml中配置了处理静态页面的org.apache.catalina.servlets.DefaultServlet和处理jsp的org.apache.jasper.servlet.JspServlet。

1.Context在start时先调用bindThread()将Loard的classLoader绑定到线程中,这样Digester在去classLoader时就可以取到Loard的classLoader。

Standardcontext.startinternal代码

protected synchronized void startInternal() throws LifecycleException {  
  
        if (log.isDebugEnabled())  
            log.debug("Starting " + getBaseName());  
  
        // Send j2ee.state.starting notification   
        if (this.getObjectName() != null) {  
            Notification notification = new Notification("j2ee.state.starting", this.getObjectName(),  
                    sequenceNumber.getAndIncrement());  
            broadcaster.sendNotification(notification);  
        }  
  
        setConfigured(false);  
        boolean ok = true;  
  
        // Currently this is effectively a NO-OP but needs to be called to  
        // ensure the NamingResources follows the correct lifecycle  
        if (namingResources != null) {  
            namingResources.start();  
        }  
  
        // Add missing components as necessary  
        if (webappResources == null) { // (1) Required by Loader  
            if (log.isDebugEnabled())  
                log.debug("Configuring default Resources");  
            try {  
                String docBase = getDocBase();  
                if (docBase == null) {  
                    setResources(new EmptyDirContext());  
                } else if (docBase.endsWith(".war") && !(new File(getBasePath())).isDirectory()) {  
                    setResources(new WARDirContext());  
                } else {  
                    setResources(new FileDirContext());  
                }  
            } catch (IllegalArgumentException e) {  
                log.error(sm.getString("standardContext.resourcesInit"), e);  
                ok = false;  
            }  
        }  
        if (ok) {  
            if (!resourcesStart()) {  
                throw new LifecycleException("Error in resourceStart()");  
            }  
        }  
  
        if (getLoader() == null) {  
            WebappLoader webappLoader = new WebappLoader(getParentClassLoader());  
            webappLoader.setDelegate(getDelegate());  
            setLoader(webappLoader);  
        }  
  
        // Initialize character set mapper  
        getCharsetMapper();  
  
        // Post work directory  
        postWorkDirectory();  
  
        // Validate required extensions  
        boolean dependencyCheck = true;  
        try {  
            dependencyCheck = ExtensionValidator.validateApplication(getResources(), this);  
        } catch (IOException ioe) {  
            log.error(sm.getString("standardContext.extensionValidationError"), ioe);  
            dependencyCheck = false;  
        }  
  
        if (!dependencyCheck) {  
            // do not make application available if dependency check fails  
            ok = false;  
        }  
  
        // Reading the "catalina.useNaming" environment variable  
        String useNamingProperty = System.getProperty("catalina.useNaming");  
        if ((useNamingProperty != null) && (useNamingProperty.equals("false"))) {  
            useNaming = false;  
        }  
  
        if (ok && isUseNaming()) {  
            if (getNamingContextListener() == null) {  
                NamingContextListener ncl = new NamingContextListener();  
                ncl.setName(getNamingContextName());  
                ncl.setExceptionOnFailedWrite(getJndiExceptionOnFailedWrite());  
                addLifecycleListener(ncl);  
                setNamingContextListener(ncl);  
            }  
        }  
  
        // Standard container startup  
        if (log.isDebugEnabled())  
            log.debug("Processing standard container startup");  
  
        // Binding thread  
        ClassLoader oldCCL = bindThread();  
  
        try {  
  
            if (ok) {  
  
                // Start our subordinate components, if any  
                if ((loader != null) && (loader instanceof Lifecycle))  
                    ((Lifecycle) loader).start();  
  
                // since the loader just started, the webapp classloader is now  
                // created.  
                // By calling unbindThread and bindThread in a row, we setup the  
                // current Thread CCL to be the webapp classloader  
                unbindThread(oldCCL);  
                oldCCL = bindThread();  
  
                // Initialize logger again. Other components might have used it  
                // too early, so it should be reset.  
                logger = null;  
                getLogger();  
  
                if ((cluster != null) && (cluster instanceof Lifecycle))  
                    ((Lifecycle) cluster).start();  
                Realm realm = getRealmInternal();  
                if ((realm != null) && (realm instanceof Lifecycle))  
                    ((Lifecycle) realm).start();  
                if ((resources != null) && (resources instanceof Lifecycle))  
                    ((Lifecycle) resources).start();  
  
                // Notify our interested LifecycleListeners  
                fireLifecycleEvent(Lifecycle.CONFIGURE_START_EVENT, null);  
  
                // Start our child containers, if not already started  
                for (Container child : findChildren()) {  
                    if (!child.getState().isAvailable()) {  
                        child.start();  
                    }  
                }  
  
                // Start the Valves in our pipeline (including the basic),  
                // if any  
                if (pipeline instanceof Lifecycle) {  
                    ((Lifecycle) pipeline).start();  
                }  
  
                // Acquire clustered manager  
                Manager contextManager = null;  
                if (manager == null) {  
                    if (log.isDebugEnabled()) {  
                        log.debug(sm.getString("standardContext.cluster.noManager",  
                                Boolean.valueOf((getCluster() != null)), Boolean.valueOf(distributable)));  
                    }  
                    if ((getCluster() != null) && distributable) {  
                        try {  
                            contextManager = getCluster().createManager(getName());  
                        } catch (Exception ex) {  
                            log.error("standardContext.clusterFail", ex);  
                            ok = false;  
                        }  
                    } else {  
                        contextManager = new StandardManager();  
                    }  
                }  
  
                // Configure default manager if none was specified  
                if (contextManager != null) {  
                    if (log.isDebugEnabled()) {  
                        log.debug(sm.getString("standardContext.manager", contextManager.getClass().getName()));  
                    }  
                    setManager(contextManager);  
                }  
  
                if (manager != null && (getCluster() != null) && distributable) {  
                    //let the cluster know that there is a context that is distributable  
                    //and that it has its own manager  
                    getCluster().registerManager(manager);  
                }  
            }  
  
        } finally {  
            // Unbinding thread  
            unbindThread(oldCCL);  
        }  
  
        if (!getConfigured()) {  
            log.error(sm.getString("standardContext.configurationFail"));  
            ok = false;  
        }  
  
        // We put the resources into the servlet context  
        if (ok)  
            getServletContext().setAttribute(Globals.RESOURCES_ATTR, getResources());  
  
        // Initialize associated mapper  
        mapper.setContext(getPath(), welcomeFiles, resources);  
  
        // Binding thread  
        oldCCL = bindThread();  
  
        if (ok) {  
            if (getInstanceManager() == null) {  
                javax.naming.Context context = null;  
                if (isUseNaming() && getNamingContextListener() != null) {  
                    context = getNamingContextListener().getEnvContext();  
                }  
                Map<String, Map<String, String>> injectionMap = buildInjectionMap(getIgnoreAnnotations() ? new NamingResources()  
                        : getNamingResources());  
                setInstanceManager(new DefaultInstanceManager(context, injectionMap, this, this.getClass()  
                        .getClassLoader()));  
                getServletContext().setAttribute(InstanceManager.class.getName(), getInstanceManager());  
            }  
        }  
  
        try {  
            // Create context attributes that will be required  
            if (ok) {  
                getServletContext().setAttribute(JarScanner.class.getName(), getJarScanner());  
            }  
  
            // Set up the context init params  
            mergeParameters();  
  
            // Call ServletContainerInitializers  
            for (Map.Entry<ServletContainerInitializer, Set<Class<?>>> entry : initializers.entrySet()) {  
                try {  
                    entry.getKey().onStartup(entry.getValue(), getServletContext());  
                } catch (ServletException e) {  
                    log.error(sm.getString("standardContext.sciFail"), e);  
                    ok = false;  
                    break;  
                }  
            }  
  
            // Configure and call application event listeners  
            if (ok) {  
                if (!listenerStart()) {  
                    log.error(sm.getString("standardContext.listenerFail"));  
                    ok = false;  
                }  
            }  
  
            try {  
                // Start manager  
                if ((manager != null) && (manager instanceof Lifecycle)) {  
                    ((Lifecycle) getManager()).start();  
                }  
            } catch (Exception e) {  
                log.error(sm.getString("standardContext.managerFail"), e);  
                ok = false;  
            }  
  
            // Configure and call application filters  
            if (ok) {  
                if (!filterStart()) {  
                    log.error(sm.getString("standardContext.filterFail"));  
                    ok = false;  
                }  
            }  
  
            // Load and initialize all "load on startup" servlets  
            if (ok) {  
                if (!loadOnStartup(findChildren())) {  
                    log.error(sm.getString("standardContext.servletFail"));  
                    ok = false;  
                }  
            }  
  
            // Start ContainerBackgroundProcessor thread  
            super.threadStart();  
        } finally {  
            // Unbinding thread  
            unbindThread(oldCCL);  
        }  
  
        // Set available status depending upon startup success  
        if (ok) {  
            if (log.isDebugEnabled())  
                log.debug("Starting completed");  
        } else {  
            log.error(sm.getString("standardContext.startFailed", getName()));  
        }  
  
        startTime = System.currentTimeMillis();  
  
        // Send j2ee.state.running notification   
        if (ok && (this.getObjectName() != null)) {  
            Notification notification = new Notification("j2ee.state.running", this.getObjectName(),  
                    sequenceNumber.getAndIncrement());  
            broadcaster.sendNotification(notification);  
        }  
  
        // Close all JARs right away to avoid always opening a peak number   
        // of files on startup  
        if (getLoader() instanceof WebappLoader) {  
            ((WebappLoader) getLoader()).closeJARs(true);  
        }  
  
        // Reinitializing if something went wrong  
        if (!ok) {  
            setState(LifecycleState.FAILED);  
        } else {  
            setState(LifecycleState.STARTING);  
        }  
    }  

 

Standardcontext.bindthread代码

protected ClassLoader bindThread() {  
  
        ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();  
  
        if (getResources() == null)  
            return oldContextClassLoader;  
  
        if (getLoader() != null && getLoader().getClassLoader() != null) {  
            Thread.currentThread().setContextClassLoader(getLoader().getClassLoader());  
        }  
  
        DirContextURLStreamHandler.bindThread(getResources());  
  
        if (isUseNaming()) {  
            try {  
                ContextBindings.bindThread(this, this);  
            } catch (NamingException e) {  
                // Silent catch, as this is a normal case during the early  
                // startup stages  
            }  
        }  
  
        return oldContextClassLoader;  
  
    }  

 

Digester.getclassloader代码

public ClassLoader getClassLoader() {  
  
      if (this.classLoader != null) {  
          return (this.classLoader);  
      }  
      if (this.useContextClassLoader) {  
          ClassLoader classLoader =  
                  Thread.currentThread().getContextClassLoader();  
          if (classLoader != null) {  
              return (classLoader);  
          }  
      }  
      return (this.getClass().getClassLoader());  
  
  }  

 2.Context在bindThread()后触发CONFIGURE_START_EVENT事件,ContextConfig接收事件后调用configureStart方法。

Contextconfig.configurestart代码

protected synchronized void configureStart() {  
        // Called from StandardContext.start()  
  
        if (log.isDebugEnabled())  
            log.debug(sm.getString("contextConfig.start"));  
  
        if (log.isDebugEnabled()) {  
            log.debug(sm.getString("contextConfig.xmlSettings", context.getName(),  
                    Boolean.valueOf(context.getXmlValidation()), Boolean.valueOf(context.getXmlNamespaceAware())));  
        }  
  
        webConfig();  
  
        if (!context.getIgnoreAnnotations()) {  
            applicationAnnotationsConfig();  
        }  
        if (ok) {  
            validateSecurityRoles();  
        }  
  
        // Configure an authenticator if we need one  
        if (ok)  
            authenticatorConfig();  
  
        // Dump the contents of this pipeline if requested  
        if ((log.isDebugEnabled()) && (context instanceof ContainerBase)) {  
            log.debug("Pipeline Configuration:");  
            Pipeline pipeline = ((ContainerBase) context).getPipeline();  
            Valve valves[] = null;  
            if (pipeline != null)  
                valves = pipeline.getValves();  
            if (valves != null) {  
                for (int i = 0; i < valves.length; i++) {  
                    log.debug("  " + valves[i].getInfo());  
                }  
            }  
            log.debug("======================");  
        }  
  
        // Make our application available if no problems were encountered  
        if (ok)  
            context.setConfigured(true);  
        else {  
            log.error(sm.getString("contextConfig.unavailable"));  
            context.setConfigured(false);  
        }  
  
    }  

Contextconfig.webconfig代码

protected void webConfig() {  
        /*  
         * Anything and everything can override the global and host defaults.  
         * This is implemented in two parts  
         * - Handle as a web fragment that gets added after everything else so  
         *   everything else takes priority  
         * - Mark Servlets as overridable so SCI configuration can replace  
         *   configuration from the defaults  
         */  
  
        /*  
         * The rules for annotation scanning are not as clear-cut as one might  
         * think. Tomcat implements the following process:  
         * - As per SRV.1.6.2, Tomcat will scan for annotations regardless of  
         *   which Servlet spec version is declared in web.xml. The EG has  
         *   confirmed this is the expected behaviour.  
         * - As per http://java.net/jira/browse/SERVLET_SPEC-36, if the main  
         *   web.xml is marked as metadata-complete, JARs are still processed  
         *   for SCIs.  
         * - If metadata-complete=true and an absolute ordering is specified,  
         *   JARs excluded from the ordering are also excluded from the SCI  
         *   processing.  
         * - If an SCI has a @HandlesType annotation then all classes (except  
         *   those in JARs excluded from an absolute ordering) need to be  
         *   scanned to check if they match.  
         */  
        Set<WebXml> defaults = new HashSet<WebXml>();  
        defaults.add(getDefaultWebXmlFragment());  
  
        WebXml webXml = createWebXml();  
  
        // Parse context level web.xml  
        InputSource contextWebXml = getContextWebXmlSource();  
        parseWebXml(contextWebXml, webXml, false);  
  
        ServletContext sContext = context.getServletContext();  
  
        // Ordering is important here  
  
        // Step 1. Identify all the JARs packaged with the application  
        // If the JARs have a web-fragment.xml it will be parsed at this  
        // point.  
        Map<String, WebXml> fragments = processJarsForWebFragments(webXml);  
  
        // Step 2. Order the fragments.  
        Set<WebXml> orderedFragments = null;  
        orderedFragments = WebXml.orderWebFragments(webXml, fragments, sContext);  
  
        // Step 3. Look for ServletContainerInitializer implementations  
        if (ok) {  
            processServletContainerInitializers();  
        }  
  
        if (!webXml.isMetadataComplete() || typeInitializerMap.size() > 0) {  
            // Step 4. Process /WEB-INF/classes for annotations  
            if (ok) {  
                // Hack required by Eclipse's "serve modules without  
                // publishing" feature since this backs WEB-INF/classes by  
                // multiple locations rather than one.  
                NamingEnumeration<Binding> listBindings = null;  
                try {  
                    try {  
                        listBindings = context.getResources().listBindings("/WEB-INF/classes");  
                    } catch (NameNotFoundException ignore) {  
                        // Safe to ignore  
                    }  
                    while (listBindings != null && listBindings.hasMoreElements()) {  
                        Binding binding = listBindings.nextElement();  
                        if (binding.getObject() instanceof FileDirContext) {  
                            File webInfClassDir = new File(((FileDirContext) binding.getObject()).getDocBase());  
                            processAnnotationsFile(webInfClassDir, webXml, webXml.isMetadataComplete());  
                        } else if ("META-INF".equals(binding.getName())) {  
                            // Skip the META-INF directory from any JARs that have been  
                            // expanded in to WEB-INF/classes (sometimes IDEs do this).  
                        } else {  
                            String resource = "/WEB-INF/classes/" + binding.getName();  
                            try {  
                                URL url = sContext.getResource(resource);  
                                processAnnotationsUrl(url, webXml, webXml.isMetadataComplete());  
                            } catch (MalformedURLException e) {  
                                log.error(sm.getString("contextConfig.webinfClassesUrl", resource), e);  
                            }  
                        }  
                    }  
                } catch (NamingException e) {  
                    log.error(sm.getString("contextConfig.webinfClassesUrl", "/WEB-INF/classes"), e);  
                }  
            }  
  
            // Step 5. Process JARs for annotations - only need to process  
            // those fragments we are going to use  
            if (ok) {  
                processAnnotations(orderedFragments, webXml.isMetadataComplete());  
            }  
  
            // Cache, if used, is no longer required so clear it  
            javaClassCache.clear();  
        }  
  
        if (!webXml.isMetadataComplete()) {  
            // Step 6. Merge web-fragment.xml files into the main web.xml  
            // file.  
            if (ok) {  
                ok = webXml.merge(orderedFragments);  
            }  
  
            // Step 7. Apply global defaults  
            // Have to merge defaults before JSP conversion since defaults  
            // provide JSP servlet definition.  
            webXml.merge(defaults);  
  
            // Step 8. Convert explicitly mentioned jsps to servlets  
            if (ok) {  
                convertJsps(webXml);  
            }  
  
            // Step 9. Apply merged web.xml to Context  
            if (ok) {  
                webXml.configureContext(context);  
            }  
        } else {  
            webXml.merge(defaults);  
            convertJsps(webXml);  
            webXml.configureContext(context);  
        }  
  
        // Step 9a. Make the merged web.xml available to other  
        // components, specifically Jasper, to save those components  
        // from having to re-generate it.  
        // TODO Use a ServletContainerInitializer for Jasper  
        String mergedWebXml = webXml.toXml();  
        sContext.setAttribute(org.apache.tomcat.util.scan.Constants.MERGED_WEB_XML, mergedWebXml);  
        if (context.getLogEffectiveWebXml()) {  
            log.info("web.xml:\n" + mergedWebXml);  
        }  
  
        // Always need to look for static resources  
        // Step 10. Look for static resources packaged in JARs  
        if (ok) {  
            // Spec does not define an order.  
            // Use ordered JARs followed by remaining JARs  
            Set<WebXml> resourceJars = new LinkedHashSet<WebXml>();  
            for (WebXml fragment : orderedFragments) {  
                resourceJars.add(fragment);  
            }  
            for (WebXml fragment : fragments.values()) {  
                if (!resourceJars.contains(fragment)) {  
                    resourceJars.add(fragment);  
                }  
            }  
            processResourceJARs(resourceJars);  
            // See also StandardContext.resourcesStart() for  
            // WEB-INF/classes/META-INF/resources configuration  
        }  
  
        // Step 11. Apply the ServletContainerInitializer config to the  
        // context  
        if (ok) {  
            for (Map.Entry<ServletContainerInitializer, Set<Class<?>>> entry : initializerClassMap.entrySet()) {  
                if (entry.getValue().isEmpty()) {  
                    context.addServletContainerInitializer(entry.getKey(), null);  
                } else {  
                    context.addServletContainerInitializer(entry.getKey(), entry.getValue());  
                }  
            }  
        }  
    }  

 

Contextconfig.parsewebxml代码

protected void parseWebXml(InputSource source, WebXml dest, boolean fragment) {  
  
        if (source == null)  
            return;  
  
        XmlErrorHandler handler = new XmlErrorHandler();  
  
        Digester digester;  
        WebRuleSet ruleSet;  
        if (fragment) {  
            digester = webFragmentDigester;  
            ruleSet = webFragmentRuleSet;  
        } else {  
            digester = webDigester;  
            ruleSet = webRuleSet;  
        }  
  
        digester.push(dest);  
        digester.setErrorHandler(handler);  
  
        if (log.isDebugEnabled()) {  
            log.debug(sm.getString("contextConfig.applicationStart", source.getSystemId()));  
        }  
  
        try {  
            digester.parse(source);  
  
            if (handler.getWarnings().size() > 0 || handler.getErrors().size() > 0) {  
                ok = false;  
                handler.logFindings(log, source.getSystemId());  
            }  
        } catch (SAXParseException e) {  
            log.error(sm.getString("contextConfig.applicationParse", source.getSystemId()), e);  
            log.error(sm.getString("contextConfig.applicationPosition", "" + e.getLineNumber(),  
                    "" + e.getColumnNumber()));  
            ok = false;  
        } catch (Exception e) {  
            log.error(sm.getString("contextConfig.applicationParse", source.getSystemId()), e);  
            ok = false;  
        } finally {  
            digester.reset();  
            ruleSet.recycle();  
            InputSourceUtil.close(source);  
        }  
    }  

 3.web的解析规则

Contextconfig.createwebxmldigester代码

public void createWebXmlDigester(boolean namespaceAware, boolean validation) {  
  
        boolean blockExternal = context.getXmlBlockExternal();  
  
        webRuleSet = new WebRuleSet(false);  
        webDigester = DigesterFactory.newDigester(validation, namespaceAware, webRuleSet, blockExternal);  
        webDigester.getParser();  
  
        webFragmentRuleSet = new WebRuleSet(true);  
        webFragmentDigester = DigesterFactory  
                .newDigester(validation, namespaceAware, webFragmentRuleSet, blockExternal);  
        webFragmentDigester.getParser();  
    }  

 

Webruleset.addruleinstances代码

public void addRuleInstances(Digester digester) {  
       digester.addRule(fullPrefix,  
                        new SetPublicIdRule("setPublicId"));  
       digester.addRule(fullPrefix,  
                        new IgnoreAnnotationsRule());  
       digester.addRule(fullPrefix,  
               new VersionRule());  
  
       // Required for both fragments and non-fragments  
       digester.addRule(fullPrefix + "/absolute-ordering", absoluteOrdering);  
       digester.addRule(fullPrefix + "/ordering", relativeOrdering);  
  
       if (fragment) {  
           // web-fragment.xml  
           digester.addRule(fullPrefix + "/name", name);  
           digester.addCallMethod(fullPrefix + "/ordering/after/name",  
                                  "addAfterOrdering", 0);  
           digester.addCallMethod(fullPrefix + "/ordering/after/others",  
                                  "addAfterOrderingOthers");  
           digester.addCallMethod(fullPrefix + "/ordering/before/name",  
                                  "addBeforeOrdering", 0);  
           digester.addCallMethod(fullPrefix + "/ordering/before/others",  
                                  "addBeforeOrderingOthers");  
       } else {  
           // web.xml  
           digester.addCallMethod(fullPrefix + "/absolute-ordering/name",  
                                  "addAbsoluteOrdering", 0);  
           digester.addCallMethod(fullPrefix + "/absolute-ordering/others",  
                                  "addAbsoluteOrderingOthers");  
       }  
  
       digester.addCallMethod(fullPrefix + "/context-param",  
                              "addContextParam", 2);  
       digester.addCallParam(fullPrefix + "/context-param/param-name", 0);  
       digester.addCallParam(fullPrefix + "/context-param/param-value", 1);  
  
       digester.addCallMethod(fullPrefix + "/display-name",  
                              "setDisplayName", 0);  
  
       digester.addRule(fullPrefix + "/distributable",  
                        new SetDistributableRule());  
  
       configureNamingRules(digester);  
  
       digester.addObjectCreate(fullPrefix + "/error-page",  
                                "org.apache.catalina.deploy.ErrorPage");  
       digester.addSetNext(fullPrefix + "/error-page",  
                           "addErrorPage",  
                           "org.apache.catalina.deploy.ErrorPage");  
  
       digester.addCallMethod(fullPrefix + "/error-page/error-code",  
                              "setErrorCode", 0);  
       digester.addCallMethod(fullPrefix + "/error-page/exception-type",  
                              "setExceptionType", 0);  
       digester.addCallMethod(fullPrefix + "/error-page/location",  
                              "setLocation", 0);  
  
       digester.addObjectCreate(fullPrefix + "/filter",  
                                "org.apache.catalina.deploy.FilterDef");  
       digester.addSetNext(fullPrefix + "/filter",  
                           "addFilter",  
                           "org.apache.catalina.deploy.FilterDef");  
  
       digester.addCallMethod(fullPrefix + "/filter/description",  
                              "setDescription", 0);  
       digester.addCallMethod(fullPrefix + "/filter/display-name",  
                              "setDisplayName", 0);  
       digester.addCallMethod(fullPrefix + "/filter/filter-class",  
                              "setFilterClass", 0);  
       digester.addCallMethod(fullPrefix + "/filter/filter-name",  
                              "setFilterName", 0);  
       digester.addCallMethod(fullPrefix + "/filter/icon/large-icon",  
                              "setLargeIcon", 0);  
       digester.addCallMethod(fullPrefix + "/filter/icon/small-icon",  
                              "setSmallIcon", 0);  
       digester.addCallMethod(fullPrefix + "/filter/async-supported",  
               "setAsyncSupported", 0);  
  
       digester.addCallMethod(fullPrefix + "/filter/init-param",  
                              "addInitParameter", 2);  
       digester.addCallParam(fullPrefix + "/filter/init-param/param-name",  
                             0);  
       digester.addCallParam(fullPrefix + "/filter/init-param/param-value",  
                             1);  
  
       digester.addObjectCreate(fullPrefix + "/filter-mapping",  
                                "org.apache.catalina.deploy.FilterMap");  
       digester.addSetNext(fullPrefix + "/filter-mapping",  
                                "addFilterMapping",  
                                "org.apache.catalina.deploy.FilterMap");  
  
       digester.addCallMethod(fullPrefix + "/filter-mapping/filter-name",  
                              "setFilterName", 0);  
       digester.addCallMethod(fullPrefix + "/filter-mapping/servlet-name",  
                              "addServletName", 0);  
       digester.addCallMethod(fullPrefix + "/filter-mapping/url-pattern",  
                              "addURLPattern", 0);  
  
       digester.addCallMethod(fullPrefix + "/filter-mapping/dispatcher",  
                              "setDispatcher", 0);  
  
        digester.addCallMethod(fullPrefix + "/listener/listener-class",  
                               "addListener", 0);  
          
       digester.addRule(fullPrefix + "/jsp-config",  
                        jspConfig);  
  
       digester.addObjectCreate(fullPrefix + "/jsp-config/jsp-property-group",  
                                "org.apache.catalina.deploy.JspPropertyGroup");  
       digester.addSetNext(fullPrefix + "/jsp-config/jsp-property-group",  
                           "addJspPropertyGroup",  
                           "org.apache.catalina.deploy.JspPropertyGroup");  
       digester.addCallMethod(fullPrefix + "/jsp-config/jsp-property-group/deferred-syntax-allowed-as-literal",  
                              "setDeferredSyntax", 0);  
       digester.addCallMethod(fullPrefix + "/jsp-config/jsp-property-group/el-ignored",  
                              "setElIgnored", 0);  
       digester.addCallMethod(fullPrefix + "/jsp-config/jsp-property-group/include-coda",  
                              "addIncludeCoda", 0);  
       digester.addCallMethod(fullPrefix + "/jsp-config/jsp-property-group/include-prelude",  
                              "addIncludePrelude", 0);  
       digester.addCallMethod(fullPrefix + "/jsp-config/jsp-property-group/is-xml",  
                              "setIsXml", 0);  
       digester.addCallMethod(fullPrefix + "/jsp-config/jsp-property-group/page-encoding",  
                              "setPageEncoding", 0);  
       digester.addCallMethod(fullPrefix + "/jsp-config/jsp-property-group/scripting-invalid",  
                              "setScriptingInvalid", 0);  
       digester.addCallMethod(fullPrefix + "/jsp-config/jsp-property-group/trim-directive-whitespaces",  
                              "setTrimWhitespace", 0);  
       digester.addCallMethod(fullPrefix + "/jsp-config/jsp-property-group/url-pattern",  
                              "addUrlPattern", 0);  
       digester.addCallMethod(fullPrefix + "/jsp-config/jsp-property-group/default-content-type",  
                              "setDefaultContentType", 0);  
       digester.addCallMethod(fullPrefix + "/jsp-config/jsp-property-group/buffer",  
                              "setBuffer", 0);  
       digester.addCallMethod(fullPrefix + "/jsp-config/jsp-property-group/error-on-undeclared-namespace",  
                              "setErrorOnUndeclaredNamespace", 0);  
  
       digester.addRule(fullPrefix + "/login-config",  
                        loginConfig);  
  
       digester.addObjectCreate(fullPrefix + "/login-config",  
                                "org.apache.catalina.deploy.LoginConfig");  
       digester.addSetNext(fullPrefix + "/login-config",  
                           "setLoginConfig",  
                           "org.apache.catalina.deploy.LoginConfig");  
  
       digester.addCallMethod(fullPrefix + "/login-config/auth-method",  
                              "setAuthMethod", 0);  
       digester.addCallMethod(fullPrefix + "/login-config/realm-name",  
                              "setRealmName", 0);  
       digester.addCallMethod(fullPrefix + "/login-config/form-login-config/form-error-page",  
                              "setErrorPage", 0);  
       digester.addCallMethod(fullPrefix + "/login-config/form-login-config/form-login-page",  
                              "setLoginPage", 0);  
  
       digester.addCallMethod(fullPrefix + "/mime-mapping",  
                              "addMimeMapping", 2);  
       digester.addCallParam(fullPrefix + "/mime-mapping/extension", 0);  
       digester.addCallParam(fullPrefix + "/mime-mapping/mime-type", 1);  
  
  
       digester.addObjectCreate(fullPrefix + "/security-constraint",  
                                "org.apache.catalina.deploy.SecurityConstraint");  
       digester.addSetNext(fullPrefix + "/security-constraint",  
                           "addSecurityConstraint",  
                           "org.apache.catalina.deploy.SecurityConstraint");  
  
       digester.addRule(fullPrefix + "/security-constraint/auth-constraint",  
                        new SetAuthConstraintRule());  
       digester.addCallMethod(fullPrefix + "/security-constraint/auth-constraint/role-name",  
                              "addAuthRole", 0);  
       digester.addCallMethod(fullPrefix + "/security-constraint/display-name",  
                              "setDisplayName", 0);  
       digester.addCallMethod(fullPrefix + "/security-constraint/user-data-constraint/transport-guarantee",  
                              "setUserConstraint", 0);  
  
       digester.addObjectCreate(fullPrefix + "/security-constraint/web-resource-collection",  
                                "org.apache.catalina.deploy.SecurityCollection");  
       digester.addSetNext(fullPrefix + "/security-constraint/web-resource-collection",  
                           "addCollection",  
                           "org.apache.catalina.deploy.SecurityCollection");  
       digester.addCallMethod(fullPrefix + "/security-constraint/web-resource-collection/http-method",  
                              "addMethod", 0);  
       digester.addCallMethod(fullPrefix + "/security-constraint/web-resource-collection/http-method-omission",  
                              "addOmittedMethod", 0);  
       digester.addCallMethod(fullPrefix + "/security-constraint/web-resource-collection/url-pattern",  
                              "addPattern", 0);  
       digester.addCallMethod(fullPrefix + "/security-constraint/web-resource-collection/web-resource-name",  
                              "setName", 0);  
  
       digester.addCallMethod(fullPrefix + "/security-role/role-name",  
                              "addSecurityRole", 0);  
  
       digester.addRule(fullPrefix + "/servlet",  
                        new ServletDefCreateRule());  
       digester.addSetNext(fullPrefix + "/servlet",  
                           "addServlet",  
                           "org.apache.catalina.deploy.ServletDef");  
  
       digester.addCallMethod(fullPrefix + "/servlet/init-param",  
                              "addInitParameter", 2);  
       digester.addCallParam(fullPrefix + "/servlet/init-param/param-name",  
                             0);  
       digester.addCallParam(fullPrefix + "/servlet/init-param/param-value",  
                             1);  
  
       digester.addCallMethod(fullPrefix + "/servlet/jsp-file",  
                              "setJspFile", 0);  
       digester.addCallMethod(fullPrefix + "/servlet/load-on-startup",  
                              "setLoadOnStartup", 0);  
       digester.addCallMethod(fullPrefix + "/servlet/run-as/role-name",  
                              "setRunAs", 0);  
  
       digester.addObjectCreate(fullPrefix + "/servlet/security-role-ref",  
                                "org.apache.catalina.deploy.SecurityRoleRef");  
       digester.addSetNext(fullPrefix + "/servlet/security-role-ref",  
                           "addSecurityRoleRef",  
                           "org.apache.catalina.deploy.SecurityRoleRef");  
       digester.addCallMethod(fullPrefix + "/servlet/security-role-ref/role-link",  
                              "setLink", 0);  
       digester.addCallMethod(fullPrefix + "/servlet/security-role-ref/role-name",  
                              "setName", 0);  
  
       digester.addCallMethod(fullPrefix + "/servlet/servlet-class",  
                             "setServletClass", 0);  
       digester.addCallMethod(fullPrefix + "/servlet/servlet-name",  
                             "setServletName", 0);  
         
       digester.addObjectCreate(fullPrefix + "/servlet/multipart-config",  
                                "org.apache.catalina.deploy.MultipartDef");  
       digester.addSetNext(fullPrefix + "/servlet/multipart-config",  
                           "setMultipartDef",  
                           "org.apache.catalina.deploy.MultipartDef");  
       digester.addCallMethod(fullPrefix + "/servlet/multipart-config/location",  
                              "setLocation", 0);  
       digester.addCallMethod(fullPrefix + "/servlet/multipart-config/max-file-size",  
                              "setMaxFileSize", 0);  
       digester.addCallMethod(fullPrefix + "/servlet/multipart-config/max-request-size",  
                              "setMaxRequestSize", 0);  
       digester.addCallMethod(fullPrefix + "/servlet/multipart-config/file-size-threshold",  
                              "setFileSizeThreshold", 0);  
  
       digester.addCallMethod(fullPrefix + "/servlet/async-supported",  
                              "setAsyncSupported", 0);  
       digester.addCallMethod(fullPrefix + "/servlet/enabled",  
                              "setEnabled", 0);  
  
         
       digester.addRule(fullPrefix + "/servlet-mapping",  
                              new CallMethodMultiRule("addServletMapping", 2, 0));  
       digester.addCallParam(fullPrefix + "/servlet-mapping/servlet-name", 1);  
       digester.addRule(fullPrefix + "/servlet-mapping/url-pattern", new CallParamMultiRule(0));  
  
       digester.addRule(fullPrefix + "/session-config", sessionConfig);  
       digester.addObjectCreate(fullPrefix + "/session-config",  
                                "org.apache.catalina.deploy.SessionConfig");  
       digester.addSetNext(fullPrefix + "/session-config", "setSessionConfig",  
                           "org.apache.catalina.deploy.SessionConfig");  
       digester.addCallMethod(fullPrefix + "/session-config/session-timeout",  
                              "setSessionTimeout", 0);  
       digester.addCallMethod(fullPrefix + "/session-config/cookie-config/name",  
                              "setCookieName", 0);  
       digester.addCallMethod(fullPrefix + "/session-config/cookie-config/domain",  
                              "setCookieDomain", 0);  
       digester.addCallMethod(fullPrefix + "/session-config/cookie-config/path",  
                              "setCookiePath", 0);  
       digester.addCallMethod(fullPrefix + "/session-config/cookie-config/comment",  
                              "setCookieComment", 0);  
       digester.addCallMethod(fullPrefix + "/session-config/cookie-config/http-only",  
                              "setCookieHttpOnly", 0);  
       digester.addCallMethod(fullPrefix + "/session-config/cookie-config/secure",  
                              "setCookieSecure", 0);  
       digester.addCallMethod(fullPrefix + "/session-config/cookie-config/max-age",  
                              "setCookieMaxAge", 0);  
       digester.addCallMethod(fullPrefix + "/session-config/tracking-mode",  
                              "addSessionTrackingMode", 0);  
  
       // Taglibs pre Servlet 2.4  
       digester.addRule(fullPrefix + "/taglib", new TaglibLocationRule(false));  
       digester.addCallMethod(fullPrefix + "/taglib",  
                              "addTaglib", 2);  
       digester.addCallParam(fullPrefix + "/taglib/taglib-location", 1);  
       digester.addCallParam(fullPrefix + "/taglib/taglib-uri", 0);  
  
       // Taglibs Servlet 2.4 onwards  
       digester.addRule(fullPrefix + "/jsp-config/taglib", new TaglibLocationRule(true));  
       digester.addCallMethod(fullPrefix + "/jsp-config/taglib",  
               "addTaglib", 2);  
       digester.addCallParam(fullPrefix + "/jsp-config/taglib/taglib-location", 1);  
       digester.addCallParam(fullPrefix + "/jsp-config/taglib/taglib-uri", 0);  
  
       digester.addCallMethod(fullPrefix + "/welcome-file-list/welcome-file",  
                              "addWelcomeFile", 0);  
  
       digester.addCallMethod(fullPrefix + "/locale-encoding-mapping-list/locale-encoding-mapping",  
                             "addLocaleEncodingMapping", 2);  
       digester.addCallParam(fullPrefix + "/locale-encoding-mapping-list/locale-encoding-mapping/locale", 0);  
       digester.addCallParam(fullPrefix + "/locale-encoding-mapping-list/locale-encoding-mapping/encoding", 1);  
  
       digester.addRule(fullPrefix + "/post-construct",  
               new LifecycleCallbackRule("addPostConstructMethods", 2, true));  
       digester.addCallParam(fullPrefix + "/post-construct/lifecycle-callback-class", 0);  
       digester.addCallParam(fullPrefix + "/post-construct/lifecycle-callback-method", 1);  
  
       digester.addRule(fullPrefix + "/pre-destroy",  
               new LifecycleCallbackRule("addPreDestroyMethods", 2, false));  
       digester.addCallParam(fullPrefix + "/pre-destroy/lifecycle-callback-class", 0);  
       digester.addCallParam(fullPrefix + "/pre-destroy/lifecycle-callback-method", 1);  
   }  

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: