SpringBoot注册web组件

news2024/11/24 4:20:49

目录

前言

一、注册Servlet组件

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

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

二、注册Listener组件

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

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

三、注册Filter组件

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

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


前言

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

  1. Servlet:Servlet是Java Web应用程序的基础,它是一个Java类,用于处理客户端请求并生成响应。Servlet可以通过注解或web.xml文件进行配置,它通常用于处理HTTP请求和响应。
  2. Filter:Filter是一个Java类,用于拦截和处理客户端请求和响应。Filter可以在请求到达Servlet之前或响应返回客户端之前执行预处理和后处理操作,例如验证用户身份、编码解码、压缩和解压缩等。
  3. 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,这里已经成功实现了!!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1057311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于YOLOv8的安全帽检测系统(2):Gold-YOLO,遥遥领先,助力行为检测 | 华为诺亚NeurIPS23

目录 1.Yolov8介绍 2.安全帽数据集介绍 3.Gold-YOLO 4.训练结果分析 1.Yolov8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的(SOTA)模型,它建立在先前YOLO成功基础上…

js 如何判断一个指定的位置点坐标是否落在一个多边形区域内?

1 场景 业务场景举例:快递选择收获区域、车辆电子围栏、运动轨迹路线、地理位置信息检测范围和地图等过滤等等。   比方说地图上有一块区域(抽象成多边形),然后里面每一个位置点(像素点)都有对应的GPS的经纬度坐标值&#xff0c…

如何破解压缩包zip解压密码?

Zip压缩包设置了密码,解压的时候就需要输入正确对密码才能顺利解压出文件,正常当我们解压文件或者删除密码的时候,虽然方法多,但是都需要输入正确的密码才能完成。忘记密码就无法进行操作。 那么,忘记了zip压缩包的密…

【C++】模板初阶 -- 详解

一、泛型编程 // 实现一个通用的交换函数: void Swap(int& left, int& right) {int temp left;left right;right temp; }void Swap(double& left, double& right) {double temp left;left right;right temp; }void Swap(char& left, ch…

Multisim14.0仿真(二十八)74LS13 施密特触发器

一、仿真原理图: 二、仿真效果图:

华为云云耀云服务器L实例评测|Elasticsearch的springboot整合 Kibana进行全查询和模糊查询

前言 最近华为云云耀云服务器L实例上新,也搞了一台来玩,期间遇到各种问题,在解决问题的过程中学到不少和运维相关的知识。 在前几期的博客中,介绍了Elasticsearch的Docker版本的安装,Elasticsearch的可视化Kibana工具…

【c语言】推箱子

所需知识&#xff1a;c语言枚举&#xff0c;数组&#xff0c;for循环&#xff0c;while循环&#xff0c;switch,case语句&#xff0c;图形库相关函数 1.调整控制台窗口大小 #define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <stdio.h> int main() {…

MySql017——组合查询

一、UNION作用 可用UNION操作符来组合数条SQL查询。 二、UNION 使用规则 1、UNION的使用很简单。所需做的只是给出每条SELECT语句&#xff0c;在各条语句之间放上关键字UNION。2、UNION必须由两条或两条以上的SELECT语句组成&#xff0c;语句之间用关键字UNION分隔&#xff…

Python绘图系统25:新增8种绘图函数

文章目录 常用绘图函数单选框的更改逻辑源代码 Python绘图系统&#xff1a; 前置源码&#xff1a; Python打造动态绘图系统&#x1f4c8;一 三维绘图系统 &#x1f4c8;二 多图绘制系统&#x1f4c8;三 坐 标 轴 定 制&#x1f4c8;四 定制绘图风格 &#x1f4c8;五 数据生成导…

PCB放置过孔技巧

合理的放置过孔能有效的节约面积。 我们根据嘉立创的pcb工艺能力中写出单双面板最小过孔为0.3mm(内径)/0.5mm(外径) 设置过孔尺寸外直径为24mil&#xff08;0.61mm&#xff09;&#xff09;内直径为12mil&#xff08;0.305mm&#xff09; 嘉立创PCB工艺加工能力范围说明-嘉立…

