当前位置: 首页 > news >正文

【JavaWeb】Servlet详解

文章目录

  • 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的无参构造方法");}@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {}@Overridepublic String getServletInfo() {return null;}@Overridepublic 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的无参构造方法");}@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {}@Overridepublic String getServletInfo() {return null;}@Overridepublic 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的无参构造方法");}@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("AServlet'init method execute");}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("AServlet'service method execute");}@Overridepublic String getServletInfo() {return null;}@Overridepublic 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{@Overridepublic void m1() {}@Overridepublic void m2() {}@Overridepublic void m3() {}@Overridepublic void m4() {}@Overridepublic void m5() {}@Overridepublic void m6() {}@Overridepublic void m7() {}@Overridepublic 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{@Overridepublic void m1() {}@Overridepublic void m2() {System.out.println("Customer'm2 method execute");}@Overridepublic void m3() {}@Overridepublic void m4() {}@Overridepublic void m5() {}@Overridepublic void m6() {}@Overridepublic void m7() {}@Overridepublic 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{@Overridepublic void m1() {}@Overridepublic void m2() {}@Overridepublic void m3() {}@Overridepublic void m4() {}@Overridepublic void m5() {}@Overridepublic void m6() {}@Overridepublic 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();@Overridepublic void m2() {}@Overridepublic void m3() {}@Overridepublic void m4() {}@Overridepublic void m5() {}@Overridepublic void m6() {}@Overridepublic void m7() {}@Overridepublic void core() {}
}

用户:

package com.sdnu.javaweb.adapter2;/*** 普通用户** @author Beyong* @date 2023/03/04 11:34**/
public class UserService extends UserAdapter{@Overridepublic void core() {}
}

顾客:

