I’m trying to register a servlet using servletContainerInitializer but it doesn’t seem to work, Maybe it’s my code (kindly review it), but I came to wonder about the difference between ServletContainerInitializer and ServletContextListener, because the follwing code runs fine when used as ServletContextListener instead.
From servlet 3.0 specification:
4.4
Configuration methods (adding servlets dynamically):
… or from the
onStartupmethod of aServletContainerInitializerimplementation …
The ServletContainerInitializer:
package com.marmoush.javaexamples.nullhaus.servlet;
import java.util.Set;
import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
public class MyInit implements ServletContainerInitializer {
public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
System.out.println("hello");
ServletRegistration reg = ctx.addServlet("q31","com.marmoush.javaexamples.nullhaus.servlet.Q31");
reg.addMapping("/q31/*");
}
}
The servlet which I’m trying to auto-register:
package com.marmoush.javaexamples.nullhaus.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Q31 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("hello world");
}
}
Original code from nullhaus java examples website "only class name edited" also didn’t work!
package com.marmoush.javaexamples.nullhaus.servlet;
import java.util.Set;
import javax.servlet.Servlet;
import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
public class MyInit implements ServletContainerInitializer {
public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
try {
Class klass = Class.forName("com.marmoush.javaexamples.nullhaus.servlet.Q31");
Class<Q31> clazz = (Class<Q31>) klass;
Servlet s = ctx.createServlet(clazz);
ServletRegistration.Dynamic d = ctx.addServlet("q31", s);
d.addMapping("/baz/*");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
The
ServletContainerInitializerimplementation is intented to be bundled in a JAR file which is in turn been dropped in/WEB-INF/libof the webapp. The JAR file itself should have a/META-INF/services/javax.servlet.ServletContainerInitializerfile containing the FQN of theServletContainerInitializerimplementation in the JAR. Please note that this file should thus not be placed in the webapp itself!This allows webapp module developers to let their JAR file hook on webapp’s startup and shutdown cycle. It’s true that they could also have used a
ServletContextListenerwith@WebListenerfor this, but this won’t work if the webapp’s ownweb.xmlfile has ametadata-complete="true"attribute set in<web-app>which means that the webapp shouldn’t scan JARs for annotations (which saves startup time).That the
ServletContainerInitializerdoesn’t work in your particular case can only mean that you’re actually not developing a module JAR file, but just a part integral to your own web application. In that case, theServletContainerInitializeris useless for you and you should be usingServletContextListenerinstead.See also: