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。
- 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
> 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
>> 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);
- }
- }
- 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;
- }
- 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方法。
- 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);
- }
- }
- 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
defaults = new HashSet (); - 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
fragments = processJarsForWebFragments(webXml); - // Step 2. Order the fragments.
- Set
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
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
resourceJars = new LinkedHashSet (); - 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
>> entry : initializerClassMap.entrySet()) { - if (entry.getValue().isEmpty()) {
- context.addServletContainerInitializer(entry.getKey(), null);
- } else {
- context.addServletContainerInitializer(entry.getKey(), entry.getValue());
- }
- }
- }
- }
- 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的解析规则
- 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();
- }
- 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);
- }