Web原生组件注入 也就是 Servlet 组件 Servlet Filter Listener

49 阅读2分钟

1. 原生注入

先上目录结构

1.png

package com.spring.bootinit.servlet;

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;

/**
 * @User: Json
 * @Date: 2022/8/22
 **/
@WebServlet(urlPatterns="/my")  //不会走spring 拦截器  一定要打 /  要不会报错
public class Myservlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.getWriter().write("6666");
    }
}



package com.spring.bootinit.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * @User: Json
 * @Date: 2022/8/25
 *
 **/
//urlPatterns 指定拦截 哪些路径
@WebFilter(urlPatterns = {"/css/*","/images/*"})  // 单 *  是servlet 写法  双 ** 是 spring 写法
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化打印==============");
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              System.out.println("工作");
              filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("销毁时打印==============");
        Filter.super.destroy();
    }
}

package com.spring.bootinit.servlet;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/**
 * @User: Json
 * @Date: 2022/8/25
 **/
@WebListener  //必须写上这个 注解  说明 这个类是一个监听器
public class MyListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("MyListener 监听到项目初始化 完成");
        ServletContextListener.super.contextInitialized(sce);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("MyListener 监听到项目摧毁 完成");
        ServletContextListener.super.contextDestroyed(sce);
    }
}

package com.spring.bootinit;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan(basePackages = "com.spring.bootinit")  //指定扫描的 Servlet组件路径
public class BootInitApplication {

    public static void main(String[] args) {
        SpringApplication.run(BootInitApplication.class, args);
    }

}

以上方式 就是 原生注入方式

2. spring 方式注入

首先把 类文件上的 注释掉

@WebServlet(urlPatterns=“/my”) //不会走spring 拦截器 一定要打 / 要不会报错

@WebFilter(urlPatterns = {“/css/“,”/images/”}) // 单 * 是servlet 写法 双 ** 是 spring 写法

@WebListener //必须写上这个 注解 说明 这个类是一个监听器

然后创建一个 config 文件

package com.spring.bootinit.config;

import com.spring.bootinit.interceptor.LoginTnterceptor;
import com.spring.bootinit.servlet.MyFilter;
import com.spring.bootinit.servlet.MyListener;
import com.spring.bootinit.servlet.Myservlet;
import com.sun.org.apache.bcel.internal.generic.NEW;
import javafx.concurrent.Service;
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;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.HiddenHttpMethodFilter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.util.UrlPathHelper;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * @User: Json
 * @Date: 2022/7/4
 **/
@Configuration(proxyBeanMethods = false)
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public ServletRegistrationBean myServlet(){
        Myservlet myservlet = new Myservlet();
        return new ServletRegistrationBean(myservlet,"/my");
    }

    @Bean
    public FilterRegistrationBean myFilter(){
        MyFilter myFilter = new MyFilter();
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(myFilter);
        filterRegistrationBean.setUrlPatterns(Arrays.asList("/my"));   //一定要打 /  要不会报错
        return new FilterRegistrationBean(myFilter);
    }

    @Bean
    public ServletListenerRegistrationBean myListener(){
        MyListener myListener = new MyListener();
        ServletListenerRegistrationBean servletListenerRegistrationBean=new ServletListenerRegistrationBean(myListener);
        return servletListenerRegistrationBean;
    }


//    @Override
//    public void addInterceptors(InterceptorRegistry registry) {
//        registry.addInterceptor(new LoginTnterceptor())
//                .addPathPatterns("/**")  // ** 拦截所有请求  包括静态资源
//                .excludePathPatterns("/login","/css/**","/js/**");  // 放行哪些请求
//        //"/css/**","/js/**" 这样配置 可以不拦截 静态资源
//    }
}

启动测试

2.png