Моя цель - зарегистрировать сервлет для обслуживания заданного URL-адреса в стороннем веб-приложении. Он разработан и управляется другой командой, поэтому я не могу получить доступ к их сети. xml. Кроме того, они установили metadata-complete = "true" в своей сети. xml, поэтому я даже не могу разработать веб-фрагмент. Поэтому я прибег к написанию ServletContainerInitializer, где я регистрирую один из моих собственных сервлетов.
Я создал проект eclipse с двумя классами, один для реализации ServletContainerInitializer, а другой - Servlet, и выполнил шаги, в значительной степени соответствующие Веб-спецификация JEE (версия сервлета 3.0). Моя реализация похожа на эту статью.
Я успешно протестировал вызов сервлета, создав еще одно простое веб-приложение всего с несколькими JSP и запросив URL, привязанный к моему сервлету. Для этого я удалил банку, созданную из вышеупомянутого проекта, в каталог WEB-INF / lib веб-проекта. Я даже мог видеть сообщение +++++ ServletContainerInitializer с именем +++++ , которое я установил как System.out.println, когда сервер запускается.
Однако, когда я опускаю jar в собственное стороннее веб-приложение (в WEB-INF / lib), в котором есть множество других jar, JSP, классов сервлетов и т. Д. c. (поскольку это большое приложение), мой ServletContainerInitializer не вызывается, а мой сервлет недоступен.
Для обоих вышеупомянутых случаев контейнером является тот же Tomcat 8.5, а версия сервлета - 3.0.
Будут оценены любые предложения, подсказки или указатели на то, что идет не так.
// My class implementing ServletContainerInitializer
@Override
public void onStartup (Set<Class<?>> pageClasses, ServletContext ctx)throws ServletException {
System.out.println("+++++ ServletContainerInitializer called +++++");
ServletRegistration.Dynamic servletRegistration = ctx.addServlet("Controller", Controller.class);
servletRegistration.addMapping("/welcome/*");
servletRegistration.setLoadOnStartup(0);
}
// My Servlet class
public class Controller extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html");
resp.getWriter().write("<h2>Hello from Servlet</h2>");
}
}