Spring Boot | Spring Boot 整合 “Servlet三大组件“ ( Servlet / Filter / Listene )

目录:

  • Spring Boot 整合 "Servlet三大组件" :
    • 1. 使用 "组件注册" 的方式 "整合Servlet三大组件" ( 实际操作为 : 创建自定义的"三大组件"对象 + 结合刚创建"的自定义组件对象"来 将 XxxRegistrationBean对象 通过”配置类“的方式加入到 IOC容器中 )
      • 使用 "组件注册" 方式 "整合Servlet"
      • 使用 "组件注册" 方式 "整合Filter / 过滤器"
      • 使用 "组件注册" 方式 "整合Listener / 监听器"
    • 2. 使用 "路径扫描" 的方式 "整合Servlet三大组件" ( 就是通过 "注解" 的方式来"整合Servlet三大组件" )
      • 使用 "路径扫描 / 注解" 方式 "整合Servlet"
      • 使用 "路径扫描 / 注解" 方式 "整合Filter"
      • 使用 "路径扫描 / 注解" 方式 "整合Listene"

Spring Boot 整合 “Servlet三大组件” :

在这里插入图片描述

作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习!

该文章参考学习教材为:
《Spring Boot企业级开发教程》 黑马程序员 / 编著
文章以课本知识点 + 代码为主线,结合自己看书学习过程中的理解和感悟 ,最终成就了该文章

文章用于本人学习使用 , 同时希望能帮助大家。
欢迎大家点赞👍 收藏⭐ 关注💖哦!!!

(侵权可联系我,进行删除,如果雷同,纯属巧合)


  • 进行 Servlet开发时,通常首先自定义ServletFilter ( 过滤器 )、Listener ( 监听器 ) 三大组件,然后在文件 web.xml 中进行配置,而 Spring Boot 使用的是 内嵌式Servlet容器没有提供外部配置文件 web.xml ,那么Spring Boot是如何整合Servlet相关组件呢?
  • Spring Boot提供 了 ① 组件注册② 路径扫描两种方式整合Servlet三大组件 ( ServletFilterListener ),接下来将对分别对这
    两种整合方式进行详细讲解

1. 使用 “组件注册” 的方式 “整合Servlet三大组件” ( 实际操作为 : 创建自定义的"三大组件"对象 + 结合刚创建"的自定义组件对象"来 将 XxxRegistrationBean对象 通过”配置类“的方式加入到 IOC容器中 )

  • Spring Boot中,使用 组件注册 方式 整合内嵌Servlet容器ServletFilterListener三大组件时,只需这些 自定义组件 ( 即为自定义的“Servlet三大对象” ) 通过 ServletRegistrationBeanFilterRegistrationBeanServletListenerRegistrationBean类 注册容器 中即可。

使用 “组件注册” 方式 “整合Servlet”

  • 使用 “组件注册” 方式 “整合Servlet” :

    具体操作为 :

    自定义一个Servlet对象 ( 该对象用于 ServletRegistrationBean对象中 )

    通过 配置类的方式将ServletRegistrationBean对象 加入到IOC容器中,通过以上操作实现了 SpringBoot中整合 “Servlet”

在这里插入图片描述


MyServlet.java :

package com.myh.chapter_11.config;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 *  SpringBoot中通过“注册组件”的方式来整合Servlet三大组件
 *  即通过创建XxxRegistrationBean对象并将其加入到IOC容器中的方式来在SpringBoot中整合Servlet的三大组件
 */
@Component //加入到IOC容器中
public class MyServlet extends HttpServlet { //

    /*
     doGet()方法
    */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    /*
      dopost方法
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //当url访问该Servlet中的doPost()方法会执行方法体中的代码
        //客户端(如浏览器)向Servlet发送请求并收到响应时,它会看到响应的内容是 "hello MyServlet" 这个字符串。
        response.getWriter().write("hello MyServlet");
    }
}

ServletConfig.java :

package com.myh.chapter_11.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration //将该类标记为"配置类"
public class ServletConfig { //Serlvet配置类

    @Autowired
    private MyServlet myServlet;

    @Bean //将给方法的返回值对象加入到IOC容器中
    //在SpringBoot中注册XxxRegistrationBean组件/对象
    public ServletRegistrationBean getServlet() {
        /*
          /myServlet 这个请求映射到对应的Servlet对象上
         */
        ServletRegistrationBean servletRegistrationBean =
                new ServletRegistrationBean(myServlet,"/myServlet");
        return servletRegistrationBean;
    }
}

