SpringBoot整合Servlet

在传统的Servlet开发时,我们创建一个Servlet,需要在web.xml里做配置:

<servlet>
    <servlet-name>FirstServlet</servlet-name> 
    <servlet-class>com.linhw.demo.servlet.MyFirstServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>FirstServlet</servlet-name>
    <url-pattern>/first</url-pattern>
</servlet-mapping>

这样每新增一个Servlet类都要在web.xml增加一段类似的配置,很繁琐,降低了开发的效率。

SpringBoot提供了两种方式来解决整个问题:

  • 通过注解扫描完成 Servlet组件的注册
  • 通过方法完成 Servlet组件的注册

引入依赖:

<!-- 核心启动器, 包括auto-configuration、logging and YAML -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- building web, including RESTful, applications using Spring MVC.
    使用Tomcat作为嵌入式容器, @RestController由这个starter提供-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

二、通过注解扫描完成 Servlet组件的注册

在servlet3.0以后,web.xml中对Servlet配置,同样可以在@WebServlet注解中配置。

@WebServlet(name="FirstServlet", urlPatterns={"/first"})
public class MyFirstServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("FirstServlet Enter ......");
    }
}

@WebServlet属性详解:

  • name:类型String,指定Servlet 的 name 属性,等价于 <servlet-name>。如果没有显式指定,则该 Servlet 的取值即为类的全限定名。
  • value:类型String[],该属性等价于 urlPatterns 属性。两个属性不能同时使用。
  • urlPatterns:类型String[],指定一组 Servlet 的 URL 匹配模式。等价于<url-pattern>标签。
  • loadOnStartup:类型int,指定 Servlet 的加载顺序,等价于 <load-on-startup>标签。
  • initParams:类型WebInitParam[],指定一组 Servlet 初始化参数,等价于<init-param>标签。
  • asyncSupported:类型boolean, 声明 Servlet 是否支持异步操作模式,等价于<async-supported> 标签。
  • description:String类型,该 Servlet 的描述信息,等价于 <description>标签。
  • displayName:String类型,该 Servlet 的显示名,通常配合工具使用,等价于 <display-name>标签。

使用注解的方式必须在SpringBoot启动类增加@ServletComponentScan注解,这样SpringBoot 启动时会扫描@WebServlet,实例化这些类。

二、通过方法完成 Servlet组件的注册

/**
 * 与第一种的区别,就是没有加@WebServlet注解
 */
public class MySecondServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("MySecondServlet Enter ......");
    }
}

这种方式需要在配置类上以@Bean的形式注入到Spring容器中。

@Configuration
public class BootConfig {
    /**
     * 以@Bean注解实例化Servlet,注入到容器中,方法名称就是bean name
     */
    @Bean
    public ServletRegistrationBean getServlet(){
        ServletRegistrationBean secondServlet = new ServletRegistrationBean(new MySecondServlet());
        secondServlet.addUrlMappings(new String[]{"/second"});
        return secondServlet;
    }
}
原文地址:https://www.cnblogs.com/myitnews/p/12346086.html