Сопоставьте сервлет программно вместо использования web.xml или аннотаций

Как я могу реализовать это отображение программно без web.xml или аннотаций? Миссия не в том, чтобы использовать какие-либо рамки, такие как весна или что-то еще.

<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>test.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

3 ответа

Решение

Начиная с Servlet 3.0 вы можете использовать ServletContext#addServlet() за это.

servletContext.addServlet("hello", test.HelloServlet.class);

В зависимости от того, что вы разрабатываете, вы можете запустить этот код двумя способами.

  1. Если вы разрабатываете публично многократно используемый файл 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);
        }
    
    }
    
  2. Или, если вы используете его как внутренне интегрированную часть вашего 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>

Смотрите также:

Вы можете использовать аннотации для достижения этого с помощью кода.

import java.io.IOException;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException {
        response.getWriter().println("Hello");
    }
}

Вы можете прочитать об аннотациях здесь, здесь и здесь

Если вы используете Tomcat 7 или выше, вы можете сделать это с помощью аннотации

@WebServlet("/hello") 
Другие вопросы по тегам