启动项目进行测试。项目启动成功后,在浏览器上访问 http://localhost:8080/mySerlvet , 效果如下图所示
在这里插入图片描述

上图可以看出,浏览器能访问/MyServlet正常显示数据,说明SpringBoot 成功整合Servlet组件

使用 “组件注册” 方式 “整合Filter / 过滤器”

  • 使用 “组件注册” 方式 “整合Filter” :

    具体操作为 :

    自定义一个Filter对象 ( 该对象用于 ServletRegistrationBean对象 中 )

    通过 配置类的方式将FilterRegistrationBean对象 加入到IOC容器中 ,通过以上操作实现了 SpringBoot中整合 “Filter”

在这里插入图片描述

MyFilter.java :

package com.myh.chapter_11.config;

import jakarta.servlet.*;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component //加入到IOC容器中
public class MyFilter implements Filter { //实现 Filter/过滤器接口

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    /**
     *  doFilter()方法在“请求处理之前”被执行,就是一个url请求,想到达doFilter()方法,再到达对应的Servlet组件的方法
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //对url请求进行过滤,url请求先在doFilter()方法中拦截,如被放行,才会接着去执行Servlet中的方法
        System.out.println("hello MyFilter");

        //将请求和响应对象传递给过滤器链中的下一个实体,这个实体可以是一个过滤器,或者是最终的Servlet或JSP页面
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    } //自定义“过滤器”/Filter类

}

ServletConfig.java :

package com.myh.chapter_11.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;

@Configuration //将该类标记为"配置类"
public class ServletConfig { //Serlvet配置类

    @Autowired
    private MyFilter myFilter;

    @Bean
    public FilterRegistrationBean getFilter() { //将Filter组件加入到IOC容器中
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(myFilter);
        //设置过滤器要过滤的url路径
        filterRegistrationBean.setUrlPatterns(Arrays.asList("/toLoginPage","/myFilter"));
        return filterRegistrationBean;
    }

}

上述代码中,使用 组件注册 方式 注册自定义MyFilter类。在 getFilter( MyFilter filter ) 方法中,使 setUrlPatterns(Arrays.asList(“/toLoginPage”,“/myFilter”)) 方法定义了 过滤的请求路径 为 “/toLoginPage”和“/myFilter’”。


启动项目项目启动成功后,在浏览器上访问 http://localhost:8080/myFilter 查看 控制台打印效果由于没有编写对应路径请求处理方法,所以浏览器会出现404错误页面,这里 重点关注控制台即可),具体如下图所示

在这里插入图片描述

从上图可以看出控制台中打印了自定义Filter中的输出语句 “hello MyFilter”,这说明 SpringBoot整合自定义Filter组件成功

使用 “组件注册” 方式 “整合Listener / 监听器”

  • 使用 “组件注册” 方式 “整合Listener” :

    具体操作为 :

    自定义一个Listener对象 ( 该对象用于 ServletListenerRegistrationBean对象 中 )

    通过 配置类的方式将 ServletListenerRegistrationBean对象 加入到IOC容器中 ,通过以上操作实现了 SpringBoot中整合 “Listener”

在这里插入图片描述

MyListener.java :

package com.myh.chapter_11.config;

import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import org.springframework.stereotype.Component;

@Component
public class MyListener implements ServletContextListener { //自定义的“监听器”/Listener 对象


    /*
     * contextInitialized()方法是Web应用程序启动时被执行。
     * 该方法的主要用途是对系统的全局变量、配置参数等进行初始化,确保系统在正常运行之前处于一个良好的状态
     */
    @Override
    public void contextInitialized(ServletContextEvent sce) { //该方法子啊web应用程序启动时被执行
        System.out.println("contextInitialized.....");
    }


    /**
     *  contextDestroyed()方法在web应用程序的"生命周期结束"时/ web应用程序“销毁”时被执行
     */
    @Override
    public void contextDestroyed(ServletContextEvent sce) { //该方法在web应用程序的"生命周期结束"时被执行
        System.out.println("contextInitialized.....");
    }
}

需要说明的是,Servlet容器提供了很多 Listener 接口,例如 ServletRequestListenerHtpSessionListenerServletContextListener 等,我们在自定义 Listener类时要根据自身需求选择实现对应接口


ServletConfig.java :

package com.myh.chapter_11.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;

@Configuration //将该类标记为"配置类"
public class ServletConfig { //Serlvet配置类

   
    @Autowired
    private MyListener myListener;

    @Bean
    public ServletListenerRegistrationBean getListener() {
        ServletListenerRegistrationBean servletListenerRegistrationBean =
                new ServletListenerRegistrationBean(myListener);
        return servletListenerRegistrationBean;
    }

}

