On Fri, Sep 21, 2018 at 5:11 PM Igal Sapir <i...@lucee.org> wrote:

> 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.
>

Actually, the code that I pasted below doesn't seem to play well with JSP
so I guess it's not quite ready.  When I tried to add a simple JSP file I
get an NPE:

JspFactory.getDefaultFactory() returns null

java.lang.NullPointerException
org.apache.jasper.compiler.Validator$ValidateVisitor.<init>(Validator.java:524)
org.apache.jasper.compiler.Validator.validateExDirectives(Validator.java:1856)
org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:224)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:385)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:362)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:346)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:603)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:383)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)




>
> 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