Mark,

On Fri, Sep 21, 2018 at 12:54 AM Mark Thomas <ma...@apache.org> wrote:

> On 21/09/18 05:57, Igal Sapir wrote:
> > I want to embed Tomcat in a simple application that does not use JSP, and
> > that sets the default servlet's listings initParam to true.
> >
> > When I use the StandardContext, Tomcat.initWebappDefaults() [1] is called
> > and adds the default servlet and the JSP servlet.  I would like to
> prevent
> > that, but hopefully without having to rewrite the whole Tomcat class nor
> to
> > subclass it.
> >
> > Further, when I try to override a setting in WEB-INF/web.xml, e.g. to
> > specify init-param of "listings" with value "true" for the servlet
> > "default", I get an error that "default" is not unique, but in a regular
> > Tomcat deployment that works just fine.
> >
> > Is there an easy way to override Tomcat.initWebappDefaults() or to
> prevent
> > it from being called?
>
> There are a couple few options.
>
> Sub-classing looks to be the simplest.
>
> You can use addContext() rather than addWebapp() but then you become
> responsible for all of the configuration. If the app is simple, this
> shouldn't be too much effort.
>

The app is simple, but it is for use by other developers who may use their
own web.xml files, so I think that sub-classing would be much easier and
that's what I did.

While searching for a solution prior to asking on the mailing list, I
noticed that quite a few users were looking for a simple solution of using
addWebapp() without setting up the default servlets.  What do you think
about adding a System Property that will allow to opt-out of
initWebappDefaults() and set the DefaultWebXml to null so that the web.xml
files will be parsed?

I am thinking of a property name
org.apache.catalina.startup.INIT_WEBAPP_DEFAULTS [default true], or
org.apache.catalina.startup.DISABLE_WEBAPP_DEFAULTS [default false].

Alternatively, we can add the sub-classing implementation that I used (with
the proper ASF license headers, of course).  The code is pasted below in
case anyone else needs such an implementation.

I can add either solution myself if approved.

Thank you,

Igal

/**
 * This class extends Tomcat to override the default functionality which
registers the default and JSP servlets, and
 * prevents the parsing of the Web Application Deployment Descriptors
web.xml.
 *
 * Using this class therefore enables the parsing of the web.xml files, and
does not add any defaults beyond them.
 *
 * @author Igal Sapir
 */
public class TomcatRunner extends Tomcat {

    /**
     * Tomcat.addWebapp() sets DefaultWebXml to a non-null value to prevent
the parsing of the web.xml file(s).
     * Here we want to parse those files, so after calling the super method
we set that value to null.
     *
     * @param host The host in which the context will be deployed
     * @param contextPath The context mapping to use, "" for root context.
     * @param docBase Base directory for the context, for static files.
     *  Must exist, relative to the server home
     * @param config Custom context configurator helper
     * @return the deployed context
     * @see #addWebapp(String, String)
     */
    public Context addWebapp(Host host, String contextPath, String docBase,
LifecycleListener config) {

        Context ctx = super.addWebapp(host, contextPath, docBase, config);
        ((ContextConfig) config).setDefaultWebXml(null);

        return ctx;
    }

    /**
     * Returns a listener that does nothing, as opposed to the default one
in Tomcat which always
     * adds the default servlet and the JSP servlet with the rules that are
set in the defautl web.xml
     * @return a listener that does nothing.
     */
    @Override
    public LifecycleListener getDefaultWebXmlListener() {
        // noop
        return event -> {};
    }

}

Reply via email to