完成自定义Listener组件注册启动项目,项目启动成功后查看控制合打印效果,效果 如下图所示程序启动成功后控制台打印自定义Listener组件 中定义的输出语句contextInitialized…
在这里插入图片描述

单击 IDEA 中的 Exit 按钮 关闭当前项目(注意,如果直接单击红色按钮强制关闭程序浏览器无法打印关闭监听信息),再次查看控制合打印效果,效果 如下图所示 ,程序成功关闭后,控制台打印出了自定义Listener组件中定义的输出语句 : contextInitialized… 通过效果演示。
在这里插入图片描述

通过上面的代码运行截图展示 :说明了 Spring Boot整合自定义Listener 组件成功


注意点

如果我们将自定义Servlet组件配置类ServletConfig 全部注释并重启项目后,自定义ServletFilterListener组件 “仍然生效”
出现这种情况主要原因 是:
嵌入式Servlet容器ServletFilterListener 组件 进行自动化识别和配置,而自定义ServletFilterListener
继承/实现 了对应的 /接口,同时自定义ServletFilterListener组件都使用了 @Component注解这些组件/对象自动扫描Spring组件


ServletRegistrationBeanFilterRegistrationBeanServletListenerRegistrationBean 这些组件组装配置根本目的 是对一些 请求路径参数进行 初始化设置组装 。假设没有组件注册类,那么自定义Servlet虽然生效无法确定哪个访问路径生效自定义Filter对所有的请求都进行过滤不会出现选择性过滤的情况。 而自定义的Listener没有太大影响,因为定制该组件基本不需要设置什么参数

2. 使用 “路径扫描” 的方式 “整合Servlet三大组件” ( 就是通过 “注解” 的方式来"整合Servlet三大组件" )

  • Spring Boot中,除了使用“组件注册”的方式来"整合Servlet三大组件" ,还可以使用 “路径扫描” 的方式 整合 内嵌式 Servlet容器ServletFilterListener 三大组件时。

  • 使用 “路径扫描" 的方式"整合Servlet三大组件具体操作 为:

    第一步、 在自定义ServletFilterListener 分别添加 : @WebServlet( )注解@WebFilter( )注解@WebListener( )注解

    第二步、在 项目主程序启动类上使用@ServletComponentScan注解 开启“组件扫描” / “注解扫描” 即可。

使用 “路径扫描 / 注解” 方式 “整合Servlet”

创建项目
在这里插入图片描述


MyServlet.Java

package com.myh.chapter_11.config;

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 org.springframework.stereotype.Component;

import java.io.IOException;

//通过注解的方式来在SpringBoot中“整合Servlet” ( 就是通过注解的方式来SpringBoot中能使用Servlet )
//将 /annotationMyServlet请求映射到该Servlet类中
@WebServlet("/annotationMyServlet")
public class MyServlet extends HttpServlet {

