由于 Spring Boot 默认以 Jar 包方式部署的,默认没有 web.xml,因此无法再像以前一样通过 web.xml 配置来使用 Servlet 、Filter、Listener,但 Spring Boot 提供了 2 种方式来注册这些 Web 原生组件。
-
通过组件扫描注册
-
使用 RegistrationBean 注册
1、通过组件扫描注册
Servlet 3.0 提供了以下 3 个注解:
-
@WebServlet:用于声明一个 Servlet;
-
@WebFilter:用于声明一个 Filter;
-
@WebListener:用于声明一个 Listener。
监听器>过滤器>servlet
这些注解可直接标注在对应组件上,它们与在 web.xml 中的配置意义相同。每个注解都具有与 web.xml 对应的属性,可直接配置,省去了配置 web.xml 的繁琐。
想要在 SpringBoot 中注册这些原生 Web 组件,可以使用 @ServletComponentScan 注解实现,该注解可以扫描标记 @WebServlet、@WebFilter 和 @WebListener 三个注解的组件类,并将它们注册到容器中。
注意:@ServletComponentScan 注解只能标记在启动类或配置类上。
2、使用 RegistrationBean 注册
我们还可以在配置类中使用 RegistrationBean 来注册原生 Web 组件,不过这种方式相较于注解方式要繁琐一些。使用这种方式注册的原生 Web 组件,不再需要使用 @WebServlet 、@WebListener 和 @WebListener 等注解。
RegistrationBean 是个抽象类,负责将组件注册到 Servlet 容器中,Spring 提供了三个它的实现类,分别用来注册 Servlet、Filter 和 Listener。
-
ServletRegistrationBean:Servlet 的注册类
-
FilterRegistrationBean:Filter 的注册类
-
ServletListenerRegistrationBean:Listener 的注册类
我们可以在配置类中,使用 @Bean 注解将 ServletRegistrationBean、FilterRegistrationBean 和 ServletListenerRegistrationBean 添加 Spring 容器中,并通过它们将我们自定义的 Servlet、Filter 和 Listener 组件注册到容器中使用。
注册Servlet
1.通过注解注册
@WebServlet(value = {"/login"})
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("登录测试");
}
}
启动类
@SpringBootApplication
@ServletComponentScan
public class SbdemoApplication {
public static void main(String[] args) {
SpringApplication.run(SbdemoApplication.class, args);
}
}
2.使用 RegistrationBean 注册
@Configuration
public class ServletConfig {
@Bean
public ServletRegistrationBean servletRegistrationBean(){
ServletRegistrationBean registrationBean=new ServletRegistrationBean();
registrationBean.setServlet(new LoginServlet());
registrationBean.addUrlMappings("/login");
return registrationBean;
}
}
过滤器Filter
1.通过注解注册
@Slf4j
@WebFilter(value = "/api/*")
public class LogFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
// 打印请求信息
HttpServletRequest request = (HttpServletRequest) servletRequest;
log.info("------------- LogFilter 开始 -------------");
log.info("请求地址: {} {}", request.getRequestURL().toString(), request.getMethod());
log.info("远程地址: {}", request.getRemoteAddr());
long startTime = System.currentTimeMillis();
chain.doFilter(servletRequest, servletResponse);
log.info("------------- LogFilter 结束 耗时:{} ms -------------", System.currentTimeMillis() - startTime);
}
@Override
public void destroy() {
System.out.println("我是过滤器的被销毁时调用的方法................" );
}
}
2.通过RegistrationBean注册
@Configuration
public class ServletConfig {
@Bean
public FilterRegistrationBean testFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean(new LogFilter());
registration.addUrlPatterns("/api/*"); //
registration.setName("myFilter2");
return registration;
}
}
监听器Listener
1.通过注解注册
@Slf4j
@WebListener
public class ServletListener implements ServletRequestListener {
@Override
public void requestInitialized(ServletRequestEvent sre) {
log.info("ServletRequestListener requestInitialized-----");
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
log.info("ServletRequestListener requestDestroyed-----");
}
}
2.通过RegistrationBean注册
@Configuration
public class ServletConfig {
@Bean
public ServletListenerRegistrationBean servletListenerRegistrationBean(){
ServletListenerRegistrationBean bean = new ServletListenerRegistrationBean();
//注册自定义Listener
bean.setListener(new MyServletListener());
bean.setEnabled(true);
//路径
bean.setOrder(3);
return bean;
}
}