SpringBoot学习笔记(6)----SpringBoot中使用Servlet,Filter,Listener的三种方式

本文介绍在SpringBoot中使用Servlet, Filter和Listener的三种方式:通过Bean注册、实现ServletContextInitializer接口和使用注解。每种方式都详细展示了如何创建和配置Servlet, Filter及Listener,帮助开发者更好地理解并应用到实际项目中。

在一般的运用开发中Controller已经大部分都能够实现了,但是也不排除需要自己实现Servlet,Filter,Listener的方式,SpringBoot提供了三种实现方式。

1. 使用Bean的实现方式

首先创建一个Servlet,一个Filter,一个Listener,

DemoServlet.java

 

 
package com.wangx.boot.util.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class DemoServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("get method"); doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("post method"); resp.getWriter().write("hello world"); } }
 

  DemoFilter.java

 
package com.wangx.boot.util.filter;


import javax.servlet.*;
import java.io.IOException; public class DemoFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("开始拦截了...."); } @Override public void destroy() { } }
 

DemoListener.java

 
package com.wangx.boot.util.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; public class DemoListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { System.out.println("contextInitialized"); } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { System.out.println("contextDestroyed"); } }
 

然后直接在SpringBoot的启动类中将上面几个方法注册为Bean,

SpringBootDemo01Application.java
 
package com.wangx.boot;

import com.wangx.boot.util.filter.DemoFilter;
import com.wangx.boot.util.listener.DemoListener; import com.wangx.boot.util.servlet.DemoServlet; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; @SpringBootApplication public class SpringBootDemo01Application { /** * 注册Servlet * @return */ @Bean public ServletRegistrationBean createServlet () { //第二个参数为urlPartern return new ServletRegistrationBean(new DemoServlet(), "/demoServlet"); } /** * 注册Filter * @return */ @Bean public FilterRegistrationBean createFilter() { //第二个参数为需要拦截的路径,不传则拦截所有 return new FilterRegistrationBean(new DemoFilter(), createServlet()); } /** * 注册Listener * @return */ @Bean public ServletListenerRegistrationBean createrListener() { //自定义个Listener.监听整个Context的Servlet return new ServletListenerRegistrationBean(new DemoListener()); } public static void main(String[] args) { SpringApplication.run(SpringBootDemo01Application.class, args); } }
 

  启动项目时会Listener会打印contextInitialized,关闭时会打印contextDestroyed,访问时拦截器打印"开始拦截了....",并成功访问到Servlet,并输入hello world到浏览器上。

2. 实现ServletContextInitializer接口

  直接在SpringBoot的启动类中实现ServletContextInitializer,重写onStartup()方法也可以使用Servlet.Filter,Listener,以上面三个Demo类为例,使用ServletContextInitializer的方式的代码:

 
package com.wangx.boot;

import com.wangx.boot.util.filter.DemoFilter;
import com.wangx.boot.util.listener.DemoListener; import com.wangx.boot.util.servlet.DemoServlet; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletContextInitializer; import javax.servlet.DispatcherType; import javax.servlet.ServletContext; import javax.servlet.ServletException; import java.util.EnumSet; @SpringBootApplication public class SpringBootDemo01Application implements ServletContextInitializer { public static void main(String[] args) { SpringApplication.run(SpringBootDemo01Application.class, args); } @Override public void onStartup(ServletContext servletContext) throws ServletException { //创建Servlet,并映射访问路径为demoServlet servletContext.addServlet("demoServlet", new DemoServlet()).addMapping("/demoServlet"); //创建Filter,拦截的Servlet servletContext.addFilter("demoFilter", new DemoFilter()).addMappingForServletNames(EnumSet.of(DispatcherType.FORWARD), true, "demoServlet"); //创建Listener servletContext.addListener(new DemoListener()); } }
 

  运行结果与1相同

3. 使用注解的方式

  这是一个SpringBoot官方推荐的方式,也是三种方式中最简单的方式,只需要在SpringBoot的启动类上添加@ServletComponentScan注解,在DemoServlet类上添加@WebServlet(name = "demoServlet", urlPatterns = "/demoServlet")注解,DemoFilter类上添加@WebFilter(urlPatterns = "/*", dispatcherTypes = DispatcherType.FORWARD)(拦截所有请求),DemoListener类上添加@WebListener即可,运行结果与1相同。

 

原文  SpringBoot学习笔记(6)----SpringBoot中使用Servlet,Filter,Listener的三种方式

转载于:https://www.cnblogs.com/xiaoshen666/p/10843986.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值