servlet quartz not contextinitialized called servlets initialization

servlets - quartz - ServletContainerInitializer vs ServletContextListener



servletcontextlistener spring (2)

Intento registrar un servlet usando servletContainerInitializer pero parece que no funciona, tal vez sea mi código (recomiéndalo amablemente), pero llegué a preguntarme sobre la diferencia entre ServletContainerInitializer y ServletContextListener , porque el siguiente código funciona bien cuando se usa como ServletContextListener lugar.

De la especificación de servlet 3.0:

4.4

Métodos de configuración (agregando servlets dinámicamente):

... o desde el método onStartup de una implementación de ServletContainerInitializer ...

El 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/*"); } }

El servlet que intento registrar automáticamente:

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"); } }

El código original del sitio web nullhaus java examples "solo el nombre de clase editado" tampoco funcionó.

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(); } } }


La implementación de ServletContainerInitializer está pensada para agruparse en un archivo JAR que a su vez se ha eliminado en /WEB-INF/lib de la aplicación web. El archivo JAR en sí debe tener un archivo /META-INF/services/javax.servlet.ServletContainerInitializer que contenga el FQN de la implementación de ServletContainerInitializer en el JAR. Tenga en cuenta que este archivo, por lo tanto, no debe colocarse en la propia aplicación web.

Esto permite a los desarrolladores de módulos de aplicaciones web dejar que sus archivos JAR se enganchen en el ciclo de inicio y apagado de la aplicación. Es cierto que también podrían haber usado un ServletContextListener con @WebListener para esto, pero esto no funcionará si el propio archivo web.xml la web.xml tiene un atributo metadata-complete="true" establecido en <web-app> que significa que la aplicación web no debe analizar JAR para anotaciones (lo que ahorra tiempo de inicio).

Que el ServletContainerInitializer no funcione en su caso particular solo puede significar que en realidad no está desarrollando un archivo JAR de módulo, sino solo una parte integral de su propia aplicación web. En ese caso, el ServletContainerInitializer es inútil para usted y, en su lugar, debería usar ServletContextListener .

@WebListener public class Config implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent event) { // Do stuff during server startup. } @Override public void contextDestroyed(ServletContextEvent event) { // Do stuff during server shutdown. } }

Ver también:


Compruebe si ha configurado ServletContainerInitializer propertly . El nombre de la clase ServletContainerInitializer debe configurarse dentro de un archivo:

META-INF/services/javax.servlet.ServletContainerInitializer

El archivo debe contener solo el nombre de la clase. Para Ex en su caso, debería verse así:

com.marmoush.javaexamples.nullhaus.servlet.MyInit

El archivo ( META-INF / services / javax.servlet.ServletContainerInitializer ) se puede agrupar en una biblioteca JAR en WEB-INF / lib.

Aquí hay un example que explica.