• SpringBoot:Web开发之三大组件详解



    简介

    Servlet是JavaEE的规范之一,规范就是接口。Servlet是JavaWeb三大组建之一,其中,三大组件分别是:Servlet程序、Filter过滤器和Listener监听器。Servlet是运行在服务器上的一个java小程序,他可以接收客户端发过来的信息,并响应数据给客户端。

    ervlet的生命周期为以下四个步骤:1、执行Servlet构造器方法;2、执行init方法;3、执行service方法;4、执行destroy方法。

    Servlet有一个很重要的作用就是可以接受客户端发过来的信息,并且进行响应。我们还知道,最简单的请求方式有两种,一种叫GET,一种叫POST,这两种请求方式是不一样的。

    注意:前两个步骤只在第一次访问网页的时候执行一次,第三个步骤每次访问都会调用(比如,疯狂刷新网页),第四个步骤在web工程停止的时候调用。

    Filter是JavaWeb三大组件之一,符合JavaEE的规范接口。用于请求的拦截和过滤。拦截请求常见应用场景:权限检查、日记操作、事务管理。

    Filter过滤器的使用步骤:1、编写一个类实现Filter接口;2、实现过滤方法doFIlter( );3、在web.xml中配置Filter的拦截路径。

    Filter的生命周期包含几个方法:1、构造器方法(服务器启动就调用);2、init初始化方法(服务器启动就调用);3、doFilter方法(当输入拦截地址的时候调用);4、destroy销毁方法(关闭服务器的时候调用)。

    Listener作为JavaEE的规范,其实就是一个接口。他的作用是:监听某个事物的变化,然后通过回调函数,反馈给客户(程序)去做一些响应的处理。接下来我们要讲的ServletContextListener主要监听的是Servlet的创建和销毁,貌似也只能监听他的创建和销毁。

    一、Servlet配置

    1. 使用@WebServlet配置Servlet

    继承一下HttpServlet。然后添加@WebServlet注解。

    package com.example.boot.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;
    
    @WebServlet(urlPatterns = "/myServlet")
    public class MyServlet extends HttpServlet {
    
          @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setContentType("text/html; charset=UTF-8");
            resp.getWriter().write("这是用SpringBoot写出来的哦~");
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    然后在我们的主配置类中添加@ServletComponentScan注解即可:

    package com.example.boot;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.web.servlet.ServletComponentScan;
    
    @ServletComponentScan
    @SpringBootApplication
    public class SpringbootWebApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringbootWebApplication.class, args);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    运行结果:
    在这里插入图片描述

    2.使用ServletRegistrationBean配置Servlet

    注释掉之前的@WebServlet注解,然后写我们的配置类:

    package com.example.boot.config;
    
    import com.example.boot.servlet.MyServlet;
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class MyRegistConfig {
        @Bean
        public ServletRegistrationBean myServlet(){
            MyServlet myServlet = new MyServlet();
            /**
             * 返回ServletRegistrationBean对象
             * 第一个参数是我们的Servlet对象
             * 第二个参数开始使我们设置的Servlet的请求地址(可以设置多个)
             */
            return new ServletRegistrationBean(myServlet,"/myServlet","/myServlet02");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    运行结果:
    在这里插入图片描述

    二、Filter配置

    1. 使用@WebFilter配置Filter

    实现Filter接口。然后添加@WebFilter注解。

    package com.example.boot.filter;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;
    
    @WebFilter(urlPatterns = {"/css/*", "/js/* "})
    public class MyFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("MyFilter初始化完成");
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("MyFilter正在工作");
            //放行
            filterChain.doFilter(servletRequest,servletResponse);
        }
    
        @Override
        public void destroy() {
            System.out.println("MyFilter已经销毁");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    然后在我们的主配置类中添加@ServletComponentScan注解即可:运行结果:
    在这里插入图片描述

    2. 使用FilterRegistrationBean配置Filter

    注释掉之前的@WebFilter注解,然后写我们的配置类:

        @Bean
        public FilterRegistrationBean myFilter(){
            MyFilter myFilter = new MyFilter();
            /**
             * 第一个参数是我们的拦截器对象
             * 对二个参数开始是我们的ServletRegistrationBean对象(其实就是我们自定义的Servlet)
             */
            return new FilterRegistrationBean(myFilter, myServlet());
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    运行结果:可见,这种写法的话,我们的拦截器也可以对其进行拦截。
    在这里插入图片描述

    三、Listener配置

    1. 使用@WebListener配置Listener

    实现一下ServletContextListener接口。然后添加@WebListener注解。

    package com.example.boot.listener;
    
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.annotation.WebListener;
    
    @WebListener
    public class MyListener implements ServletContextListener {
        @Override
        public void contextInitialized(ServletContextEvent servletContextEvent) {
            System.out.println("Servlet被创建");
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent servletContextEvent) {
            System.out.println("Servlet被销毁");
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    然后在我们的主配置类中添加@ServletComponentScan注解即可:运行结果:在这里插入图片描述

    2. 使用ServletListenerRegistrationBean配置Listener

    注释掉之前的@WebListener注解,然后写我们的配置类:

    package com.example.boot.config;
    
    import com.example.boot.filter.MyFilter;
    import com.example.boot.listener.MyListener;
    import com.example.boot.servlet.MyServlet;
    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 java.util.*;
    
    @Configuration
    public class MyRegistConfig {
    
        @Bean
        public ServletRegistrationBean myServlet(){
            MyServlet myServlet = new MyServlet();
            /**
             * 返回ServletRegistrationBean对象
             * 第一个参数是我们的Servlet对象
             * 第二个参数开始使我们设置的Servlet的请求地址(可以设置多个)
             */
            return new ServletRegistrationBean(myServlet,"/myServlet","/myServlet02");
        }
    
        @Bean
        public FilterRegistrationBean myFilter(){
            MyFilter myFilter = new MyFilter();
            /**
             * 第一个参数是我们的拦截器对象
             * 对二个参数开始是我们的ServletRegistrationBean对象(其实就是我们自定义的Servlet)
             */
    //        return new FilterRegistrationBean(myFilter, myServlet());
            FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(myFilter);
            List list = new ArrayList();
            list.add("/myServlet");
            list.add("/css/*");
            //传入的是一个Collection,用Set、List等都可以
            filterRegistrationBean.setUrlPatterns(list);
            return filterRegistrationBean;
        }
    
        @Bean
        public ServletListenerRegistrationBean myListener(){
            MyListener myListener = new MyListener();
            return new ServletListenerRegistrationBean(myListener);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    运行结果:(编译后就可以看到)
    在这里插入图片描述

    小结

    参考: https://blog.csdn.net/weixin_44741023/article/details/120322142
    https://blog.csdn.net/weixin_44741023/article/details/118499070

  • 相关阅读:
    cmd常用指令
    15、设计模式之迭代器模式(Iterator)
    BERT知识蒸馏Distilled BiLSTM
    51单片机入门——数模\模数转换
    Spring面试题(2022)
    赚麻了!!!
    钱就是道,因为钱具备道的灵魂!
    AIGC之Stable Diffusion
    从SpringBoot到SpringCloudAlibaba简明教程(一):初识SpringBoot及其基础项目构建
    HCIP —— BGP路径属性 (下)
  • 原文地址:https://blog.csdn.net/zhanggqianglovec/article/details/127728402