Blender 导出 fbx 到虚幻引擎中丢失材质!!!(使用Blender导出内嵌材质的fbx即可解决)

目录 0 引言1 Blender导出内嵌纹理的fbx模型 0 引言 我在Blender处理了一些fbx模型后再次导出到UE中就经常出现&#xff0c;材质空白的情况&#xff08;如下图所示&#xff09;&#xff0c;今天终于找到问题原因&#xff0c;记录下来&#xff0c;让大家避免踩坑。 其实原因很简…

Ubuntu18.04搭建Jenkins自动化部署Gitee仓库代码

1、安装Java环境 sudo apt install openjdk-8-jdk 然后通过java -version查看Java环境是否搭建成功&#xff1a; 2、安装Jenkins 下载Jenkins.war包&#xff1a; https://sg.mirror.servanamanaged.com/jenkins/war-stable/2.319.1/jenkins.war 然后参考Jenkins官网有关je…

springmvc-JSR303进行服务端校验分组验证SpringMVC定义Restfull接口异常处理流程RestController异常处理

目录& 1. JSR303 2. JSR303中含有的注解 3. spring中使用JSR303进行服务端校验 3.1 导入依赖包 3.2 添加验证规则 3.3 执行校验 4. 分组验证 4.1 定义分组验证规则 4.2 验证时通过参数指定验证规则 4.3 验证信息的显示 5. SpringMVC定义Restfull接口 5.1 增加s…

Moonbeam Ignite强势回归

参与Moonbeam上最新的流动性计划 还记得新一轮的流动性激励计划吗&#xff1f;Moonbeam Ignite社区活动带着超过300万枚GLMR奖励来啦&#xff01;体验新项目&#xff0c;顺便薅一把GLMR羊毛。 本次Moonbeam Ignite活动的参与项目均为第二批Moonbeam生态系统Grant资助提案中获…

数据结构与算法课后题-第三章(堆栈和队列的应用)

#include <iostream> //引入头文件 using namespace std;typedef char Elemtype;#define Maxsize 10 #define ERROR 0 #define OK 1typedef struct {Elemtype data[Maxsize];int top; }SqStack;SqStack S;void InitStack(SqStack& S) {S.top -1; } bool StackEm…

腾讯云双十一活动什么时候开始?具体有哪些优惠活动?

腾讯云双十一活动什么时候开始&#xff1f;具体有哪些优惠活动&#xff1f; 双十一购物狂欢节即将到来&#xff0c;各大电商平台都纷纷推出了一系列的优惠活动&#xff0c;吸引消费者前来购买。作为云服务行业的领导者&#xff0c;腾讯云自然也不会错过这个机会。腾讯云将为用户…

侯捷 C++ STL标准库和泛型编程 —— 6 算法 + 7 仿函数

6 算法 算法的标准样式&#xff1a;需要传进去两个指针 6.1 算法源码 6.1.1 accumulate 两个版本&#xff1a; 元素累加到 init 上 template <class InputIterator, class T> T accumulate(InputIterator first, InputIterator last, T init) {for (; first ! last; f…

【小沐学前端】从零开始搭建一个Vue项目

文章目录 1、简介1.1 Vue 核心功能1.2 Vue API风格1.3 node环境 2、构建项目2.1 vue create2.2 vue ui2.3 vue init2.4 vite 结语 1、简介 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&am…

ESP32设备驱动-I2C-LCD1602显示屏驱动

I2C-LCD1602显示屏驱动 1、LCD1602介绍 LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。 通过前面的实例我们知道,并口方式…

游戏开发者如何能达到5万月薪?这太难了......

引言 大家好&#xff0c;我是亿元程序员&#xff0c;一位有着8年游戏行业经验的主程。 在现代世界&#xff0c;游戏开发已经成为一个备受追捧的职业选择&#xff0c;而月薪5万则是许多年轻游戏开发者的梦想。虽然这个目标可能看起来有些遥不可及&#xff0c;但通过坚定的决心…