【JavaWeb】Servlet详解

news2025/7/22 23:45:38

文章目录

  • 1. 前置知识
  • 2.servlet生命周期
    • 2.1 默认情况下,服务器启动时,servlet对象并没有被创建
    • 2.2 用户执行一次请求
    • 2.3用户执行第二次请求
    • 2.4 3,4,5,6....次请求
    • 2.5 关闭服务器
  • 3.servlet方法解析
  • 4.适配器模式改造servlet
    • 4.1不使用servlet模式
    • 4.2使用适配器模式
  • 5.GenericServlet
  • 6.ServletConfig详解
  • 7.ServletConfig接口有四个方法
  • 8.ServletContext
  • 9.HttpServlet

1. 前置知识

  • 服务器启动时,servlet对象是否被创建出来?
package com.sdnu.javaweb;

import jakarta.servlet.*;

import java.io.IOException;

/**
 * 实现servlet接口
 *
 * @author Beyong
 * @date 2023/03/03 20:44
 **/
public class AServlet implements Servlet {
    public AServlet() {
        System.out.println("A的无参构造方法");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}
package com.sdnu.javaweb;

import jakarta.servlet.*;

import java.io.IOException;

/**
 * 实现Servlet
 *
 * @author Beyong
 * @date 2023/03/03 20:49
 **/
public class BServlet implements Servlet {
    public BServlet() {
        System.out.println("B的无参构造方法");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>aServlet</servlet-name>
        <servlet-class>com.sdnu.javaweb.AServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>aServlet</servlet-name>
        <url-pattern>/a</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>bServlet</servlet-name>
        <servlet-class>com.sdnu.javaweb.BServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>bServlet</servlet-name>
        <url-pattern>/b</url-pattern>
    </servlet-mapping>
</web-app>

在这里插入图片描述
在控制台发现没有执行构造方法,说明服务器启动的时候,构造方法没有执行。

  • 如何使得服务器启动的时候,创建servlet对象
    在这里插入图片描述
    在代码中添加
<load-on-startup>数字</load-on-startup>

数字越小,则优先级越高。

2.servlet生命周期

package com.sdnu.javaweb;

import jakarta.servlet.*;

import java.io.IOException;

/**
 * 实现servlet接口
 *
 * @author Beyong
 * @date 2023/03/03 20:44
 **/
public class AServlet implements Servlet {
    public AServlet() {
        System.out.println("A的无参构造方法");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("AServlet'init method execute");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("AServlet'service method execute");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("AServlet'destroy method execute ");
    }
}

2.1 默认情况下,服务器启动时,servlet对象并没有被创建

2.2 用户执行一次请求

在这里插入图片描述
结论:

  • 用户在第一次请求的时候,Servlet对象被实例化,AServlet的构造方法被执行,并且执行的是无参构造。
  • AServlet对象被创建出来后,AServlet马上执行init方法
  • 第一次请求时,init方法执行后,马上执行service方法

2.3用户执行第二次请求

控制台输出:

AServlet’service method execute

2.4 3,4,5,6…次请求

后面的请求,Servlet对象并没有创建,而是使用之前的创建好的Servlet对象,调用该对象的方法。

  • servlet对象是单例的,但是servlet类不符合单例模式(假单例)。

  • 无参构造方法只执行一次,init方法也只执行一次,即第一次。

  • 只要用户发送请求,service必然执行。

2.5 关闭服务器

在这里插入图片描述
服务器在关闭前,执行servlet对象的destroy方法,destroy方法执行结束后,AServlet对象的才会被销毁,AServlet对象内存才会释放。

3.servlet方法解析

  • 构造方法
    javaweb不建议手动编写构造方法,因为手动编写构造方法容易导致错误,所以init方法很有必要。
  • init
    很少有,使用在初始化的时候,使用初始化数据连接池,线程池。
  • service
    一定要有,处理用户的请求。
  • destroy
    进行资源关闭。

4.适配器模式改造servlet

4.1不使用servlet模式

接口

package com.sdnu.javaweb.adapter;

/**
 * 接口
 * @author Beyong
 * @date 2023/03/04 11:08
 **/
public interface MyInterface {
    void m1();
    void m2();
    void m3();
    void m4();
    void m5();
    void m6();
    void m7();
    void core();
}

UserService:

package com.sdnu.javaweb.adapter;

/**
 * 用户
 *
 * @author Beyong
 * @date 2023/03/04 11:10
 **/
public class UserService implements MyInterface{
    @Override
    public void m1() {

    }

    @Override
    public void m2() {

    }

    @Override
    public void m3() {

    }

    @Override
    public void m4() {

    }

    @Override
    public void m5() {

    }

    @Override
    public void m6() {

    }

    @Override
    public void m7() {

    }

    @Override
    public void core() {
        System.out.println("UserService'core method execute!!!");
    }
}

CustomerService:

package com.sdnu.javaweb.adapter;

/**
 * CustomerService
 *
 * @author Beyong
 * @date 2023/03/04 11:13
 **/
public class CustomerService implements MyInterface{
    @Override
    public void m1() {

    }

    @Override
    public void m2() {
        System.out.println("Customer'm2 method execute");
    }

    @Override
    public void m3() {

    }

    @Override
    public void m4() {

    }

    @Override
    public void m5() {

    }

    @Override
    public void m6() {

    }

    @Override
    public void m7() {

    }

    @Override
    public void core() {

    }
}

不使用适配器模式下,则代码每一个service都要取实现接口。

4.2使用适配器模式

接口:

package com.sdnu.javaweb.adapter2;

/**
 * 接口
 * @author Beyong
 * @date 2023/03/04 11:24
 **/
public interface MyInterface {
    void m1();
    void m2();
    void m3();
    void m4();
    void m5();
    void m6();
    void m7();
    void core();
}

用户适配器:

package com.sdnu.javaweb.adapter2;

/**
 * UserService适配器
 *
 * @author Beyong
 * @date 2023/03/04 11:26
 **/
public abstract class UserAdapter implements MyInterface{
    @Override
    public void m1() {

    }

    @Override
    public void m2() {

    }

    @Override
    public void m3() {

    }

    @Override
    public void m4() {

    }

    @Override
    public void m5() {

    }

    @Override
    public void m6() {

    }

    @Override
    public void m7() {

    }

    public abstract void core();
}

顾客适配器:

package com.sdnu.javaweb.adapter2;

/**
 * 客户适配器
 *
 * @author Beyong
 * @date 2023/03/04 11:28
 **/
public abstract class CustomerAdapter implements MyInterface{

    public abstract void m1();

    @Override
    public void m2() {

    }

    @Override
    public void m3() {

    }

    @Override
    public void m4() {

    }

    @Override
    public void m5() {

    }

    @Override
    public void m6() {

    }

    @Override
    public void m7() {

    }

    @Override
    public void core() {

    }
}

用户:

package com.sdnu.javaweb.adapter2;

/**
 * 普通用户
 *
 * @author Beyong
 * @date 2023/03/04 11:34
 **/
public class UserService extends UserAdapter{
    @Override
    public void core() {

    }
}

顾客:

package com.sdnu.javaweb.adapter2;

/**
 * 顾客
 *
 * @author Beyong
 * @date 2023/03/04 11:35
 **/
public class CustomerService extends CustomerAdapter{
    @Override
    public void m1() {

    }
}

5.GenericServlet

我们写一个通用的GenericServlet

package com.sdnu.javaweb.servlet;

import jakarta.servlet.*;

import java.io.IOException;

/**
 * servlet适配器
 *
 * @author Beyong
 * @date 2023/03/04 11:48
 **/
public abstract class GenericServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    
    public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse);

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

LoginServlet

package com.sdnu.javaweb.servlet;

import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;

/**
 * c的servlet
 *
 * @author Beyong
 * @date 2023/03/04 11:49
 **/
public class LoginServlet extends GenericServlet{
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) {
        System.out.println("c'service method execute");
    }
}

web.xml

