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 deServletContainerInitializer
...
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:
- Asigne el servlet mediante programación en lugar de usar web.xml o anotaciones
- División de código compartido y web.xml del proyecto WAR al proyecto JAR común
- Usar el servlet de inicio automático especial para inicializar al inicio y compartir datos de la aplicación
- ¿Cuál es la equivalencia de contextDestroyed () en ServletContainerInitializer?
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.