    /*
     doGet()方法
    */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    /*
      dopost方法
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //当url访问该Servlet中的doPost()方法会执行方法体中的代码
        //客户端(如浏览器)向Servlet发送请求并收到响应时,它会看到响应的内容是 "hello MyServlet" 这个字符串。
        response.getWriter().write("hello MyServlet(annotaion)");
    }
}

Chapter11Application.Java ( 项目主程序启动类 ):

package com.myh.chapter_11;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan //开启基于"注解方式"的"Servlet组件扫描"支持 ( 让整合Servlet的三大组件的注解生效 )
public class Chapter11Application {

    public static void main(String[] args) {
        SpringApplication.run(Chapter11Application.class, args);
    }

}

启动项目后,访问http://localhost:8080/annotationMyServlet效果如下所示 ,表示用”路径扫描“的方式 成功整合了Servlet

在这里插入图片描述

使用 “路径扫描 / 注解” 方式 “整合Filter”

创建项目
在这里插入图片描述


MyFilter.Java

package com.myh.chapter_11.config;

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import org.springframework.stereotype.Component;

import java.io.IOException;

//通过注解的方式来在SpringBoot中“整合Filter” ( 就是通过注解的方式来SpringBoot中能使用Filter )
//将 /annotationMyFilter 和 /annotationLogin 请求映射到该 该Filter(过滤器)类中
@WebFilter(value = {"/annotationMyFilter","/annotationLogin"})
public class MyFilter implements Filter { //实现 Filter/过滤器接口

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    /**
     *  doFilter()方法在“请求处理之前”被执行,就是一个url请求,想到达doFilter()方法,再到达对应的Servlet组件的方法
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //对url请求进行过滤,url请求先在doFilter()方法中拦截,如被放行,才会接着去执行Servlet中的方法
        System.out.println("hello MyFilter(annotaion)");

        //将请求和响应对象传递给过滤器链中的下一个实体,这个实体可以是一个过滤器,或者是最终的Servlet或JSP页面
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    } //自定义“过滤器”/Filter类

}

Chapter11Application.Java ( 项目主程序启动类 ):

package com.myh.chapter_11;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan //开启基于"注解方式"的"Servlet组件扫描"支持 ( 让整合Servlet的三大组件的注解生效 )
public class Chapter11Application {

    public static void main(String[] args) {
        SpringApplication.run(Chapter11Application.class, args);
    }

}

启动项目后,访问http://localhost:8080/annotationMyFilter效果如下所示 ,表示用”路径扫描“的方式 成功整合了Filter

在这里插入图片描述

使用 “路径扫描 / 注解” 方式 “整合Listene”

创建项目
在这里插入图片描述


MyListener.Java

package com.myh.chapter_11.config;

import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import jakarta.servlet.annotation.WebListener;
import org.springframework.stereotype.Component;

//通过注解的方式来在SpringBoot中“整合Listener” ( 就是通过注解的方式来SpringBoot中能使用Listener )
//在web应用程序启动时会执行 contextInitialized()方法 , web应用程序结束/销毁后会执行contextDestroyed()方法
@WebListener
public class MyListener implements ServletContextListener { //自定义的“监听器”/Listener 对象


    /*
     * contextInitialized()方法是Web应用程序启动时被执行。
     * 该方法的主要用途是对系统的全局变量、配置参数等进行初始化,确保系统在正常运行之前处于一个良好的状态
     */
    @Override
    public void contextInitialized(ServletContextEvent sce) { //该方法子啊web应用程序启动时被执行
        System.out.println("contextInitialized.....(annotaion)");
    }


    /**
     *  contextDestroyed()方法在web应用程序的"生命周期结束"时/ web应用程序“销毁”时被执行
     */
    @Override
    public void contextDestroyed(ServletContextEvent sce) { //该方法在web应用程序的"生命周期结束"时被执行
        System.out.println("contextInitialized.....(annotaion)");
    }
}

Chapter11Application.Java ( 项目主程序启动类 ):

package com.myh.chapter_11;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan //开启基于"注解方式"的"Servlet组件扫描"支持 ( 让整合Servlet的三大组件的注解生效 )
public class Chapter11Application {

    public static void main(String[] args) {
        SpringApplication.run(Chapter11Application.class, args);
    }

}

启动项目后,访问http://localhost:8080/annotationMyFilter效果如下所示 ,表示用”路径扫描“的方式 成功整合了Listene

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

sparkSql join 关联机制

💐💐扫码关注公众号,回复 spark 关键字下载geekbang 原价 90 元 零基础入门 Spark 学习资料💐💐 join 实现机制 Join 有 3 种实现机制,分别是 NLJ(Nested Loop Join)、SMJ&#xf…

【VUE】使用Vue和CSS动画创建滚动列表

使用Vue和CSS动画创建滚动列表 在这篇文章中,我们将探讨如何使用Vue.js和CSS动画创建一个动态且视觉上吸引人的滚动列表。这个列表将自动滚动显示项目,类似于轮播图的方式,非常适合用于仪表盘、排行榜或任何需要在有限空间内展示项目列表的应…

【Altium Designer 20 笔记】隐藏PCB上的信号线(连接线)