package com.sdnu.javaweb.adapter2;/*** 顾客** @author Beyong* @date 2023/03/04 11:35**/
public class CustomerService extends CustomerAdapter{@Overridepublic 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 {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse);@Overridepublic String getServletInfo() {return null;}@Overridepublic 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{@Overridepublic 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;@Overridepublic void init(ServletConfig config) throws ServletException {this.config = config;this.init();}/*** 这个init方法供子类重写*/public void init(){}@Overridepublic ServletConfig getServletConfig() {return null;}public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException;@Overridepublic String getServletInfo() {return null;}@Overridepublic 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 {@Overridepublic 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有,欢迎转载,但未经作者同意必须保留此段声明,且在文章明显位置给出原文连接,否则保留追究法律责任的权利。

相关文章:

【JavaWeb】Servlet详解

文章目录1. 前置知识2.servlet生命周期2.1 默认情况下&#xff0c;服务器启动时&#xff0c;servlet对象并没有被创建2.2 用户执行一次请求2.3用户执行第二次请求2.4 3,4,5,6....次请求2.5 关闭服务器3.servlet方法解析4.适配器模式改造servlet4.1不使用servlet模式4.2使用适配…...

谁是世界上最好的编程语言?--编程语言70年浅谈

1、编程语言发展史纵览 严谨起见&#xff0c;本文提到的编程语言指的是「第三代高级编程语言」。 首先&#xff0c;我们从时间维度入手聊聊编程语言。一图胜千言&#xff0c;我们从目前主流的编程语言中&#xff0c;挑选出流行的、具有历史影响力的语言。把它们按时间从上往下…...

Webpack前端资源加载/打包工具

文章目录一、Webpack1、什么是Webpack2、Webpack安装2.1全局安装2.2安装后查看版本号3、创建项目3.1初始化项目3.2创建src文件夹3.3 src下创建common.js3.4 src下创建utils.js3.5 src下创建main.js4、JS打包4.1创建配置文件4.2执行编译命令4.3创建入口页面4.4测试5、CSS打包5.1…...

springcloud3 fegin实现服务调用1

一 Fegin的作用 1.1 fegin的作用 fegin是一个声明式的web服务客户端&#xff0c;让编写web服务器客户端变得非常容易&#xff0c;只需创建一个接口并在接口中添加FeginClients注解即可。 Fegin的使用方式&#xff1a;使用fegin的注解定义接口&#xff0c;调用这个接口&#…...

专业版即将支持自定义场景测试

物联网 MQTT 测试云服务 XMeter Cloud 专业版于 2022 年底上线后&#xff0c;已有不少用户试用&#xff0c;对数千甚至上万规模的 MQTT 并发连接和消息吞吐场景进行测试。同时我们也收到了希望支持更多物联网协议测试的需求反馈。 新年伊始&#xff0c;XMeter 团队全力聚焦于 …...

Process Monitor工具使用实验(23)

实验目的 学习Process Monitor实用小工具的使用&#xff0c;学会利用Process Monitor工具观察程序进程/线程、文件系统、注册表、网络连接等的活动。预备知识 Process Monitor是一个Windows系统下先进的监视工具&#xff0c;它可以显示文件系统、注册表、网络连接、进程…...

钓鱼客服到拿下服务器全过程(重点在于钓鱼添加img src)

重点总结 钓鱼时主动在变量中添加了字段&#xff0c;等待用户点击获取ip信息进行下一步资金盘plus呢 左看右看没啥东西&#xff0c;看看客服系统能不能打xss。 吊毛客服居然不在线&#xff0c;这套客服系统见过是whisper&#xff0c;之前审计过没有存储xss 但能通过伪造图片…...

【C++】list迭代器的深度剖析及模拟实现(感受类封装,类和对象的思想)

早点睡兄弟&#xff0c;别一天到晚就熬夜。 文章目录一、通过list迭代器来感受类和对象以及类封装的思想1.迭代器的特征和本质是什么&#xff1f;&#xff08;两大特征&#xff1a;类的内嵌类型&#xff0c;行为像指针。本质&#xff1a;内置类型定义的变量或自定义类型实例化…...

JavaScript 语句、注释和代码块实例集合

文章目录JavaScript 语句、注释和代码块实例集合JavaScript 语句JavaScript 代码块JavaScript 单行注释JavaScript 多行注释使用单行注释来防止执行使用多行注释来防止执行JavaScript 语句、注释和代码块实例集合 JavaScript 语句 源码 <!DOCTYPE html> <html> &…...

华为机试题:HJ103 Redraiment的走法(python)

文章目录&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;Python3实现&#xff08;3&#xff09;知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…...

html+css 实现 熊猫样式

效果 html代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible"…...

Vue基础19之插槽

Vue基础19插槽不使用插槽App.vueCategory.vue默认插槽&#xff1a;slotApp.vueCategory.vue具名插槽App.vueCategory.vue作用域插槽App.vueCategory.vue总结插槽 不使用插槽 App.vue <template><div class"bg"><Category :listData"food"…...

[Gin]框架底层实现理解(一)

前言&#xff1a;路由原理———压缩字典 这边简单讲一下gin非常重要的一个基点&#xff0c;也就是他作为go web框架的一个亮点 也就是Trie树和压缩字典算法 gin 通过树来存储路由&#xff0c;讲路由的字符拆解为一个个的结点&#xff0c;在获取handler函数时&#xff0c;会…...

css3横向无限公告消息滚动功能

html部分 {{item}}css部分 .boxingeds{ display: flex; flex-wrap: wrap; width: 150%; position: relative; left: 1000rpx; padding: 30rpx 0; position: absolute; top: 23%; z-index: 2; -webkit-animation: myfirst 30s linear 2s infinite; .textname{ display: inlin…...

【Git】Git工作流程及使用

Git工作流程及使用Git工作流程与常用命令Git工作流程Git常用命令项目中使用Git的场景需求开发前的分支拉取流程&#xff0c;需求开发后的分支合并流程分支合并出现冲突如何解决线上出现事故代码如何回退Git工作流程与常用命令 Git工作流程 workspace&#xff1a;工作区 stagin…...

降本增效,合作伙伴营销助力业绩增长

事实上&#xff0c;SaaS品牌透过“推荐奖励计划” 带来的业务营收平均占比高达 30%。例如&#xff0c;Evernote超过11300万用户通过老用户推荐来到Everote&#xff1b;Trello每日注册用户中有35%来自用户推荐&#xff1b;PayPal自从推行“推荐奖励计划”以来&#xff0c;用户日…...

【独家】华为OD机试 - 运动会(C 语言解题)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明本期…...

【每天学习一点新知识】JNDI注入

什么是JNDIJNDI是Java的一种API&#xff0c;为我们提供了查找和访问各种命名和目录服务的通用统一的接口。通过JNDI统一接口我们可以来访问各种不同类型的服务&#xff0c;例如远程方法调用&#xff08;RMI&#xff09;&#xff0c;通用对象请求代理体系结构&#xff08;CORBA&…...

Transwarp KunDB 实施方案

星环科技 KunDB 实施方案方案描述优点缺点定期全量逻辑备份基于kundb导入导出工具&#xff0c;定期向kundb导出全量的逻辑数据,恢复时向kundb导入最近全量的逻辑数据。如每天00&#xff1a;00进行一次全量逻辑备份。1. 数据可视化2.方便问题排查3.还原失败不影响数据库的运行状…...

Redis学习之主从复制(八)

这里写目录标题一、主从复制简介1.1原理1.2 主从复制的作用二、主从复制工作流程2.1 建立连接2.1.1 master和slave连接流程2.1.2 master和slave互联2.1.3主从断开连接&#xff08;了解&#xff09;2.1.4 授权访问&#xff08;了解&#xff09;2.2 数据同步2.3 命令传播2.3.1 命…...

macOS高效配置:OpenClaw与Qwen3.5-9B镜像深度集成指南

macOS高效配置&#xff1a;OpenClaw与Qwen3.5-9B镜像深度集成指南 1. 为什么选择OpenClaw与Qwen3.5-9B组合 去年冬天&#xff0c;当我第一次尝试用AI自动化处理日常工作报告时&#xff0c;发现大多数云端方案要么功能受限&#xff0c;要么隐私性存疑。直到遇见OpenClaw这个能…...

STM8 Bootloader实现与固件远程升级技术详解

1. 项目概述在嵌入式产品开发中&#xff0c;经常会遇到设备出厂后需要远程升级固件的需求。最近我在新能源行业的一个项目中就遇到了这种情况&#xff1a;已经封装好的设备出现软件Bug需要修复&#xff0c;但无法拆机使用传统烧录工具。这时候Bootloader技术就派上了大用场。Bo…...

MPPT控制器行业解析:技术迭代与市场机遇前瞻

一、核心定义&#xff1a;光伏系统的“能效中枢”MPPT控制器&#xff0c;全称最大功率点跟踪控制器&#xff0c;是光伏发电系统的核心电能管理设备。其核心作用是实时调节光伏组件的工作电压与电流&#xff0c;让太阳能电池始终运行在最大功率输出点&#xff0c;最大化提升发电…...

4.VLAN 技术:二层网络的优化之道

一、网络发展的困境与挑战&#xff08;一&#xff09;早期网络的冲突域问题在网络发展的早期阶段&#xff0c;设备的数据传输共享同一物理介质&#xff0c;就如同多辆车需要共用一条单车道上通行。当多个设备同时尝试传输数据时&#xff0c;数据信号就会彼此竞争、干扰&#xf…...

Pandas数据预览优化:告别Pycharm输出窗口的省略号困扰

1. 数据预览的痛点&#xff1a;被省略号吃掉的关键信息 刚接触Pandas那会儿&#xff0c;我总被Pycharm的输出窗口气得跳脚。明明调用了describe()想看数据分布&#xff0c;结果给我整出一堆省略号&#xff0c;关键统计量全藏在"..."里。最崩溃的是处理宽表时&#xf…...

Agent可观测性工程:监控、追踪与告警的最佳实践

Agent可观测性工程:监控、追踪与告警的最佳实践 一、 引言 (Introduction) (一)钩子 (The Hook) 你是否有过这种令人抓狂的经历?凌晨三点,手机突然弹出刺耳的告警提示音,内容是“你的金融风控Agent集群延迟飙升至27秒,核心交易拒单率突破5‰阈值!”。你从床上弹起来,…...

DFS连通域统计:岛屿数量问题及其变形

0.前言 本文我们来学习一下算法题中颇为著名的岛屿数量问题&#xff0c;我将会从问题本身入手&#xff0c;详细分析解题思路&#xff0c;给出完整代码并进行解析&#xff0c;最后简单了解一下几个岛屿问题的变种题目。 1. 问题描述 题目给出一个只含有 0 和 1 矩阵&#xff0c;…...

从CH341驱动入手,彻底搞懂Linux USB转串口驱动的三层架构(Serial/TTY/USB)

从CH341驱动剖析Linux USB转串口的三层架构设计 在嵌入式开发和工业控制领域&#xff0c;USB转串口设备扮演着关键角色。当我们为一块开发板编写底层驱动&#xff0c;或是调试一个突然"失联"的串口设备时&#xff0c;真正考验开发者功力的不是简单的驱动加载&#xf…...

从零到一:在Linux服务器上部署3DGS并驯服你的专属3D数据

1. 环境准备&#xff1a;搭建你的3D数据炼丹炉 第一次在Linux服务器上部署3D Gaussian Splatting&#xff08;简称3DGS&#xff09;时&#xff0c;我踩过的坑能写满三页A4纸。现在回想起来&#xff0c;90%的问题都出在环境配置阶段。就像盖房子要打地基&#xff0c;环境配置决定…...

Python 数据库操作:精准获取指定行指定列的完整指南

🎯 Python 数据库操作:精准获取指定行指定列的完整指南 下面给你分场景、给可直接运行的代码,覆盖所有常用需求,从基础到进阶一次性讲透。 一、核心前提:先拿到完整结果集 基于你之前的代码,我们先拿到所有数据和字段名: # 执行查询 sql = "SELECT * FROM user…...