Map servlet programmatically instead of using web.xml or annotations

前端 未结 3 741
春和景丽
春和景丽 2021-01-05 17:26

How can I implement this mapping programmatically without web.xml or annotations? The mission is not to use any framework like spring or something else.

<         


        
相关标签:
3条回答
  • 2021-01-05 17:53

    You can use annotations to achieve this using code.

    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");
        }
    }
    

    You can read about annotations here, here and here

    0 讨论(0)
  • 2021-01-05 18:12

    Since Servlet 3.0 you can use ServletContext#addServlet() for this.

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

    Depending on what you're developing, there are two hooks where you can run this code.

    1. If you're developing a publicly reusable modular web fragment JAR file such as existing frameworks like JSF and Spring MVC, then use a ServletContainerInitializer.

      public class YourFrameworkInitializer implements ServletContainerInitializer {
      
          @Override
          public void onStartup(Set<Class<?>> c, ServletContext servletContext) throws ServletException {
              servletContext.addServlet("hello", test.HelloServlet.class);
          }
      
      }
      
    2. Or, if you're using it as an internally integrated part of your WAR application, then use a ServletContextListener.

      @WebListener
      public class YourFrameworkInitializer implements ServletContextListener {
      
          @Override
          public void contextInitialized(ServletContextEvent event) {
              event.getServletContext().addServlet("hello", test.HelloServlet.class);
          }
      
          // ...
      }
      

    You only need to make sure that your web.xml is compatible with Servlet 3.0 or newer (and thus not Servlet 2.5 or older), otherwise the servletcontainer will run in fallback modus complying the declared version and you will lose all Servlet 3.0 features.

    <?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>
    

    See also:

    • ServletContainerInitializer vs ServletContextListener
    • @WebServlet annotation with Tomcat 7
    • Design Patterns web based applications
    • Splitting up shared code and web.xml from WAR project to common JAR project
    0 讨论(0)
  • 2021-01-05 18:14

    If you are using tomcat 7 or above you can done this by annotation

    @WebServlet("/hello") 
    
    0 讨论(0)
提交回复
热议问题