使用网络类隐藏特定类型的信号线 如果你想要隐藏特定类型的信号线(例如电源类),你可以首先创建一个网络类。使用快捷键DC调出对象类浏览器,在Net Classes中右击添加类,并重命名(例如为“Power”&#xff0…

【Qt 学习笔记】QWidget的geometry属性及window frame的影响

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ QWidget的geometry属性 文章编号:Qt 学习笔记 / 16 文章目…

spring boot学习第十七篇:OAuth2概述及使用GitHub登录第三方网站

0. 导言 我们在浏览器上可以访问成百上千个网站,使用每个网站的服务一般都要先注册账号,那么我们为了更好地记忆,一般都会在多个网站使用相同的账号和密码进行注册。那么问题就来了,如果在你注册的网站中有某些个网站的系统设计不…

C++进阶03 模板与群体数据

听课笔记简单整理,供小伙伴们参考~🥝🥝 第1版:听课的记录代码~🧩🧩 编辑:梅头脑🌸 审核:文心一言 目录 🐳课程来源 🐋模板 🐋8.…

小区烟火AI检测/楼道杂物堆积消防隐患AI智能识别方案

一、背景需求 据新闻报道,今年4月7日,安徽省合肥市肥东县一民房发生火灾,致1死11伤,起火点是“一楼楼道杂物间”。 因为小区居民楼楼道堆积大量杂物而导致的消防火灾事故也不在少数。楼道堆积杂物是一个长期存在的问题&#xff…

安装ODBC方法

1、运行 搜索 ODBC数据源管理程序 32位或者 64位 2、在用户DSN或者系统DSN选择添加(建议前者),此处以添加access数据库的odbc驱动为例 3、安装成功

2024妈妈杯数学建模A 题思路分析-移动通信网络中 PCI 规划问题

# 1 赛题 A 题 移动通信网络中 PCI 规划问题 物理小区识别码(PCI)规划是移动通信网络中下行链路层上,对各覆盖 小区编号进行合理配置,以避免 PCI 冲突、 PCI 混淆以及 PCI 模 3 干扰等 现象。 PCI 规划对于减少物理层的小区间互相干扰(ICI),增…

jenkins通过pipeline部署springboot项目

部署方案: 1、springboot项目不保存部署的pipeline或dockerfile构建脚本等与部署相关的问文件,业务项目只需关心业务,能够正常构建为jar包即可 2、新建一个代码仓库,用于保存项目需要构建的Jenkinsfile 3、jenkins配置pipeline地址…

Element ui 动态展示表格列,动态格式化表格列的值

需求 后台配置前端展示的表格列,遇到比如 文件大小这样的值,如果后台存的是纯数字,需要进行格式化展示,并且能控制显示的小数位数,再比如,部分列值需要加单位等信息,此外还有状态类&#xff0…

【心路历程】初次参加蓝桥杯实况

送给大家一句话: 寂静的光辉平铺的一刻,地上的每一个坎坷都被映照得灿烂。 – 史铁生 《我与地坛》 初次参加蓝桥杯有感 一点小小的震撼难评的做题过程A题 艺术与篮球问题描述解题 B 题 五子棋问题描述解题 C题 训练士兵问题描述解题 D题 团建解题 E题 …

基于SpringBoot+Vue的毕业设计管理系统(源码+文档+部署+讲解)

一.系统概述 二十一世纪我们的社会进入了信息时代,信息管理系统的建立,大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多,而在线管理系统刚好能满足这些需求,在线管理系统突破了传统管理方式的局限性。于是本文针…

【前端】layui table表格勾选事件,以及常见模块

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《前端》系列文章,每篇文章将以博主理解的角度展开讲解, 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 表格勾选事…

接口测试-Mock测试方法详解

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、关于Mock测试 1、什么是Mock测试? Mock 测试就是在测试过程中,对于…

Vue3整合wangEditor(富文本编辑器框架) 以及提供存储渲染方案

目录 概述 Vue3整合wagnEditor 图片的上传 图片的删除 文章存储 文章渲染 概述 实现功能:管理端使用富文本编辑器编写文章内容,将编辑好的文章存入数据库或服务器中,前端应用读取存储的文章内容作展示。 本文章能提供 ①Vue3整合wangEdi…

一款免费、开源、可批量识别的离线OCR软件,适用于 Windows7 x64及以上平台

免费:本项目所有代码开源,完全免费。方便:解压即用,离线运行,无需网络。高效:自带高效率的离线OCR引擎,内置多种语言识别库。灵活:支持命令行、HTTP接口等外部调用方式。功能&#x…

Android开发——控件

目录 TextView 注意: ​编辑带阴影的textview:(一般用于给字体添加属性) ​编辑 跑马灯效果的textview​编辑 Button (前几个常用) Botton事件处理 EditText (文本框) 如何获取文本框里面的内容…

统计学习方法概述

一、引言 随着AI的曙光逐渐普照IT界,众多曾经高深莫测的人工智能术语与理念,如监督学习、算法模型、回归分析等,已悄然融入广大信息技术人员的知识体系之中。老猿是个很传统的IT人,虽未深究这些新兴知识的精髓,却也在…

从零开始编写一个cmake构建脚本

简介 本文档介绍cmake构建脚本编写,包含的一些主要元素和命名规范。 cmake构建脚本编写步骤 cmake构建工具版本要明确 # 命令名字要小写,这条语句要求构建工具至少需要版本为3.12或以上 cmake_minimum_required (VERSION 3.12)工程名及库的版本号明确…