ServletContainerInitializer против ServletContextListener
Я пытаюсь зарегистрировать сервлет с помощью servletContainerInitializer, но он, похоже, не работает. Может быть, это мой код (просим его просмотреть), но я задумался о разнице между ServletContainerInitializer
а также ServletContextListener
потому что следующий код работает нормально при использовании в качестве ServletContextListener
вместо.
Из спецификации сервлета 3.0:
4,4
Методы настройки (динамическое добавление сервлетов):
... или из
onStartup
методServletContainerInitializer
реализация...
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/*");
}
}
Сервлет, который я пытаюсь автоматически зарегистрировать:
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");
}
}
Оригинальный код с сайта nullhaus java examples "только имя класса отредактировано" также не работал!
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();
}
}
}
2 ответа
ServletContainerInitializer
реализация предназначена для объединения в файл JAR, который в свою очередь отбрасывается в /WEB-INF/lib
веб-приложения. Сам JAR-файл должен иметь /META-INF/services/javax.servlet.ServletContainerInitializer
файл, содержащий FQN ServletContainerInitializer
реализация в банке. Обратите внимание, что этот файл не должен быть размещен в самом веб-приложении!
Это позволяет разработчикам модулей веб-приложений позволять своим файлам JAR подключаться к циклу запуска и завершения работы веб-приложения. Это правда, что они могли бы также использовать ServletContextListener
с @WebListener
для этого, но это не будет работать, если собственный веб-приложение web.xml
файл имеет metadata-complete="true"
атрибут установлен в <web-app>
Это означает, что веб-приложение не должно сканировать JAR-файлы для аннотаций (что экономит время запуска).
Что ServletContainerInitializer
не работает в вашем конкретном случае может означать только то, что вы на самом деле не разрабатываете файл JAR модуля, а просто является неотъемлемой частью вашего собственного веб-приложения. В этом случае ServletContainerInitializer
бесполезно для вас, и вы должны использовать 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.
}
}
Смотрите также:
- Сопоставьте сервлет программно вместо использования web.xml или аннотаций
- Разделение общего кода и файла web.xml из проекта WAR в общий проект JAR
- Использование специального автозапуска сервлета для инициализации при запуске и обмена данными приложения
- Какова эквивалентность contextDestroyed() в ServletContainerInitializer?
Проверьте, правильно ли настроен ServletContainerInitializer. Имя класса ServletContainerInitializer должно быть настроено внутри файла:
META-INF/services/javax.servlet.ServletContainerInitializer
Файл должен содержать только имя класса. Для Ex в вашем случае это должно выглядеть так:
com.marmoush.javaexamples.nullhaus.servlet.MyInit
Файл (META-INF / services / javax.servlet.ServletContainerInitializer) можно связать в библиотеке JAR в WEB-INF/lib.
Вот любой пример, который объясняет.