    <servlet>
        <servlet-name>loginServlet</servlet-name>
        <servlet-class>com.sdnu.javaweb.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>loginServlet</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>

地址:http://127.0.0.1:8080/lifecycle/login
在这里插入图片描述

进一步改造:

package com.sdnu.javaweb.servlet;

import jakarta.servlet.*;

import java.io.IOException;

/**
 * servlet适配器
 *
 * @author Beyong
 * @date 2023/03/04 11:48
 **/
public abstract class GenericServlet implements Servlet {
    private ServletConfig config;

    @Override
    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }

    /**
     * 这个init方法供子类重写
     */
    public void init(){

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException;

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

6.ServletConfig详解

  • 什么是ServletConfig
    ServletConfig是Servlet规范中的一员。
  • Tomcat实现了ServletConfig接口
  • 一个Servlet对应一个ServletConfig
  • Servlet对象是Tomcat创建的,同时创建了ServletConfig.
  • 创建一个Servelt对象,就有一个ServletConfig(Servlet对象信息)。
  • Tomcat解析web.xml文件,将web.xml文件中
 <servlet></servlet>

标签中的配置信息自动包装到ServletConfig对象中去。

  • ServletConfjg有哪些方法?
    getInitParameterNames
    getInitParameter
package com.sdnu.javaweb.servlet;

import jakarta.servlet.*;
import sun.plugin2.util.ParameterNames;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

/**
 * servletConfig测试2
 *
 * @author Beyong
 * @date 2023/03/06 13:05
 **/
public class ConfigServletTest2 extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        servletResponse.setContentType("text/html");
        PrintWriter out = servletResponse.getWriter();
        ServletConfig config = this.getServletConfig();
        out.print("servletConfig对象是:" + config.toString());
        out.print("</br>");

        String servletName = config.getServletName();
        out.print("<servlet>" + servletName + "</servlet>");
        out.print("</br>");

        Enumeration<String> initParameterNames = config.getInitParameterNames();
        while(initParameterNames.hasMoreElements()){
            String parameterName = initParameterNames.nextElement();
            String parameterVal = config.getInitParameter(parameterName);
            out.print(parameterName + "=" + parameterVal);
            out.print("<br>");
        }
        String driver = config.getInitParameter("driver");
        out.print(driver);
        
//        Enumeration<String> names = this.getInitParameterNames();
//        while(names.hasMoreElements()){
//            String name = names.nextElement();
//            String value = this.getInitParameter(name);
//            out.print(name + " = " + value);
//            out.print("<br>");
//        }
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>configTest</servlet-name>
        <servlet-class>com.sdnu.javaweb.servlet.ConfigServletTest</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>configTest</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>configTest2</servlet-name>
        <servlet-class>com.sdnu.javaweb.servlet.ConfigServletTest2</servlet-class>
        <init-param>
            <param-name>driver</param-name>
            <param-value>com.mysql.cj.jdbc.Driver</param-value>
        </init-param>
        <init-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql://localhost:3306/sdnu</param-value>
        </init-param>
        <init-param>
            <param-name>user</param-name>
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>root123</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>configTest2</servlet-name>
        <url-pattern>/test2</url-pattern>
    </servlet-mapping>
</web-app>

7.ServletConfig接口有四个方法

  • public String getInitParameter(String name);
  • public Enumeration getInitParameterNames();
  • public ServletContext getServletContext();
  • public String getServletName();
    以上四个方法可以在自己编写的Servlet类中使用this调用,这个Servlet继承了GenericServlet

8.ServletContext

  • ServletContext是接口,是Servlet规范的一员。
  • Tomcat实现了ServletContext接口。
  • ServletContext是服务器创建的,在服务器启动的时候创建,在服务器关闭的时候销毁,对于一个WebApp来说,ServletContext只有一个。
  • ServletContext对象对应整个web.xml。
  • ServletContext接口的方法:
    (1)
Enumeration<String> initParameterNames = application.getInitParameterNames();
String value = application.getInitParameter(name);

以上两个方法获取context-param标签中的name和value

    <context-param>
        <param-name>startIndex</param-name>
        <param-value>2</param-value>
    </context-param>

(2获取应用的根路径

String contextPath = application.getContextPath();

在这里插入图片描述
(3)获取文件的绝对路径

public String getRealPath(String path)

(4)访问日志

public void log(String message);
public void log(String message, Throwable t);

Tomcat服务器的Log目录下都有哪些日志信息?

catalina.2023-02-28.log 服务器的java程序运行的控制信息
localhost.2023-03-07.log ServletContext对象的log方法记录的日志存储到这个文件中
localhost_access_log.2023-02-28.txt 访问日志

  • ServletContext又叫应用域,放到ServletContext中的数据一般是数据量小,所以用户共享的,不经常修改的。

存:public void setAttribute(String name, Object value);
取:public void getAttribute(String name);
删:public void removeAttribute(String name);

User user = new User("jack", "123456");
application.setAttribute("UserObj", user);
Object userObj = application.getAttribute("UserObj");
out.print(userObj);
out.print("</br>");

9.HttpServlet

jakarta.servlet.Servlet 【接口】
jakarta.servlet.GenericServlet implements Servlet 【抽象类】
jakarta.servlet.http.HttpServlet extends GenericServlet 【类】

以后编写程序继承HttpServlet

在这里插入图片描述

作者:Beyong    
出处:Beyong博客
github地址:https://github.com/beyong2019

本博客中未标明转载的文章归作者Beyong有,欢迎转载,但未经作者同意必须保留此段声明,且在文章明显位置给出原文连接,否则保留追究法律责任的权利。

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

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

相关文章

【微服务】(十五)—— Seata 的部署和集成

文章目录1. 部署Seata的tc-server1.1 下载Seata1.2 解压1.3 修改配置1.4 在nacos添加配置1.5 创建数据库表1.6 启动TC服务2. 微服务集成seata2.1 引入依赖2.2 修改配置文件3. TC服务的高可用和异地容灾3.1 模拟异地容灾的TC集群3.2 将事务组映射配置到nacos3.3 微服务读取nacos…

软测入门(八)Selenium项目实战

自动化项目实战 项目计划设计 测试计划测试范围设定目标规划活动 实际项目中&#xff0c;需要根据项目的实际情况创建自己的项目计划&#xff0c;没有固定的格式和内容要求&#xff1a; 项目简介自动化实现网上购票项目启动前置条件1.购票网站工作正常 2.自动化测试环境准备…

JAVA的16 个实用代码优化小技巧

一、类成员与方法的可见性最小化 举例&#xff1a;如果是一个private的方法&#xff0c;想删除就删除。 如果一个public的service方法&#xff0c;或者一个public的成员变量&#xff0c;删除一下&#xff0c;不得思考很多。 二、使用位移操作替代乘除法 计算机是使用二进制…

垒骰子(爆搜/DP)

动态规划方格取数垒骰子方格取数 题目描述 设有 NNN \times NNN 的方格图 (N≤9)(N \le 9)(N≤9)&#xff0c;我们将其中的某些方格中填入正整数&#xff0c;而其他的方格中则放入数字 000。如下图所示&#xff08;见样例&#xff09;: A0 0 0 0 0 0 0 00 0 13 0 …

ChatGPT助力校招----面试问题分享(一)

1 ChatGPT每日一题&#xff1a;期望薪资是多少 问题&#xff1a;面试官问期望薪资是多少&#xff0c;如何回答 ChatGPT&#xff1a;当面试官问及期望薪资时&#xff0c;以下是一些建议的回答方法&#xff1a; 1、调查市场行情&#xff1a;在回答之前&#xff0c;可以先调查一…

Python基础之while循环

一&#xff1a;while语法 while 条件:代码1 代码2 代码3....while的运行步骤&#xff1a; 步骤1&#xff1a;如果条件为真&#xff0c;那么依次执行&#xff1a;代码1、代码2、代码3、...... 步骤2&#xff1a;执行完毕后再次判断条件,如果条件为True则再次执行&#…

通用缓存存储设计实践

目录介绍 01.整体概述说明 1.1 项目背景介绍1.2 遇到问题记录1.3 基础概念介绍1.4 设计目标1.5 产生收益分析 02.市面存储方案 2.1 缓存存储有哪些2.2 缓存策略有哪些2.3 常见存储方案2.4 市面存储方案说明2.5 存储方案的不足 03.存储方案原理 3.1 Sp存储原理分析3.2 MMKV存储…

【数据挖掘】4、关联分析:Apriori、FP-Growth 算法、买面包是否也爱买啤酒

文章目录一、概念1.1 支持度1.2 置信度1.3 提升度二、Apriori 算法2.1 频繁项集的定义2.2 算法工作原理三、FP-Growth 算法3.1 算法步骤3.1.1 创建项头表3.1.2 构造 FP 树3.1.3 通过 FP 树挖掘频繁项集3.2 手动推导3.2.1 计算单一项的频率&#xff08;支持度计数&#xff09;3.…

shusheng007编程手记

[版权申明] 非商业目的注明出处可自由转载 出自&#xff1a;shusheng007 文章目录概述工具篇IntelliJ IDEA在Idea中下载源码时&#xff0c;报无法下载源码PostmanPost请求被识别成Get请求Linux开启关闭防火墙开放端口关闭端口如何修复磁盘Nginx如何使用docker来安装Nginx概述 …

VMware虚拟网络编辑桥接/NAT/仅主机模式详解

VMware虚拟网络编辑 安装VMware后 默认虚拟网络设置&#xff1a; VMnet0&#xff1a;桥接模式 VMnet1&#xff1a;仅主机 VMnet8&#xff1a;NAT模式 可以打开VMware的虚拟网络适配器查看 NAT模式 NAT模式借助虚拟NAT设备和虚拟DHCP服务器&#xff0c;使得虚拟机可以联网…

掌握Swagger3自动化生成接口文档完成后端提效

文章目录OpenApi规范Swagger3快速上手Swagger3使用Swagger3.x常用注解讲解和配置Api 模块配置ApiOperation 接口配置ApiParam 方法参数配置ApiIgnore 忽略此接口ApiModel()和ApiModelProperty()ApiResponse描述接口响应注意可能出现的问题OpenApi规范 开放API规范&#xff08;…

Java内存屏障简介

简介 内存屏障是插入两个CPU命令之间的命令&#xff0c;禁止处理器命令的重新排序(如屏障)&#xff0c;以确保有序性。此外&#xff0c;为了达到屏障的效果&#xff0c;在处理器写入、读取值之前&#xff0c;将主机的值写入缓存&#xff0c;清空无效的队列&#xff0c;保障可见…

C++函数重载及其背后的原理

写在前面 先说说我的状态吧&#xff0c;五一假期五天假&#xff0c;这些天都在玩&#xff0c;很少学习&#xff0c;我不是后悔&#xff0c;也没必要&#xff0c;本来假期就是为了让自己放松.我唯一要反思看到别人在学,我心里也想学但是却做不到,这是我的缺点,后面我会克服的.尽…

运维提质增效,有哪些办法可以做

凡是代码&#xff0c;难免有 bug。 开发者们的日常&#xff0c;除了用一行行代码搭产品外&#xff0c;便是找出代码里的虫&#xff0c;俗称 debug。 随着移动互联网的快速发展&#xff0c;App 已经成为日常生活中不可或缺的一部分。但是在开发者/运维人员的眼里简直就是痛苦的…

使用R语言包clusterProfiler做KEGG富集分析时出现的错误及解决方法

使用enrichKEGG做通路富集分析时&#xff0c;一直报错&#xff1a;显示No gene can be mapped....k <- enrichKEGG(gene gene, organism "hsa", pvalueCutoff 1, qvalueCutoff 1)但是之前用同样的基因做分析是能够成功地富集到通路&#xff0c;即便是网上的数据…

Appium+Python连接真机、跳过登录页、Unexpected error while obtaining UI hierarchy问题

Appium连接真机 使用数据线连接电脑&#xff0c;然后选择文件传输方式 打开手机设置拉至底部&#xff0c;点击关于手机&#xff0c;连续点击7次版本号打开开发者模式 点击设置中的系统与更新&#xff0c;找到开发者选项----> 打开USB调试即可 在终端中输入adb devices确定…

c语言经典例题-数组的使用

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 选择法排序&#xff1a; 题目&#xff1a; 本关任务&#xff1a;使用选择法排序&#xff08;http://t.csdn.cn/…

统计学 一元线性回归

统计学 一元线性回归 回归&#xff08;Regression&#xff09;&#xff1a;假定因变量与自变量之间有某种关系&#xff0c;并把这种关系用适当的数学模型表达出来&#xff0c;利用该模型根据给定的自变量来预测因变量 线性回归&#xff1a;因变量和自变量之间是线性关系 非线…

看板组件:Bryntum Task Board JS 5.3.0 Crack

一个超级灵活的看板组件&#xff0c;Bryntum Task Board 是一个灵活的看板 Web 组件&#xff0c;可帮助您可视化和管理您的工作。 功能丰富 任务板非常灵活&#xff0c;允许您完全自定义卡片、列和泳道的渲染和样式。借助丰富的 API&#xff0c;您甚至可以在运行时打开或关闭功…

MSE 诊断利器上线

作者&#xff1a;子葵 背景 在日常开发和生产环境中&#xff0c;可能会遇到由于网络或者其他因素导致客户端连接 MSE 集群出现异常&#xff0c;此时需要排查集群以及客户端状态&#xff0c;通常需要通过文档查询对应的异常解释来定位问题&#xff0c;排查问题的链路比较长&am…