16、Web原生组件注入(Servlet、Filter、Listener)


【尚硅谷】SpringBoot2零基础入门教程-讲师:雷丰阳
笔记

路还在继续,梦还在期许

1、使用原生Servlet API

推荐使用原生Servlet API 这种方式

1.1、Servlet

使用 Servlet 3.0 版本以上提供的原生注解。

@WebServlet(urlPatterns = “/my”)

效果:不需要在web.xml写配置,直接响应,没有经过Spring的拦截器,urlPatterns :访问路径。

在主配置类中指定扫描原生Servlet组件的包:@ServletComponentScan(basePackages = “com.atguigu.admin.servlet”),不写得话,就默认扫描组配置类下所有的包。

@WebServlet(urlPatterns = "/my") 
public class MyServlet extends HttpServlet {
    
    

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

1.2、Filter

使用 Servlet 3.0 版本以上提供的原生注解。

@WebFilter(urlPatterns={“/css/“,”/images/”})

扫描二维码关注公众号,回复: 16399216 查看本文章

效果:不需要在web.xml写配置,urlPatterns:拦截路径,可以拦截多个路径。

@WebFilter(urlPatterns={
    
    "/my"})
public class MyFilter implements Filter {
    
    

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    
    
        System.out.println("MyFilter初始化完成");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
    
        System.out.println("MyFilter工作");
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
    
    
        System.out.println("MyFilter销毁");
    }
}

1.3、Listener

使用 Servlet 3.0 版本以上提供的原生注解。

@WebListener

@WebListener
public class MyServletContextListener implements ServletContextListener {
    
    

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

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
    
    
        System.out.println("监听项目销毁");
    }
}

1.4、原生servlet没有被拦截器拦截得原因

系统内有两个 Servlet (spring boot:DispatcherServlet–>/ 和 MyServlet -->/my )

1.5、扩展:DispatchServlet 如何注册进来

● 容器中自动配置了 DispatcherServlet 属性绑定到 WebMvcProperties;对应的配置文件配置项是 spring.mvc。
● 通过 ServletRegistrationBean 把 DispatcherServlet 配置进来。
● 默认映射的是 / 路径。

在这里插入图片描述
在之前使用Tomcat-Servlet做开发,多个servlet路径相互重叠,多个Servlet都能处理到同一层路径,使用精确优选原则。

举例:

两个路径
A: /my/
B: /my/1
如果发送的是 /my/1 ,那就会使用B路径,如果发送的是 /my/2 使用A路径。

2、使用RegistrationBean

还可以使用 ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean 来组件注册。

@Configuration
public class MyRegistConfig {
    
    

    // servlet
    @Bean
    public ServletRegistrationBean myServlet() {
    
    
        MyServlet servlet = new MyServlet();
        return new ServletRegistrationBean<MyServlet>(servlet, "/my");
    }

    // filter
    @Bean
    public FilterRegistrationBean myFilter() {
    
    
        MyFilter myFilter = new MyFilter();
        FilterRegistrationBean filter = new FilterRegistrationBean(new MyFilter());
        filter.setUrlPatterns(Arrays.asList("/my"));
        return filter;
    }

    // listener
    @Bean
    public ServletListenerRegistrationBean myListener() {
    
    
        MyServletContextListener listener = new MyServletContextListener();
        return new ServletListenerRegistrationBean(listener);
    }
}

猜你喜欢

转载自blog.csdn.net/zhao854116434/article/details/130251261