SpringBoot2.x系列教程19--SpringBoot中整合Servlet, Filter和listener
SpringBoot2.x系列教程19--SpringBoot中整合Servlet, Filter和listener
前言
在学习Servlet、Filter、Listener的时候,我们知道可以有2种注册方式,即可以在web.xml文件中注册,也可以利用对应的注解实现注册。那么在SpringBoot中,如果我们还要创建使用Servlet、Filter、Listener这3个类,那么该如何使用呢?
今天就带大家学习在SpringBoot中如何注册使用Servlet、Filter、Listener这3个类。
一. Spring Boot中注册配置Servlet,Filter和Listener
1. 概述
我们在Spring Boot中使用内嵌的Servlet容器时,可以通过使用Spring Bean的方式,或者扫描Servlet组件的方式来注册Servlet,Filter及Listener(比如HttpSessionListener)。
Spring Boot 为我们提供了ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean 三个类分别用来注册 Servlet、Filter、Listener,接下来我就通过代码给大家讲解在SpringBoot中如何注册Servlet。
2. 示例代码
我们可以先看一段示例代码,对用ServletRegistrationBean类来实现Servlet注册有个大致印象。
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author 一一哥
*/
public class RegisterServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String name = getServletConfig().getInitParameter("name");
String sex = getServletConfig().getInitParameter("sex");
resp.getOutputStream().println("name is " + name);
resp.getOutputStream().println("sex is " + sex);
}
}
@Bean
public ServletRegistrationBean registerServlet() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(
new RegisterServlet(), "/registerServlet");
servletRegistrationBean.addInitParameter("name", "一一哥");
servletRegistrationBean.addInitParameter("sex", "man");
return servletRegistrationBean;
}
3. Servlet 3.0组件扫描注册
Servlet 3.0 之前,Servlet、Filter、Listener 这些组件都需要在 web.xml 中进行配置,3.0 之后不再需要 web.xml 这个配置文件了,所有的组件都可以通过代码或者注解来达到注册的目的。Servlet 3.0 提供了3个注解来代替:
- @WebServlet注解代替 Servlet 的xml配置方式;
- @WebFilter注解代替 Filter 的xml配置;
- @WebListener注解代替 Listener 的xml配置。
二. Spring Boot中Servlet的注册使用
接下来我会带大家学习在Spring Boot中如何进行Servlet的注册使用,本文主要是讲解两种实现方式,即组件注册方式和注解实现方式。
1. 创建Web项目
首先我会创建一个Spring Boot的Web项目,添加Web相关依赖包,具体过程略,请结合之前的章节,并参考下图创建。
2. 组件注册方式
然后我先讲解组件注册的方式,看以这种方式如何实现Servlet的注册使用。
2.1 创建UserServlet类
这里我随便创建一个UserServlet类,继承HttpServlet。
package com.yyg.boot.web;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/29
* @Description Description
*/
@Slf4j
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
log.warn("第一种Servlet实现方式-->组件注册方式");
resp.getWriter().write("success");
}
}
2.2 注册Servlet组件
我们可以在启动类Application或者别的配置类中,利用ServletRegistrationBean来注册刚才创建的UserServlet组件。
package com.yyg.boot;
import com.yyg.boot.web.UserServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/29
* @Description Description
*/
@SpringBootApplication
public class ServletApplication {
public static void main(String[] args){
SpringApplication.run(ServletApplication.class,args);
}
/**
*ServletRegistrationBean:注册创建的Servlet类
*/
@Bean
public ServletRegistrationBean getServletRegistrationBean(){
ServletRegistrationBean bean = new ServletRegistrationBean(new UserServlet());
//url映射路径
bean.addUrlMappings("/user");
return bean;
}
}
2.3 启动程序进行测试
接下来我们启动程序,在浏览器输入如下地址: http://localhost:8080/user
这时候可以看到控制台中成功地输出了如下信息。
而且浏览器中也显示了如下内容:
这就说明我们的UserServlet成功的注册完毕。
3. 注解注册方式
然后我再以注解的方式来讲解如何注册使用Servlet。
3.1 创建OrderServlet类
这里我创建一个OrderServlet类,在该类上添加@WebServlet注解。
package com.yyg.boot.web;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/29
* @Description 第二种实现Servlet的方式, 通过@WebServlet注解来实现注册.
*/
@Slf4j
@WebServlet(name = "OrderServlet", urlPatterns = "/order")
public class OrderServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
log.warn("第2种Servlet实现方式-->注解实现方式");
resp.getWriter().write("success");
}
}
3.2 添加@ServletComponentScan注解
注意,如果使用的是 Spring Boot 内嵌的Web服务器,需要在配置类上面添加额外的 @ServletComponentScan 注解来开启 Servlet 组件扫描功能。如果使用的是独立的Tomcat服务器,则不需要添加,它会使用服务器内部的自动发现机制。
本案例中需要添加@ServletComponentScan注解,扫描Servlet类所在的包。
package com.yyg.boot;
import com.yyg.boot.web.UserServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/29
* @Description Description
*/
@SpringBootApplication
@ServletComponentScan(basePackages = "com.yyg.boot.web")
public class ServletApplication {
public static void main(String[] args){
SpringApplication.run(ServletApplication.class,args);
}
}
3.3 启动程序进行测试
然后我们启动程序,在浏览器输入如下地址: http://localhost:8080/user
这样就可以看到控制台中成功输出如下信息: 浏览器中也会显示如下内容:
这样,我就用注解的方式注册使用了一个Servlet。
三. Filter与Listener的使用
另外Filter、Listener的使用,与Servlet的用法类似,在此我就不再进行一一讲解了,感兴趣的朋友可以自行尝试。
结语
这样,我们就掌握了如何在SpringBoot中注册使用Servlet、Filter、Listener了,你学会了吗?