Spring Boot:Web开发之三大组件的整合

03-29 8574阅读 0评论

Spring Boot

  • 前言
  • Spring Boot 整合 Servlet
  • Spring Boot 整合 Filter
  • Spring Boot 整合 Listener

    Spring Boot:Web开发之三大组件的整合 第1张

    前言

    在 Web 开发中,Servlet 、Filter 和 Listener 是 Java Web 应用中的三大组件。Servlet 是 Java 代码,通过 Java 的 API 动态的向客户端输出内容。Filter 是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。Listener 是监听器,可以监听客户端的请求、服务端的操作等,通过监听器可以自动激发一些操作。

    而 Spring Boot 为 Web 开发提供了强大的支持,整合了常用的 Web 框架(如 Spring MVC ),并默认支持 Web 开发中的一些通用功能。在 Spring Boot 项目中,可以通过注解等方式轻松实现 Servlet 、Filter 、Listener 等组件的整合,从而简化 Web 应用的开发过程。下面简单介绍 Spring Boot 整合 Java Web 应用中的三大组件。

    Spring Boot 整合 Servlet

    Spring Boot 为 Servlet API 提供了自动配置,整合过程相对简单。而将传统的 Servlet 组件集成到 Spring Boot 的应用中具体有两种方法。

    简单示例:

    第一种方法:

    首先,在 Controller 包内创建 ServletDemo 类,使用 @WebServlet 注解配置 Servlet 映射

    package cn.edu.SpringBootDemo.Controller;
    import jakarta.servlet.ServletException;
    import jakarta.servlet.annotation.WebServlet;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    import java.io.IOException;
    @WebServlet(urlPatterns = "/ServletDemo.html")
    public class ServletDemo extends HttpServlet {
        // 覆盖 doGet() 方法
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("调用 ServletDemo 的 doGet 方法!!!");
        }
    }
    

    然后,在 Spring Boot 启动类 SpringBootDemoApplication 上添加 @ServletComponentScan 注解

    package cn.edu.SpringBootDemo;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.web.servlet.ServletComponentScan;
    @SpringBootApplication
    @ServletComponentScan // 用于启用对带有 @WebServlet、@WebFilter、@WebListener 等 Servlet 3.0 注解的类的自动扫描和注册
    public class SpringBootDemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(SpringBootDemoApplication.class, args);
        }
    }
    

    最后,启动 Spring Boot ,打开浏览器输入 http://localhost:8080/ServletDemo.html 并按下回车键进行测试

    结果如图:

    Spring Boot:Web开发之三大组件的整合 第2张

    第二种方法:

    第二种方法与第一种方法的区别是无需使用到 @WebServlet 和 @ServletComponentScan 两个注解,而是使用一个返回类型为 ServletRegistrationBean 的方法替代。

    首先,在 ServletDemo 类上注释 @WebServlet 注解

    package cn.edu.SpringBootDemo.Controller;
    import jakarta.servlet.ServletException;
    import jakarta.servlet.annotation.WebServlet;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    import java.io.IOException;
    //@WebServlet(urlPatterns = "/ServletDemo.html")
    public class ServletDemo extends HttpServlet {
        // 覆盖 doGet() 方法
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("第二种方法:调用 ServletDemo 的 doGet 方法!!!");
        }
    }
    

    然后,在 Spring Boot 启动类 SpringBootDemoApplication 上也注释 @ServletComponentScan 注解,并添加一个返回类型为 ServletRegistrationBean 的方法

    Spring Boot:Web开发之三大组件的整合 第3张

    package cn.edu.SpringBootDemo;
    import cn.edu.SpringBootDemo.Controller.ServletDemo;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    @SpringBootApplication
    //@ServletComponentScan // 用于启用对带有 @WebServlet、@WebFilter、@WebListener 等 Servlet 3.0 注解的类的自动扫描和注册
    public class SpringBootDemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(SpringBootDemoApplication.class, args);
        }
        @Bean // 注入 Spring 容器当中
        public ServletRegistrationBean getBean(){
            // Servlet 注册到 Spring Boot 当中
            ServletRegistrationBean bean = new ServletRegistrationBean(new ServletDemo());
            // url 地址关联
            bean.addUrlMappings("/ServletDemo.html");
            return bean;
        }
    }
    

    最后,启动 Spring Boot ,打开浏览器输入 http://localhost:8080/ServletDemo.html 并按下回车键进行测试

    结果如图:

    Spring Boot:Web开发之三大组件的整合 第4张

    Spring Boot 整合 Filter

    在 Spring Boot 中,整合 Filter 通常涉及到创建 Filter 类,并通过配置将其注册到 Servlet 容器中,具体有两种方法,与整合 Servlet 类似。

    简单示例:

    第一种方法:

    首先,在项目中创建 Web 包并在其包内创建一个 FilterDemo 类,使用 @WebFilter 注解配置 Filter 映射

    package cn.edu.SpringBootDemo.Web;
    import jakarta.servlet.*;
    import jakarta.servlet.annotation.WebFilter;
    import java.io.IOException;
    @WebFilter(filterName = "FilterDemo",urlPatterns = {"/ServletDemo.html"})
    public class FilterDemo implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            Filter.super.init(filterConfig);
        }
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println(" FilterDemo 拦截器拦截进行处理");
            filterChain.doFilter(servletRequest,servletResponse);
            System.out.println(" FilterDemo 拦截器已经让其放行");
        }
        @Override
        public void destroy() {
            Filter.super.destroy();
        }
    }
    

    然后,在 Spring Boot 启动类 SpringBootDemoApplication 上添加 @ServletComponentScan 注解

    Spring Boot:Web开发之三大组件的整合 第5张

    最后,启动 Spring Boot ,打开浏览器输入 http://localhost:8080/ServletDemo.html 并按下回车键进行测试

    结果如图:

    Spring Boot:Web开发之三大组件的整合 第6张

    第二种方法:

    第二种方法与第一种方法的区别也是无需使用到 @WebFilter 和 @ServletComponentScan 两个注解,而是使用一个返回类型为 FilterRegistrationBean 的方法替代。

    首先,在 FilterDemo 类上注释 @WebFilter 注解

    Spring Boot:Web开发之三大组件的整合 第7张

    然后,在 Spring Boot 启动类 SpringBootDemoApplication 上也注释 @ServletComponentScan 注解,并添加一个返回类型为 FilterRegistrationBean 的方法

    Spring Boot:Web开发之三大组件的整合 第8张

    @Bean
    public FilterRegistrationBean getFilterBean(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new FilterDemo());
        filterRegistrationBean.addUrlPatterns("/ServletDemo.html");
        return filterRegistrationBean;
    }
    

    最后,启动 Spring Boot ,打开浏览器输入 http://localhost:8080/ServletDemo.html 并按下回车键进行测试

    结果如图:

    Spring Boot:Web开发之三大组件的整合 第9张

    Spring Boot 整合 Listener

    在 Spring Boot 中,整合 Listener 通常涉及到创建 Listener 类,并实现相应的 Servlet API 监听器接口,具体有两种方法,与整合 Servlet 类似。

    Servlet API 监听接口:

    • ServletContextListener:用于监听 Web 应用( ServletContext )的生命周期事件。当 Web 应用启动或关闭时,可以执行一些初始化和清理工作
    • HttpSessionListener:用于监听用户会话( HttpSession )的生命周期事件。当会话创建或销毁时,可以执行一些与用户会话相关的逻辑
    • ServletRequestListener:用于监听 HTTP 请求( ServletRequest )的生命周期事件。当请求开始和结束时,可以执行一些与请求相关的逻辑
    • 属性监听器:用于监听 Web 应用、会话或请求中的属性变化事件。当属性被添加、替换或移除时,可以执行相应的逻辑

      – ServletContextAttributeListener:监听 ServletContext 属性的变化

      – HttpSessionAttributeListener:监听 HttpSession 属性的变化

      – ServletRequestAttributeListener:监听 ServletRequest 属性的变化

      简单示例:

      第一种方法:

      首先,在 Web 包内创建一个 ListenerDemo 类,使用 @WebListener 注解配置 Listener 映射

      package cn.edu.SpringBootDemo.Web;
      import jakarta.servlet.ServletContextEvent;
      import jakarta.servlet.ServletContextListener;
      import jakarta.servlet.annotation.WebListener;
      @WebListener
      public class ListenerDemo implements ServletContextListener {
          @Override
          public void contextInitialized(ServletContextEvent sce) {
              System.out.println("系统初始化!!!");
          }
          @Override
          public void contextDestroyed(ServletContextEvent sce) {
          }
      }
      

      然后,同样在 Spring Boot 启动类 SpringBootDemoApplication 上添加 @ServletComponentScan 注解

      Spring Boot:Web开发之三大组件的整合 第10张

      最后,启动 Spring Boot 进行测试

      结果如图:

      Spring Boot:Web开发之三大组件的整合 第11张

      第二种方法:

      同样地,第二种方法与第一种方法的区别也是无需使用到 @WebListener 和 @ServletComponentScan 两个注解,而是使用一个返回类型为 ServletListenerRegistrationBean 的方法替代。

      首先,在 ListenerDemo 类上注释 @WebListener 注解

      Spring Boot:Web开发之三大组件的整合 第12张

      然后,在 Spring Boot 启动类 SpringBootDemoApplication 上也注释 @ServletComponentScan 注解,并添加一个返回类型为 ServletListenerRegistrationBean 的方法

      Spring Boot:Web开发之三大组件的整合 第13张

      @Bean
      public ServletListenerRegistrationBean getListenerBean(){
          ServletListenerRegistrationBean servletListenerRegistrationBean = new ServletListenerRegistrationBean(new ListenerDemo());
          return servletListenerRegistrationBean;
      }
      

      最后,启动 Spring Boot 进行测试

      结果如图:

      Spring Boot:Web开发之三大组件的整合 第14张


免责声明
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明。
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所
提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何
损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在
转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并白负版权等法律责任。

手机扫描二维码访问

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,8574人围观)

还没有评论,来说两句吧...

目录[+]