SpringBoot注册web组件的实现方式

 更新时间:2023年10月06日 09:01:22   作者:会洗碗的CV工程师  
Servlet是Java Web应用程序的基础,它提供了处理客户端请求的机制,Servlet三大组件是指Servlet、Filter和Listener,它们是Java Web应用程序的核心组件,本文将给大家介绍一下SpringBoot注册web组件的实现方式,需要的朋友可以参考下

前言

Servlet是Java Web应用程序的基础,它提供了处理客户端请求的机制。Servlet三大组件是指Servlet、Filter和Listener,它们是Java Web应用程序的核心组件。

  • Servlet:Servlet是Java Web应用程序的基础,它是一个Java类,用于处理客户端请求并生成响应。Servlet可以通过注解或web.xml文件进行配置,它通常用于处理HTTP请求和响应。
  • Filter:Filter是一个Java类,用于拦截和处理客户端请求和响应。Filter可以在请求到达Servlet之前或响应返回客户端之前执行预处理和后处理操作,例如验证用户身份、编码解码、压缩和解压缩等。
  • Listener:Listener是一个Java类,用于监听Web应用程序中的事件,并在事件发生时执行相应的操作。Listener可以通过注解或web.xml文件进行配置,它通常用于处理应用程序启动、停止、会话创建和销毁等事件。

总之,Servlet三大组件是Java Web应用程序的核心组件,它们分别用于处理请求、拦截请求和监听事件,从而实现了一个完整的Java Web应用程序。

一、注册Servlet组件

由于SpringBoot项目没有web.xml文件,所以无法在web.xml中注册web组件,SpringBoot有自己的方式注册web组件。

1.1 使用SpringBoot注解加继承HttpServet类注册

编写servlet,首先是要添加@WebServlet注解;代码如下:

package com.example.demo.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("/first")
public class FirstServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("First Servlet......");
        super.doGet(req, resp);
    }
}

启动类添加扫描Web组件用到的注解@ServletComponentScan

OK,直接运行看效果:访问:http://localhost:8080/first

是可以直接打印出来的。

1.2 通过继承HttpServet类加配置类来进行注册

ok,接下来我们讲解第二种注册方式,通过继承HttpServet类来进行注册,代码如下:

package com.example.demo.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 SecondServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Second Servlet........");
        super.doGet(req, resp);
    }
}

这里我们需要新建一个配置类,将该Servlet加载到Spring容器中,配置类代码如下

package com.example.demo.config;
import com.example.demo.servlet.SecondServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ServletConfig {
    // ServletRegistrationBean可以注册Servlet组件,将其放入Spring容器中即可注册Servlet
    @Bean
    public ServletRegistrationBean getServletRegistrationBean(){
        // 注册Servlet组件
        ServletRegistrationBean bean = new ServletRegistrationBean(new SecondServlet());
        // 将Servlet组件添加访问路径
        bean.addUrlMappings("/second");
        return bean;
    }
}

OK,然后我们点击运行,直接访问http://localhost:8080/second 

因此说明了两种注册方式都是可用的。 

二、注册Listener组件

2.1  使用SpringBoot注解和实现ServletContextListener接口注册

原理和上面一样只不过是直接注解,无需配置类,代码如下

package com.example.demo.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener()
public class FirstListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("FirsListener.........");
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        ServletContextListener.super.contextDestroyed(sce);
    }
}

此时如果我们直接运行项目就会打印上面那句话,接下来我们直接运行项目,看看是否打印,

说明该方法是可行的,

2.2 ServletContextListener接口和配置类来进行注册

同样我们去掉注解使用配置类注册 ,代码如下:

package com.example.demo.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class SecondListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("Second Listener...........");
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        ServletContextListener.super.contextDestroyed(sce);
    }
}

配置类代码入下:

package com.example.demo.config;
import com.example.demo.listener.SecondListener;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ListenerConfig {
    // ServletRegistrationBean可以注册Servlet组件,将其放入Spring容器中即可注册Servlet
    @Bean
    public ServletListenerRegistrationBean getServletListenerRegistrationBean(){
        // 注册Listener组件
        ServletListenerRegistrationBean bean = new ServletListenerRegistrationBean(new SecondListener());
        return bean;
    }
}

 然后直接运行看看结果,

OK,同样也是没有问题的。 

三、注册Filter组件

3.1  使用SpringBoot注解加实现Filter接口注册

和上面一样,代码如下:

package com.example.demo.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
import java.util.Scanner;
//@WebFilter("/first")
public class FirstServletFilter 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("进入First Filter");
        Scanner scanner = new Scanner(System.in);
        boolean flag = scanner.nextBoolean();
        while(!flag){
            System.out.println("要输入true才放行!!!");
            flag = scanner.nextBoolean();
        }
        filterChain.doFilter(servletRequest,servletResponse);
        scanner.close();
    }
    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

这里访问/frist的话/我们要输入true才进行放行,看看是否成功过滤, 

OK,这里是成功了的,接下来也是一样的操作 

3.2 通过实现Filter接口和配置类来进行注册通过实现

代码如下:

package com.example.demo.filter;
import javax.servlet.*;
import java.io.IOException;
import java.util.Scanner;
public class SecondFilter 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("进入Second Filter");
        Scanner scanner = new Scanner(System.in);
        boolean flag = scanner.nextBoolean();
        while(!flag){
            System.out.println("要输入true才可以放行!!!");
            flag = scanner.nextBoolean();
        }
        filterChain.doFilter(servletRequest,servletResponse);
        scanner.close();
    }
    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

配置类代码如下:

package com.example.demo.config;
import com.example.demo.filter.SecondFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
    // ServletRegistrationBean可以注册Servlet组件,将其放入Spring容器中即可注册Servlet
    @Bean
    public FilterRegistrationBean getFilterRegistrationBean (){
        // 注册filter组件
        FilterRegistrationBean bean = new FilterRegistrationBean(new SecondFilter());
        // 添加过滤路径
        bean.addUrlPatterns("/second");
        return bean;
    }
}

同样这里访问/second的话/我们要输入true才进行放行,看看是否成功过滤,

OK,这里已经成功实现了!!! 

以上就是SpringBoot注册web组件的实现方式的详细内容,更多关于SpringBoot注册web组件的资料请关注脚本之家其它相关文章!

相关文章

  • java写入文件的几种方法分享

    java写入文件的几种方法分享

    这篇文章主要介绍了java写入文件的几种方法,需要的朋友可以参考下
    2014-02-02
  • Java中HashMap的常见用法详解

    Java中HashMap的常见用法详解

    这篇文章主要介绍了Java中HashMap的常见用法详解,HashMap是Java中的一个常用子类,它是java.util.HashMap<k,v>集合,实现了Map<k,v>接口, HashMap可以存储键值对,通过键来快速访问值,在HashMap中,键是唯一的,而值可以重复,需要的朋友可以参考下
    2023-09-09
  • java的split方法使用示例

    java的split方法使用示例

    这篇文章主要介绍了java的split方法使用示例,需要的朋友可以参考下
    2014-04-04
  • java线程并发countdownlatch类使用示例

    java线程并发countdownlatch类使用示例

    javar的CountDownLatch是个计数器,它有一个初始数,等待这个计数器的线程必须等到计数器倒数到零时才可继续。
    2014-01-01
  • resty的缓存技术设计及使用

    resty的缓存技术设计及使用

    这篇文章主要为大家介绍了resty缓存技术的设计及使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • SpringSecurity的防Csrf攻击实现代码解析

    SpringSecurity的防Csrf攻击实现代码解析

    这篇文章主要介绍了SpringSecurity的防Csrf攻击实现代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 基于Mybatis-plus实现多租户架构的全过程

    基于Mybatis-plus实现多租户架构的全过程

    多租户是一种软件架构技术,在多用户的环境下,共有同一套系统,并且要注意数据之间的隔离性,下面这篇文章主要给大家介绍了关于基于Mybatis-plus实现多租户架构的相关资料,需要的朋友可以参考下
    2022-02-02
  • Java数据结构之图的领接矩阵详解

    Java数据结构之图的领接矩阵详解

    图的领接矩阵存储方式是用两个数组来表示图。一个一位数组存储图中顶点信息,一个二维数组存储图中的边或弧的信息。本文将为大家重点介绍一下数据结构中的图的邻接矩阵,快来跟随小编一起学习吧
    2021-11-11
  • Java中println输出汉字乱码问题一招解决方案

    Java中println输出汉字乱码问题一招解决方案

    这篇文章主要介绍了Java中println输出汉字乱码问题一招解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 谈谈在Java发送邮件中遇到的的问题

    谈谈在Java发送邮件中遇到的的问题

    本文介绍了在利用Java发送邮件过程中遇到的的两个问题,以及如何解决这两个问题。如果大家也遇到了这些问题,可以来参考借鉴。
    2016-08-08

最新评论