Mark,
Post by Igal SapirPost by Igal SapirI 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
Post by Igal Sapirthat, but hopefully without having to rewrite the whole Tomcat class nor
to
Post by Igal Sapirsubclass 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
Post by Igal Sapirit 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 -> {};
}
}