Servlet--快速入门及HTTP概述
Servlet概述
Servlet:server applet,是用Java编写的服务器端程序,其主要功能在于交互式的浏览和修改数据,生成动态web内容,一般来说,Servlet是指实现了这个Servlet接口的类
在Java中,Servlet是用于创建动态Web内容的服务器端组件。
Servlet运行在Java EE服务器上,可以响应客户端(通常是Web浏览器)发出的请求。
Servlet的生命周期由服务器管理,主要包括初始化、请求处理和销毁三个阶段。
Servlet是一种Java类,它实现了javax.servlet.Servlet
接口。Servlet主要用于处理HTTP请求和生成HTTP响应,可以用于创建动态网页、处理表单数据、管理会话等。
Servlet就是一个接口,定义了Java类被浏览器访问到(Tomcat识别)的规则。
将来我们自定义一个类,实现servlet接口,复写方法
Servlet工作模式
-
客户端发送请求至服务器;
-
服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器;
-
服务器将响应返回客户端
快速入门
-
创建JavaEE项目,定义一个实现Servlet接口的类,实现方法,配置Servlet
代码展示:
配置servlet
<!-- 配置servlet--><servlet><servlet-name>demo</servlet-name><servlet-class>com.lyc.servlet.ServletDemo</servlet-class></servlet><servlet-mapping><servlet-name>demo</servlet-name><!-- 资源路径--><url-pattern>/demo</url-pattern> </servlet-mapping>
执行效果:
未配置静态资源,所以是空白,但未报错,说明运行成功
执行原理
原理解析:当服务器接收到客户端浏览器的请求后,会解析请求路径,获取访问的servlet的资源路径
通过Servlet_study可以找到部署在tomcat下的项目
通过资源名称(/demo),通过tomcat内部检索web配置文件(即web.xml)通过查询配置文件中是否有资源路径(url-pattern)与之匹配,如果匹配,则检索到servlet名称(servlet-name),然后通过< servlet-class >找到与之对应的全类名。
重点:tomcat将全类名对应的字节码加载进内存(Class.forName())(反射),创建实例化对象(class.newInstance()),调用方法--service()
底层原理是反射,通过servlet提供的全类名拿到servletDemo的class模板(通过Class类的方法)--Class.forName(全类名),在通过调用Class对象的newlnstance()方法,拿到类的对象,再调用类的方法
生命周期
-
加载和实例化:
-
当用户第一次向 Servlet 容器发出 HTTP 请求要求访问某个 Servlet 时,Servlet 容器会在整个容器中搜索该 Servlet 对象,如果发现这个 Servlet 对象没有被实例化,便创建这个 Servlet 对象,之后进入初始化阶段;如果找到了该 Servlet 对象的实例,则不去创建而是直接进入运行阶段。
-
-
初始化:调用
init
方法进行初始化(加载资源)。只执行一次。 -
请求处理:每次请求调用
service
方法,根据请求类型调用相应的doGet
、doPost
等方法。可以执行多次-
这是 Servlet 生命周期中最核心的阶段。在该阶段中,Servlet 容器会为当前的请求创建一个 ServletRequest 对象和一个 ServletResponse 对象(分别代表请求和响应),service() 方法从 ServletRequest 对象中获得用户的详细请求信息并可以检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用
doGet
、doPost
、doPut
,doDelete
等方法处理该请求。处理完成后通过 ServletResponse 对象生成响应结果。
-
注意:在 Servlet 对象的整个生命周期内,用户每次请求访问 Servlet 时,Servlet 容器都会调用一次 Servlet 的 service() 方法。
-
销毁:服务器关闭或Servlet被移除时调用
destroy
方法进行清理。,只执行一次。注:只有服务器正常关闭时,才会执行destroy方法。
destroy方法在Servlet被销毁之前执行,一般用于释放资源
在 Servlet 对象的整个生命周期内,destroy() 方法只会在销毁该对象被调用一次。
Servlet 对象一旦创建就会驻留在内存中一直等待客户端的访问。
直到服务器关闭或项目被移除出容器时,Servlet 对象才会被销毁。
-
代码展示:
package com.lyc.servlet;import javax.servlet.*;import java.io.IOException;public class ServletDemo2 implements Servlet {/*初始化方法* 在servlet创建时,执行,只会执行一次* */@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("init");}/*获取ServletConfig对象* ServletConfig:servlet的配置对象* 在servlet创建时,执行,只会执行一次*/@Overridepublic ServletConfig getServletConfig() {return null;}/*提供服务方法,每一次请求都会执行,执行多次* */@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("service");}/*获取ServletInfo对象* ServletInfo:servlet的信息对象:版本,作者,描述等* 在servlet创建时,执行,只会执行一次* */@Overridepublic String getServletInfo() {return "";}/*销毁方法* 在servlet销毁时,执行,只会执行一次* */@Overridepublic void destroy() {System.out.println("destroy");}}
思考:
servlet什么时候被创建?
-
默认情况下,第一次被访问时,servlet被创建
-
可以配置servlet的创建时机
代码展示
<servlet><servlet-name>demo</servlet-name><servlet-class>com.lyc.servlet.ServletDemo</servlet-class><!-- 指定servlet的创建时机1.第一次被访问时创建<load-on-startup>值为负数</load-on-startup>2.在服务器启动时,创建<load-on-startup>值为正数</load-on-startup>--><load-on-startup>1</load-on-startup></servlet>
Servlet的init方法,只执行一次,说明Servlet在内存中只存在一个对象single(单例模式)
多个用户同时访问可能会出现线程安全问题,不能选择加锁,加锁太过于影响性能。
解决方案:
尽量不要在servlet中定义成员变量(否则就会被共享资源,造成安全问题),可以定义局部变量,即使定义了成员变量,也不要修改值
注解配置
servlet3.0以后可以使用注解配置,不需要web.xml.
创建项目,可以不创建web.xml,定义实现servlet接口的类,复写方法,在类上使用@webServlet注解(@WebServlet("资源路径")
),进行配置
代码展示:
@WebServlet("/demo")public class AnnotationServlet implements Servlet {...}
Servlet相关配置
1.url-partten:Servlet访问路径
注:一个servlet可以定义多个访问路径
@WebServlet({"/d1","/d2","/d3"})public class ServletDemo extends HttpServlet {doget();}
路径定义规则
-
/xxx
-
/xxx/xxx:多层路径,目录结构
-
*.do
代码展示:
//@WebServlet({"/d1","/d2","/d3"}) 输入/d1,/d2,/d3都可以访问//@WebServlet("/d1/d2") 输入d1/d2才可以访问//@WebServlet("/d1/*") 输入d1/任意值都可以访问//@WebServlet("/*") 输入任意值都可以访问//@WebServlet("*.do") 输入任意值.do都可以访问
拓展:IDEA与tomcat的相关配置
-
IDEA会为每一个Tomcat部署的项目单独建立一份配置文件
查询控制台的log文件:Using CATALINA_BASE: "C:\Users\20893\AppData\Local\JetBrains\IntelliJIdea2024.3\tomcat\ba95c5c2-f5e3-4c8e-a1c2-9cfce7efa4df"
从而找到conf文件夹,其中的server.xml可以更改我们的端口设置等等
工作空间项目 和tomcat部署的web项目
注意事项:
tomcat真正访问的项目是“tomcat部署的web项目”,“Tomcat部署的web项目”对应着“工作空间项目”的web目录下的所有资源
WEB-INF目录下的资源不能直接被浏览器访问
断点调试:用debug
体系结构
web相关概念回顾
-
软件架构
-
C/S:客户端/服务器端
-
B/S:浏览器端/服务器端
-
-
资源分类
-
静态资源:所有用户访问后,得到的结果一致,称为静态资源,静态资源可以直接被浏览器解析
-
如"HTML,CSS.JS"
-
-
动态资源:用户访问相同的资源,得到的结果不一致,则为动态资源,动态资源被访问后,需要先转换成静态资源,再返回给浏览器
-
如“JSP,PHP,ASP”
-
-
-
网络通信三要素
-
IP地址:电子设备(计算机)在网络中的唯一标识
-
端口:应用程序在计算机中的唯一标识
-
传输协议:规定了数据传输的规则
-
基础协议:常见的协议有TCP协议(安全协议,三次握手,四次挥手,速度稍慢),UDP协议(不安全协议,速度快),HTTP协议(超文本传输协议),ftp协议(文件上传协议),SMTP协议(发送邮件·)
-
-
体系结构
参考博客:Servlet概述:体系结构,生命周期,常用命令,注解配置_servlet体系结构-CSDN博客
Servlet由两个Java包组成:javax.servlet
和javax.servlet.http
。
在javax.servlet
包中定义了所有的Servlet类都必须实现或扩展的的通用接口和类;
在javax.servlet.http
包中定义了采用HTTP通信协议的HttpServlet类。
其中的一些比较核心的接口和类之间的关系如下,图中提到的方法是在使用该接口或类时必须要实现的:
1. Servlet 接口
Servlet
接口是所有 Servlet 类的根接口。其常用方法如下:
// 初始化 Servletpublic void init(ServletConfig config) throws ServletException;// 获取 Servlet 的配置信息public ServletConfig getServletConfig();// 处理请求public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;// 获取 Servlet 的信息public String getServletInfo();// 销毁 Servletpublic void destroy();
2. Serializable 接口
Serializable
接口是 Java 中的标记接口,用于标识类的实例可以被序列化。实现该接口的类表示它们的实例可以被转换为字节序列,以便在网络上传输或保存到文件中。其常用方法如下:
// 序列化对象private void writeObject(ObjectOutputStream out) throws IOException;// 反序列化对象private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
3. ServletConfig 接口
ServletConfig
接口提供了 Servlet 配置信息的访问方法。具体来说,它允许 Servlet 访问在部署描述符中配置的初始化参数,以及获取与 ServletContext 相关联的配置信息。其常用方法如下:
// 获取 Servlet 的名称public String getServletName();// 获取初始化参数public String getInitParameter(String name);// 获取所有初始化参数的名称public Enumeration<String> getInitParameterNames();// 获取 ServletContextpublic ServletContext getServletContext();
4. GenericServlet 抽象类
GenericServlet
实现了 Servlet
接口,为 Servlet 提供了一些通用的功能,但它本身并不直接处理 HTTP 请求和响应。GenericServlet
的 service()
方法接受通用的 ServletRequest
和 ServletResponse
对象。其常用方法如下:
// 初始化 Servletpublic void init(ServletConfig config) throws ServletException;// 获取 Servlet 的配置信息public ServletConfig getServletConfig();// 获取 Servlet 的名称public String getServletName();// 处理请求public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;// 销毁 Servletpublic void destroy();// 获取初始化参数public String getInitParameter(String name);// 获取所有初始化参数的名称public Enumeration<String> getInitParameterNames();
5. HttpServlet 抽象类
HttpServlet
继承自 GenericServlet
,专门用于处理 HTTP 请求和响应。HttpServlet
提供了对 HTTP 请求方法的更直接的支持,如 doGet()
、doPost()
等。其常用方法如下:
// 处理 HTTP GET 请求protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;// 处理 HTTP POST 请求protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;// 处理 HTTP PUT 请求protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;// 处理 HTTP DELETE 请求protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;// 处理 HTTP HEAD 请求protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;// 处理 HTTP OPTIONS 请求protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;// 处理 HTTP TRACE 请求protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;// 处理 HTTP PATCH 请求protected void doPatch(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;// 处理通用的 HTTP 请求protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;
注意事项:
-
将servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象,将来定义servlet类时,可以继承GenericServlet,实现service()方法即可
-
HttpServlet:对http协议的一种封装,简化操作
-
定义类继承HttpServlet
-
复写doGet/doPost()方法
HTTP_概述
(Hyper Text Tranfer Protocol)超文本传输协议,是一个客户端请求和响应的标准协议,这一协议详细规定了浏览器和万维网服务器之间相互通信的规则。用户输入地址和端口号之后就可以从服务器上获取需要的网页信息。
通信规则规定了客户端发送到服务器的内容格式,也规定了服务器发送给客户端的内容格式。客户端发送给服务器的格式叫做“请求协议(request)”,服务器发送给客户端的格式叫做“响应协议(response)”
传输协议:定义了客户端和服务器端通信时发送数据的格式
浏览器中的书写格式
服务器端资源需要通过浏览器进行,此时浏览器将我们给出的请求解析成满足HTTP协议的格式并发出。我们发出的请求格式需要按照浏览器规定的格式来书写,在浏览器书写格式如下
当浏览器获取到信息时,按照特定格式解析并发送即可,接受到服务器端给出的响应时,也会按照HTTP协议进行解析获取到各个数据,最后按照特定格式展示给用户。
HTTP协议特点
-
基于TCP/IP的高级协议,支持客户端/服务器模式,默认端口号为8080。
-
简单快速:客户向服务器请求服务时,只需传送请求方法和路径,请求方法常用的GET,POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快
-
灵活:HTTP允许传输任意类型的数据对象,传输的类型由Content-Type加以标记。
-
无状态的:HTTP协议是无状态协议。无状态是指协议对事务处理没有记忆能力,缺少状态意味着后续处理需要前面的信息,则必须重传,这样可能导致每次连接传送的数据量增大,且每次请求之间相互独立,不能交互数据
-
无连接:无连接是指表示每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用此方式可以节省传输时间。
注:HTTP1.1版本可支持可连续连接,通过这种连接,就有可能再建立一个TCP连接后,发送请求并得到回应,然后发送更多的请求得到更多的回应。通过把建立和释放TCP连接平摊到多个请求上,则对于每个请求而言,由于TCP造成的开销大大降低了,且可以发送流水线请求。也可以认为,一次性接连发送多个请求,有客户机确认是否关闭连接,而服务器会认为这些请求分别来自不同的客户端
一次请求流程
-
客户端(浏览器)与服务器建立连接
-
客户端(浏览器)发送请求数据给服务器。(按照HTTP格式规范)
-
服务器接收到请求数据并进行处理,然后将处理的结果相应给客户端(浏览器)
-
关闭服务器和客户端。
HTTP之URL
URL: Uniform Resource Locator 统一资源定位符
-
表示统一资源定位符,指向万维网上的“资源”的指针。用于区分、定位资源
-
一个标准的URL必须包括:protocol(方案或协议)、host(主机)、port(端口)、path(路径)、parameter( 查询参数)、anchor(锚点)
-
在www上,每一信息资源都有统一且唯一的地址
-
如:
http://www.google.com:80/index.html
,分四部分组成:协议、存放资源的主机域名、端口号、资源文件名
请求消息数据格式
-
请求行
-
请求方式 请求url 请求协议/版本
-
请求方式:
-
HTTP协议中有7种请求方式,常用的有两种
-
GET:请求参数在请求行中,在url后。请求的URL长度有限制。get请求方式相对不太安全
-
POST:请求参数在请求体中,请求的URL长度没有限制。post请求方式相对安全
-
-
-
-
请求头
-
请求头名称:请求头值(键值对)
-
常见的请求头:
-
User-Agent:浏览器告诉服务器,访问的浏览器版本信息
-
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0
注意事项:可以在服务器端获取该请求头的信息,解决浏览器的兼容性问题
-
Referer:告诉服务器,当前请求从哪里来
-
作用:防止别人盗取链接
-
统计工作
-
-
-
请求体(正文)(POST有请求正文,GET没有)
Connection: keep-alive(可持续连接)
响应消息数据格式
在接受和解释请求信息后,服务器返回一个HTTP响应消息。HTTP响应也是有三个部分组成:
-
状态行
-
请求协议/版本 状态码(200 正常 404 未找到 500 状态错误 307/302 重定向) 状态说明
-
-
消息报头
-
响应头名称:响应头值(键值对)
-
-
消息正文
-
为静态资源代码,也就可以预览
-
消息头
HTTP 消息由客户端到服务器的请求和服务器到客户端的响应组成。
请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有 CRLF 的行),消息正文(可选)组成。
每一个报头域都是由“名字+":"+空格+值组成,消息报头域的名字是大小写无关的。
请求头
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
-
Referer:该请求头指明请求从哪里来。
如果是地址栏中输入地址访问的都没有该请求头 地址栏输入地址,通过请求可以看到,此时多了一个Referer 的请求头,并且后面的值 为该请求从哪里发出。比如:百度竞价,只能从百度来的才有效果,否则不算;
通常用来做统计工作、防盗链。
响应头
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和 对 Request-URI 所标识的资源进行下一步访问的信息。
Location:Location响应报头域用于重定向,接受者到一个新的位置。
Location响应报头域,常用在更换域名的时候。
response.sendRedirect("http://www.baidu.com");
Refrach·自动跳转(单位是秒) 可以在页面通过meta标签实现,也可在后台实现
-
作用:每隔几秒种刷新页面
-
<meta http-equiv="refresh" content = "3">
-
每隔几秒种跳转页面
<meta http-equiv="refresh" content = "3; url=https://www.baidu.com">
希望对大家有所帮助!
相关文章:
Servlet--快速入门及HTTP概述
Servlet概述 Servlet:server applet,是用Java编写的服务器端程序,其主要功能在于交互式的浏览和修改数据,生成动态web内容,一般来说,Servlet是指实现了这个Servlet接口的类 在Java中,Servlet是用于创建动态Web内容的服务器端组件。 Servle…...
【LeetCode Hot100 | 每日刷题】二叉树的层序遍历
题目: 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]示例 2&a…...
编码器型与解码器型语言模型的比较
编码器型与解码器型语言模型的比较 1. 引言 自然语言处理(NLP)领域近年来取得了革命性进展,这在很大程度上归功于基于Transformer架构的语言模型。在这一技术生态中,编码器型(Encoder-only)和解码器型&am…...
Java 函数式编程
函数式编程的意义 函数式编程理念强调函数纯粹性和不可变性,这有助于写出更稳定、更易测试的代码,尤其在并发环境下减少 bug lambda 表达式 import java.util.function.Function;public class Strategize {Function<String, String> getString …...
MySQL初阶:基础增删改查(CRUD)
创建(Create) 先创建一个表 1)单独插入一条 insert into 表名 values (列名 类型)...; 插入的记录要和表一开始创建记录的类型,个数,结构一样。 如果不一样,就会报错。…...
yolo训练用的数据集的数据结构
Football Players Detection using YOLOV11 可以在roboflow上标注 Sign in to Roboflow 训练数据集只看这个data.yaml 里面是train的image地址和classnames 每个image一一对应一个label 第一个位是分类,0是classnames[0]对应的物体,现在是cuboid &…...
vue3+ts继续学习
我们再写点东西,这里面都是vue2的语法,应该都能看明白!我们写完直接去运行一下代码! 发现什么都没有发生!为什么呢?因为我们在App.vue中没有引入!哈哈哈哈!这样就好了!注…...
Oracle01-入门
零、文章目录 Oracle01-入门 1、Oracle简介 (1)数据库基础 数据库基础请参考:https://blog.csdn.net/liyou123456789/article/details/131207068 (2)Oracle是什么 ORACLE 数据库系统是美国 ORACLE 公司ÿ…...
即开即用,封装 Flask 项目为 exe 文件实操步骤
见字如面,朋友们! 嗨,这里是 AIGC 创意人_竹相左边! 正如你们所知,我正在通过 AI 自学软硬件工程师,目标是手搓一台可回收火箭玩具! 最近,我被《流浪地球 2》中马兆的那句“没有硬…...
【STM32单片机】#14 PWR电源控制
主要参考学习资料: B站江协科技 STM32入门教程-2023版 细致讲解 中文字幕 开发资料下载链接:https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 单片机套装:STM32F103C8T6开发板单片机C6T6核心板 实验板最小系统板套件科协 目录 PWR…...
FastComposer论文问题与解决
在FastComposer中,跨注意力定位监督(Cross-Attention Localization Supervision) 的实现是通过以下步骤完成的,核心思想是利用分割掩码约束扩散模型中跨注意力图的分布,确保每个主体的特征仅影响图像中对应的区域。具体…...
51单片机同一个timer 作为定时器和波特率发生器么?
在51单片机中,同一个Timer(定时器)不能同时作为普通定时器和波特率发生器。这是因为这两种功能都需要对Timer的寄存器进行配置和操作,而它们的配置要求是冲突的。具体来说: 1. 普通定时器功能 配置要求:需…...
爱情的本质是什么--deepseek
爱情的本质是一个跨越生物学、心理学、哲学和社会学的复杂命题。不同学科视角下,爱情呈现出多层次的真相,但核心可以归结为: “爱情是进化塑造的生存策略、神经化学的短暂狂欢,以及人类对抗存在孤独的精神创造。” 以下从四个维…...
Leetcode 刷题记录 07 —— 链表
本系列为笔者的 Leetcode 刷题记录,顺序为 Hot 100 题官方顺序,根据标签命名,记录笔者总结的做题思路,附部分代码解释和疑问解答。 01 相交链表 /*** Definition for singly-linked list.* struct ListNode {* int val;* …...
Android View#post()源码分析
文章目录 Android View#post()源码分析概述onCreate和onResume不能获取View的宽高post可以获取View的宽高总结 Android View#post()源码分析 概述 在 Activity 中,在 onCreate() 和 onResume() 中是无法获取 View 的宽高,可以通过 View#post() 获取 Vi…...
dubbo限流
单机限流 限流过滤器 package com.doudou.filter;import org.apache.dubbo.common.URL; import org.apache.dubbo.common.constants.CommonConstants; import org.apache.dubbo.common.extension.Activate; import org.apache.dubbo.rpc.*;import java.util.concurrent.Concu…...
IBM BAW(原BPM升级版)使用教程:基本概念
本部分为“IBM BAW(原BPM升级版)使用教程系列”内容的补充。 一、IBM BAW中的流程概念 在IBM Business Automation Workflow(BAW)中,流程定义是流程设计的核心组成部分,它涵盖了流程的结构、任务、数据流…...
1. 视频基础知识
1. 图像基础概念 像素:像素是一个图片的基本单位,pix是英语单词picture,加上英语单词“元素element”,就得到了pixel,简称px。所以“像素”有“图像元素”之意。分辨率:指的是图像的大小或者尺寸。比如 19…...
docker + K3S + Jenkins + Harbor自动化部署
最近公司在研究自动化部署的一套流程,下面记录一下配置流程 需要提前准备好Jenkins Harbor Git(其他管理工具也可以) 我这里的打包编译流程是Jenkins上配置打包任务-->自动到git目录下找打包文件---->项目编译后打镜像包------>打完镜像包将镜像上传到…...
【算法专题十】哈希表
文章目录 0.哈希表简介1. 两数之和1.1 题目1.2 思路1.3 代码 2.判断是否为字符重排2.1 题目2.2 思路2.3 代码 3. leetcode.217.存在重复元素3.1 题目3.2 思路3.3 代码 4. leetcode.219.存在重复的元素Ⅱ4.1 题目4.2 思路4.3 代码 5. leetcode.49.字母异位词分组5.1 题目5.2 思路…...
鸿蒙系统被抹黑的深层解析:技术、商业与地缘政治的复杂博弈-优雅草卓伊凡
鸿蒙系统被抹黑的深层解析:技术、商业与地缘政治的复杂博弈-优雅草卓伊凡 一、技术过渡期的必然误解 1.1 兼容性设计的双刃剑效应 鸿蒙系统早期版本的兼容性策略为后续争议埋下了伏笔。2019年华为被列入实体清单后,面临着生死存亡的技术断供危机。在这…...
Nginx 安全防护与 HTTPS 安全部署
目录 Nginx 安全防护与 HTTPS 安全部署 一、引言 二、Nginx 安全防护措施 2.1 关闭不必要的服务和端口 2.2 限制访问频率 2.3 防止 SQL 注入和 XSS 攻击 2.4 隐藏 Nginx 版本信息 三、HTTPS 安全部署 3.1 HTTPS 简介 3.2 申请 SSL/TLS 证书 3.3 配置 Nginx 启用 HTTP…...
告别异步复杂性?JDK 21 虚拟线程让高并发编程重回简单
长期以来,Java 的并发编程主要围绕平台线程(Platform Threads)构建。然而,在现代应用对海量并发的巨大需求面前,传统模型面临着可伸缩性的挑战。JDK 21 引入了一项突破性的特性——虚拟线程(Virtual Thread…...
Marin说PCB之POC电路layout设计仿真案例---08
Layers –stackup: RX1_96724F_FAKRA_1仿真原理图信息如下,设计中采用了6Gbps/187Mbps的速率配置: IL的limited: RL的limited: RX1_96724F_FAKRA_1--Return Loss:结果显示,板级设计裕量不是很充足,很接近限值曲线了。 …...
【Python系列】Python 中的 HTTP 请求处理
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
【BUG】mmdetection ValueError: need at least one array to concatenate
问题: 使用mmdetection框架使用COCO格式训练自定义数据集时出现如下错误: ValueError: need at least one array to concatenate 解决方法: 修改mmdet/datasets/coco.py文件,将CocoDataset类中的METAINFO修改为自己数据集的类别信…...
GLIBC:GLIBCXX not found
更多内容:XiaoJ的知识星球 目录 1. GLIBCXX not found2.解决方法:(使用预编译库)2.1 获取预编译libstdc库2.2 获取预编译libc库 注意:涉及到修改GLIBC库是个危险操作,可能会影响到系统。请谨慎操作…...
初步认识java
目录 1. java语言概述 1.1 java是什么 1.2 Java语言重要性 1.2.1 语言广泛使用程度 1.2.2 使用领域 1.3 Java语言发展简史 1.4 Java语言的特点 2. Java开发环境安装 2.1 什么是JDK 2.2 什么是JRE 2.3 什么是JVM 2.4 JDK、JRE 和 JVM的包含关系 2.5 JDK的安装和环…...
ShardingJdbc-水平分库
ShardingJdbc-水平分库 水平分库 表结构相同、记录不同、所属库不同多个库中表记录数和才是总的记录数通常根据主键ID进行分表,这里采用奇偶策略 案例 建立库 sharding_demo-1、sharding_demo-2每个库建立表 user_1、user_2 表结构相同id 为主键,big…...
模板模式 VS 建造者模式
模板模式和建造者模式是两种不同的设计模式,下面从定义、结构、应用场景等方面介绍它们的区别,并给出 Python 示例代码。 定义 模板模式:定义了一个操作中的算法骨架,将一些步骤的实现延迟到子类中。这样,子类可以在…...
模态编码器
1.CLIP的textEncoder能输入多少个单词? CLIP 模型中的 context_length 设置为 77,表示每个输入句子会被 tokenized 成最多 77 个token。这个 77 并不是直接对应到 77 个单词, 因为一个单词可能会被拆分成多个 token,特别是对于较长的或不常…...
Python-map从基础到进阶
无论你是打打算法比赛还是做项目map函数肯定都是你必学内置函数,这篇文章小白也能轻松掌握map函数,学习map,理解map,进阶用法map 描述 map() 函数会根据提供的函数对指定序列做映射。 第一个参数 function 以参数序列中的每一个…...
大数据产品销售数据分析:基于Python机器学习产品销售数据爬虫可视化分析预测系统设计与实现
文章目录 大数据产品销售数据分析:基于Python机器学习产品销售数据爬虫可视化分析预测系统设计与实现一、项目概述二、项目说明三、研究意义四、系统总体架构设计总体框架技术架构数据可视化模块设计图后台管理模块设计数据库设计 五、开发技术介绍Flask框架Python爬…...
「Mac畅玩AIGC与多模态21」开发篇17 - 多字段判断与多路径分支工作流示例
一、概述 本篇在结构化输出字段控制流程的基础上,进一步引入多字段联合判断与多路径分支控制。通过综合分析用户输入的情绪类型和紧急程度,实现三分支路径执行逻辑,开发人员将掌握复杂流程中多条件判断节点的配置技巧。 二、环境准备 macO…...
网页截图指南
截取网页截图看似是一项简单的任务,但当你真正动手去做的时候,就会发现事情远没有那么容易。我在尝试截取一篇很长的 Reddit 帖子时就深有体会。一开始我以为只要调用 browser.TakeImage() 就万事大吉,结果却陷入了浏览器视口、动态内容加载、…...
作为主动唤醒的节点,ECU上电如何请求通讯
一个ECU如果作为主动唤醒的节点,ECU上电时可以通过以下方式请求通信 如上图所示,ECU在上电后,在OS起来后,可以通过在BSWM模块中完成NvM_ReadAll和相关BSW 模块初始化以及Rte_Start后,这个时候周期性Task已经可以正常调…...
应用服务器Tomcat
启动两给tomcat apache-tomcat-9.0.60\bin——> 启动tomcat startup.bat (Windows) / startup.sh(Linux) 关闭tomcat shutdown.bat(Windows)/shutdown.sh (Linux) 复制一个Tomcat为2,先启…...
【安全】端口保护技术--端口敲门和单包授权
【安全】端口保护技术--端口敲门和单包授权 备注一、端口保护二、端口敲门三、单包授权 备注 2025/05/06 星期二 最近学习了端口保护技术总结一下 一、端口保护 为了保护联网设备的安全,一般会尽量减小暴露的攻击面,开放的端口就是最常见的攻击面&…...
金升阳科技:配套AC/DC砖类电源的高性能滤波器
金升阳推出的FC-L15HB是为我司AC砖类电源配套使用的EMC辅助器。将FC-L15HB加装在金升阳AC/DC砖类电源的前端,可以提高电源产品IEC/EN61000—4系列及CISPR32/EN55032标准的EMC性能。 01 产品优势 (1)高共差模插入损耗 ①DM&CM࿱…...
浅谈 - GPTQ为啥按列量化
前言 曾在游戏世界挥洒创意,也曾在前端和后端的浪潮间穿梭,如今,而立的我仰望AI的璀璨星空,心潮澎湃,步履不停!愿你我皆乘风破浪,逐梦星辰! 先说结论 GPTQ 按列量化 W,…...
引用第三方自定义组件——微信小程序学习笔记
1. 使用 npm 安装第三方包 1.1 下载安装Node.js 工具 下载地址:Node.js — Download Node.js 1.2 安装 npm 包 在项目空白处右键弹出菜单,选择“在外部终端窗口打开”,打开命令行工具,输入以下指令: 1> 初始化:…...
解决android studio 中gradle 出现task list not built
点击 file 选择settings...
UE5 材质淡入淡出
混合模式选择半透明,灯光照明模式选择Surface TranslucencyVolume...
如何用Java读取PDF
在本文中,我将向您展示如何使用JPedal(一个用于转换、打印、查看PDF文件的Java库)在Java中读取PDF。 如何在Java中读取PDF文件 • 将JPedal添加到您的类或模块路径中(下载试用版jar包)。 • 使用JPedal库中的&q…...
tinyrenderer笔记(中)
tinyrenderer个人代码仓库:tinyrenderer个人练习代码 前言 原教程的第 4 课与第 5 课主要介绍了坐标变换的一些知识点,但这一篇文章的内容主要是手动构建 MVP 矩阵,LookAt 矩阵以及原教程涉及到的一些知识点,不是从一个图形学小白…...
人工智能对人类的影响
人工智能对人类的影响 近年来,人工智能(AI)技术以惊人的速度发展,深刻改变了人类社会的方方面面。从医疗、教育到交通、制造业,AI的应用正在重塑我们的生活方式。然而,这一技术革命也带来了机遇与挑战并存…...
LeetCode 220 存在重复元素 III 题解
LeetCode 220 存在重复元素 III 题解 题目描述 给定一个整数数组 nums 和两个整数 k 和 t,请判断数组中是否存在两个不同的索引 i 和 j,使得: abs(nums[i] - nums[j]) < tabs(i - j) < k 方法思路:桶排序 滑动窗口 核…...
0506--01-DA
36. 单选题 在娱乐方式多元化的今天,“ ”是不少人(特别是中青年群体)对待戏曲的态度。这里面固然存在 的偏见、难以静下心来欣赏戏曲之美等因素,却也有另一个无法回避的原因:一些戏曲虽然与观众…...
单应性估计
单应性估计是计算机视觉中的核心技术,主要用于描述同一平面在不同视角下的投影变换关系。以下从定义、数学原理、估计方法及应用场景等方面进行综合解析: 一、单应性的定义与核心特性 单应性(Homography)是射影几何中的概念&…...
Missashe考研日记-day33
Missashe考研日记-day33 1 专业课408 学习时间:2h30min学习内容: 今天开始学习OS最后一章I/O管理的内容,听了第一小节的内容,然后把课后习题也做了。知识点回顾: 1.I/O设备分类:按信息交换单位、按设备传…...