Ответ 1
Начиная с сервлета 3.0 вы можете использовать ServletContext#addServlet()
для этого.
servletContext.addServlet("hello", test.HelloServlet.class);
В зависимости от того, что вы разрабатываете, есть два крючка, в которых вы можете запустить этот код.
-
Если вы разрабатываете JAR файл с многократно используемым модульным веб-фрагментом, такой как существующие фреймворки, такие как JSF и Spring MVC, затем используйте
ServletContainerInitializer
.public class YourFrameworkInitializer implements ServletContainerInitializer { @Override public void onStartup(Set<Class<?>> c, ServletContext servletContext) throws ServletException { servletContext.addServlet("hello", test.HelloServlet.class); } }
-
Или, если вы используете его как внутренне интегрированную часть вашего приложения WAR, используйте
ServletContextListener
.@WebListener public class YourFrameworkInitializer implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent event) { event.getServletContext().addServlet("hello", test.HelloServlet.class); } // ... }
Вам нужно только убедиться, что ваш web.xml
совместим с Servlet 3.0 или новее (и, следовательно, не Servlet 2.5 или старше), в противном случае servletcontainer будет работать в резервном модуле, соответствующем заявленной версии, и вы потеряете все Servlet 3.0 особенности.
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
>
<!-- Config here -->
</web-app>