Javaweb之Http协议andTomcatandServelt的内容~

news2024/11/29 10:43:53

JavaWeb技术栈:

B/S架构;Browser/server:浏览器/服务器架构模式,它的特点是,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端,浏览器只需要请求服务器,获取Web资源,服务器把Web资源发送给浏览器即可

好处:易于维护升级:服务器升级后,客户端无需任何部署就可以使用到新版本

在这里插入图片描述

静态资源:HTML,CSS,JavaScript,图片等,负责页面展现
动态资源:Servlet,JSP等,负责逻辑处理
数据:负责存储数据
HTTP协议:定义通信规则
Web服务器:负责解析HTTP协议,解析请求数据,并发送响应数据

HTTP协议:

概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则

在这里插入图片描述

HTTP协议特点:

1:基于TCP协议:面向连接,安全

2:基于请求-响应模型的:一次请求对应一次响应

3:HTTP协议是无状态的协议:对于事务处理没有记忆能力,每次请求-响应都是独立的

缺点:多次请求不能共享数据
优点:速度快

HTTP–请求数据格式:

请求数据分为3部分:

1:请求行:请求数据的第一行,其中GET表示请求方式,/表示请求资源路径,HTTP/1.1表示协议版本
2:请求头:第二行开始,格式为:key:value形式
3:请求体:POST请求的最后一部分,存放请求参数

举例:

在这里插入图片描述

常见HTTP请求头:

在这里插入图片描述

GET请求和POST请求的区别:

1:GET请求请求参数在请求行中,没有请求体
	POST请求请求参数在请求体中
2:GET请求请求参数大小有限制,POST没有

举例:

在这里插入图片描述

HTTP–响应数据格式:

响应数据分为3部分:

响应行:响应数据的第一行,其中HTTP/1.1表示协议版本,200表示响应状态码,OK表示状态码描述
响应头:第二行开始,格式为key:value形式
响应体:最后一部分,存放响应数据

在这里插入图片描述

常见的响应头:

在这里插入图片描述

常见的响应码:

在这里插入图片描述

常见的响应状态码:

在这里插入图片描述

Web服务器—Tomcat:

web服务器是一个应用程序(软件),对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让web开发更加便捷,主要功能是"提供网上信息浏览服务"

在这里插入图片描述

概念:

Tomcat是Apache 软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范

JavaEE:

Java Enterprise Edition,Java企业版。指Java企业级开发的技术规范总和,包含13项技术规范: JDBCJNDI、EJB、RMI、JSP、Servlet、XML、JMS、Java IDL、JTS、JTA、JavaMail、JAFTomcat 也被称为 Web容器、Servlet容器,Servlet 需要依赖于 Tomcat才能运行

Tomcat的安装及使用:

官网传送门!

在这里插入图片描述

在这里插入图片描述

由于TomCat是绿色软件,因此我们只需要将其解压到当前目录即可,解压完成后打开bin目录下的该文件

在这里插入图片描述

有很多的小伙伴在打开时,会遇到闪退问题[包括我也是],大家可通过这篇文章查看解决方法

如果打开该文件后显示如下内容,则证明你已启动成功啦!

在这里插入图片描述

但仔细看,我们会发现其中有很多乱码,是由于TomCat和JDK编码不一致所导致的!

解决TomCat中的乱码问题:

找到apache-tomcat-8.5.85文件中的conf目录,打开下述文件:

在这里插入图片描述
找到文件中的这行代码:

在这里插入图片描述

将其修改为如下所示:

在这里插入图片描述

修改完成后再次打开TomCat,乱码问题被解决

在这里插入图片描述

关于TomCat的关闭,有以下三种方式:

1:直接点击右上角的"×":这种方法是强制关闭,并不是我们推荐的,因为很多数据都来不及保存

2:bin\shutdown.bat:正常关闭:这种方法虽然可以正常关闭,但很麻烦,每次都要找到该目录,因此也不是最优选择

3Ctrl+C:正常关闭,这种使我们最推荐的

修改TomCat端口号:

打开conf目录下的下述文件:

在这里插入图片描述

找到该行代码:

将8080修改为80,关闭并保存

在这里插入图片描述

HTTP协议默认端口号为80,如果将Tomcat端口号改为80,则将来访问TomCat时,将不用输入端口号

端口号的配置范围为 0-65535,但0-1024 基本都是系统配置,为了避免端口号冲突,我们应尽量不要用这些端口号去进行配置,此外还有一些特殊的端口号,例如:3306(数据库),8080(HTTP)这些端口号都属于特别容易发生冲突的,尽量不要去进行配置,可以自定义一些不是很特殊的端口号,例如:1982, 3456 等等

打开TomCat后,在浏览器输入如下:

在这里插入图片描述

TomCat—部署项目:

TomCat部署项目:将项目放置到webapps目录下,即部署完成

一般JavaWeb项目会被打包成war包,然后将war包放到webapps目录下,TomCat会自动解压war文件

IDE中创建Maven Web项目:

在这里插入图片描述

编译后的Java字节码文件和resources的资源文件,放到WEB-INF下的classes目录下

pom.xml中依赖坐标对应的jar包,放到WEB-INF下的lib目录下

创建Maven Web项目:

File-new-project:

在这里插入图片描述

等待加载成功即可,网络不好的小伙伴需要耐心等待哦

在这里插入图片描述

加载完成后是这个样子!

右击:

在这里插入图片描述

如果在打包的过程中出现下述这种错误:

在这里插入图片描述

解决方法为:在.xml文件中加入下述代码

 <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.3.1</version>
      </plugin>
    </plugins>
  </build>

再次打包,打包成功!

在这里插入图片描述

在IDE中使用Tomcat—集成本地Tomcat:

点击file—>settings:

下载插件

在这里插入图片描述

在pom.xml文件中添加下述代码:

<plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
</plugin>

右击进入下述步骤,运行即可

在这里插入图片描述

右击:

在这里插入图片描述

显示如下:

在这里插入图片描述

为什么会出现个helloworld呢?

这实际是系统自动生成的,如下所示:

在这里插入图片描述

Servlet:

Servlet是Java提供的一门动态web资源开发技术

在这里插入图片描述

Servlet是JavaEE规范之一。其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet

public interface Servlet
Defines methods that all servlet must implement
A servlet is a small Java program that runs within a Web server

访问servlet:

创建web项目,导入servlet依赖坐标:

<dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
</dependency>

创建servlet类:实现servlet接口,并重写接口中的所有方法,并在service方法中输入一句话

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

//在类上使用@WebServlet注解,配置该servlet的访问路径
@WebServlet("/demo1")
public class Myservlet implements Servlet {
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    public ServletConfig getServletConfig() {
        return null;
    }

    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
					//最终会在控制台输出
            System.out.println("hello");
    }

    public String getServletInfo() {
        return null;
    }

    public void destroy() {

    }
}

导入后,启动Tomcat,浏览器输入URL,访问该servlet

在这里插入图片描述

出现下述错误:

在这里插入图片描述

在这里插入图片描述

解决办法:

在pom.xml文件中加入下述代码,注意一定要与自己的jdk版本对应

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>18</maven.compiler.source>
    <maven.compiler.target>18</maven.compiler.target>
</properties>

不知道自己jdk什么版本的,Win+R–>cmd,输入java -version,我的jdk为1.8,则在上述代码中写18即可

在这里插入图片描述

再次运行

出现下述错误的原因是端口号被占用:

在这里插入图片描述

解决办法:Win+R–>cmd,输入netstat -ano,查看被占用的端口号PID

在这里插入图片描述

通常情况下默认查看8080端口号是否被占用,但如果之前你改过的话,就需要查看你改之后的端口号

打开任务资源管理器

在这里插入图片描述

找到对应的进程关闭它!

在这里插入图片描述

再次运行!

运行成功!

在这里插入图片描述

在这里插入图片描述

在网页中添加:

在这里插入图片描述

添加的内容与你在servlet中写的相对应:

在这里插入图片描述

Servlet执行流程:

Servlet是由web服务器创建的,Servlet方法由web服务器调用

在这里插入图片描述

如图所示,我们知道service方法是由web服务器创建的,那么服务器是怎么知道servlet中一定有service方法呢?

因为我们自定义的Servlet,必须实现Servlet接口并重写其中的方法,而Servlet接口中有service方法

Servlet生命周期:

对象的生命周期指一个对象从被创建到被销毁的整个过程

在这里插入图片描述

Servlet运行在Servlet容器(Web服务器)中,其生命周期由容器来管理,分为4个阶段:

1:加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象

Servlet对象的创建时期可以自己设置,方法如下:

@WebServlet(urlPatterns="/demo",loadOnStartup=1)

当loadOnStartup为负整数时[默认情况],第一次被访问时,创建Servlet对象
当loadOnStartup为0/正整数时,服务器启动时创建Servlet对象,数字越小优先级越高

2:初始化:在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些加载配置文件,创建连接等初始化的工作,该方法只调用一次

测试验证:

默认情况:

再创建一个Servlet类,将注解中的路径改为"demo2",并将init()方法和destory()方法转移到前面,如下所示:

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet("/demo2")
public class Myservlet1 implements Servlet {

        //默认情况下,Servlet第一次被访问,调用,只被调用一次
        public void init(ServletConfig servletConfig) throws ServletException {
                System.out.println("init.........");
        }
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("hello");
        }
        public void destroy() {

        }

        public ServletConfig getServletConfig() {
            return null;
        }
        public String getServletInfo() {
            return null;
        }
    }

和上面相同的方式运行

在这里插入图片描述

输入demo2后点击回车,返回到IDE中
在这里插入图片描述

此时init()方法和service()方法被调用,并输出相关的信息

在这里插入图片描述

返回刚才的网页面多次刷新,返回IDE

下述的输出结果,很好地证明了init()只会被调用一次,且是在第一次访问时被调用的

在这里插入图片描述

自定义情况:

上面我们提到,Servlet的创建时期我们可以自定义,步骤如下:

修改Servlet中的注解参数:

@WebServlet(urlPatterns = "/demo2",loadOnStartup = 1)

运行,控制台输出结果如下:

此时我们仅仅是启动了服务器,并没有进行访问,该Servlet就被创建了

在这里插入图片描述

3:请求处理,每次请求Servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理

测试验证:

在这里插入图片描述

4:服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destory()方法完成资源的释放,在destory()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java垃圾收集器所回收

测试验证该方法:

在创建的Servlet类的destroy方法中添加下述代码:

System.out.println("destroy..........");

在这里插入图片描述

该路径即为当前项目的目录,输入mvn tomcat7:run

在这里插入图片描述

稍等几秒,进行下述步骤

在这里插入图片描述
成功关闭!

Servlet方法:

初始化方法:在Servlet被创建时执行,只执行一次

void init(ServletConfig config)

提供服务方法,每次Servlet被访问,都会调用该方法

void service(ServletRequest req,ServletResponse res)

销毁方法,当Servlet被销毁时,调用该方法,在内存释放或服务器关闭时销毁Servlet

void destroy()

获取ServletConfig对象:

ServletConfig getServletConfig()

对于ServletConfig对象,我们是没办法直接new的,只能获取init()方法中的
解决办法如下:

在这里插入图片描述

获取Servlet信息:不常用,一般返回null或者空字符串

String getServletInfo()

Servlet中的体系结构:

在这里插入图片描述

我们将来开发B/S架构的web项目,都是针对HTTP协议,所以我们自定义Servlet,会继承HttpServlet

在这里插入图片描述

调用doget方法():

创建新的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("/demo3")
public class Myservlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("get....");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                System.out.println("post...");
    }
}

右击:

在这里插入图片描述

在网站中,输入路径:

在这里插入图片描述
在这里插入图片描述

控制台输出:

在这里插入图片描述

调用dopost方法():

这里使用的类还是上面的新创建的那个Servlet类!

在webapp目录下创建a.html文件:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
<!-- action所写的内容与注解中缩写的路径应相对应-->
<form action="demo3" method="post">
    <input name="username"><input type="submit">
</form>
</body>
</html>

在这里插入图片描述

第二步:输入文件名称点击回车

在这里插入图片描述

输入内容,点击提交

在这里插入图片描述

返回控制台:

在这里插入图片描述

Httpservlet中为什么要根据请求方式的不同,调用不同方法?

由于参数的位置不一致,GET请求参数在请求行中,POST请求参数在请求体中为了能处理不同的请求方式,我们得在service()方法中进行判断,然后写不同的业务处理,这样能实现,但是每个Servlet类中都将有相似的代码,针对这个问题,我们可以将实现Servlet接口的这部分代码单独的写在一个类中,对其进行封装,其他的Servlet去继承这个类即可,这样一来,重复的代码被我们写在相同的类中,不仅提高了代码的复用率还减少了重复代码的书写率

HttpServlet使用步骤如下:

1:自定义MyHttpServlet类继承HttpServlet

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class MyHttpServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
	//重写service方法
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String method=request.getMethod();
        if("GET".equals(method)) {
            //get方式的处理逻辑
            doGet(servletRequest,servletResponse);
        }else if("POST".equals(method)) {
            //post方式的逻辑处理
            doPost(servletRequest,servletResponse);
        }
    }
	//创建dopost和doget方法,并将其作用域设置为protected---以便于子类能够使用
    protected void doPost(ServletRequest servletRequest, ServletResponse servletResponse) {
    }

    protected void doGet(ServletRequest servletRequest, ServletResponse servletResponse) {
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {

    }
}

2:创建另外的Servlet类,使之继承上面自定义的MyHttpServlet类,重写doget和dopost方法

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;

@WebServlet("/demo5")
public class Myservlet3 extends MyHttpServlet{


//改写dopost和doget方法
    @Override
    protected void doPost(ServletRequest servletRequest, ServletResponse servletResponse) {
       System.out.println("post..........");
    }
    @Override
    protected void doGet(ServletRequest servletRequest, ServletResponse servletResponse) {
        System.out.println("get...........");
    }

}

HttpServlet原理:获取请求方式,并根据不同的请求方式,调用不同的doxx方法

运行:

在这里插入图片描述

在这里插入图片描述

点击回车,返回控制台,doget方法被调用

在这里插入图片描述

编写html文件,并将其action改为和上述servlet类中相同的路径,注意html文件的位置

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
<form action="demo5" method="post">
    <input name="username"><input type="submit">
</form>
</body>
</html>

运行,在网页中输入html文件名,点击回车:

在这里插入图片描述

post方法被调用:

在这里插入图片描述

Servleturlpattern配置:

Servlet要想被访问,必须配置其访问路径(urlPattern)

1:一个Servlet,可以配置多个urlPattern

@webServlet(urlPatterns={"/demo1","/demo2"})

举例:

编写Myservlet方法,让其继承HttpServlet类,访问路径为:demo7/demo8

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(urlPatterns = {"/demo7","/demo8"})
	public class Myservlet4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo7 get..........");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

点击WebServlet,查看源码,我们会发现无论是value还是urlPattern的类型都为字符数组:

在这里插入图片描述

运行,通过demo7访问:

在这里插入图片描述

访问成功,get方法被成功调用:

在这里插入图片描述

改变访问路径,通过demo8进行访问:

在这里插入图片描述

同样访问成功:

在这里插入图片描述

urlPattern配置规则:

1:精确匹配

//配置路径中是以/开头的
配置路径:@WebServlet("/user/select")

//访问路径必须和配置路径完全对应
访问路径:localhost:8080/web-demo/user/select

2:目录匹配

配置路径:@WebServlet("/user/*")

//访问路径只要是user目录下的任何文件都可以被访问到
访问路径:localhost:8080/web-demo/user/aaa
				  localhost:8080/web-demo/user/bbb

注:当一个目录同时满足精确匹配和目录匹配时,精确匹配的优先级会高一些

3:扩展名匹配

配置路径:@WebServlet("*.do")
访问路径:localhost:8080/web-demo/aaa.do
				  localhost:8080/web-demo/bbb.do

注:除扩展名以外的所有匹配都是以/开头的,但扩展名这里我们不能加"/"

4:任意匹配

配置路径:@WebServlet("/")
				  @WebServlet("/*")
访问路径:localhost:8080/web-demo/hehe
				  localhost:8080/web-demo/haha

注:虽然"/"和"/*"都是任意匹配,但当二者同时存在时,"/*"的匹配优先级高于"/"

/和/*的区别:

当我们的项目中的Servlet配置了"/",会覆盖掉tomcat中的DefaultServelt,当其他的url-pattern都匹配不上时,都会走这个Servlet

当我们的项目中匹配了"/*",意味着匹配任意访问路径

但我们并不建议使用任意匹配的方式,因为这样会导致静态资源无法被访问举例:

当路径不是任意匹配时 [默认的服务器启动生效],访问静态资源:成功被访问

在这里插入图片描述

但当我们将路径的匹配方式修改为任意匹配后访问静态资源,如下所示:

在这里插入图片描述

原因为:静态路由器被覆盖,静态资源无法被访问,如下为Tomcat/conf目录下的web.xml中的内容,其中DefaultServlet是用来处理我们项目中静态资源的访问,当路径匹配是"/“或者”/*"时,DefaultServlet被覆盖,则导致静态资源无法被访问

在这里插入图片描述

因此我们并不推荐任意匹配路径的这种形式!

上述四种路径匹配的优先级为:

精确路径>目录路劲>扩展名路径>/*>/

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

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

相关文章

2023全球市场份额排名前五的浏览器,国产的为何没上榜

数据研究机构statcounter发布了PC端浏览器在2023年1月份的最新数据统计。Chrome浏览器凭借66.39%的全球份额稳居第一&#xff0c;Edge第二&#xff0c;Safari第三&#xff0c;Firefox第四&#xff0c;Opera第五。不难看出&#xff0c;在浏览器市场全球占有率排名前5中&#xff…

LeetCode 刷题系列 -- 304. 二维区域和检索 - 矩阵不可变

给定一个二维矩阵 matrix&#xff0c;以下类型的多个请求&#xff1a;计算其子矩形范围内元素的总和&#xff0c;该子矩阵的 左上角 为 (row1, col1) &#xff0c;右下角 为 (row2, col2) 。实现 NumMatrix 类&#xff1a;NumMatrix(int[][] matrix) 给定整数矩阵 matrix 进行初…

我去,竟可直接用命令行操作ChatGPT

ChatGPT 确实杀疯了&#xff0c;已经有 1亿 月活用户了&#xff0c;毕竟它真的有智能的样子。 我前些年还开发过智能客服系统&#xff0c;要是早点遇到 ChatGPT&#xff0c;估计可以省了不少事。 我想接下来有许多业务场景都会使用到它&#xff0c;比如教学&#xff0c;内容创…

OpenCV-PyQT项目实战(5)项目案例01图像模糊

欢迎关注『OpenCV-PyQT项目实战 Youcans』系列&#xff0c;持续更新中 OpenCV-PyQT项目实战&#xff08;1&#xff09;安装与环境配置 OpenCV-PyQT项目实战&#xff08;2&#xff09;QtDesigner 和 PyUIC 快速入门 OpenCV-PyQT项目实战&#xff08;3&#xff09;信号与槽机制 …

毫米波雷达人体存在感应营造更智能的生活

毫米波雷达人体存在感应的工作原理基于多普勒效应&#xff0c;精准度高、稳定性强&#xff0c;其可以穿透非金属物质&#xff0c;比如薄木板、衣服、塑料等物质。 科技改变生活&#xff0c;营造更智能化的生活&#xff0c;最重要的是能够对人体存在进行精准检测&#xff0c;人体…

Git多人协同远程开发

1. 李四&#xff08;项目负责人&#xff09;操作步骤 在github中创建远程版本库testgit将基础代码上传⾄testgit远程库远程库中基于main分⽀创建dev分⽀将 githubleaflife/testgit 共享给组员李四继续在基础代码上添加⾃⼰负责的模块内容 2. 张三、王五&#xff08;组员&…

【树和二叉树】数据结构二叉树和树的概念认识

前言&#xff1a;在之前&#xff0c;我们已经把栈和队列的相关概念以及实现的方法进行了学习&#xff0c;今天我们将认识一个新的知识“树”&#xff01;&#xff01;&#xff01; 目录1.树概念及结构1.1树的概念1.2树的结构1.3树的相关概念1.4 树的表示1.5 树在实际中的运用&a…

SpringBoot:拦截器,过滤器,打包与运行

目录 一、拦截器 1、创建实现类实现HandlerInterceptor 接口 2、注册拦截器对象 二、过滤器 拦截器与过滤器区别 三、打包运行windows版&#xff08;jar包&#xff0c;war包&#xff09; 1、打包为jar包 2、打包为 war包 一、拦截器 拦截器(Interceptor )是一种动态拦截…

二叉搜索树——BinarySearchTree

致前行的人&#xff1a; 要努力&#xff0c;但不要着急&#xff0c;繁花锦簇&#xff0c;硕果累累&#xff0c;都需要过程&#xff01; 目录 1.二叉搜索树 1.1二叉搜索树概念 1.2二叉搜索树的操作 1.3二叉搜索树的实现 2.4二叉搜索树的应用 2.5二叉搜索树的性能分析 2.二…

不用U盘 重装系统(别再浪费钱去电脑城装系统了)

不用U盘 重装系统&#xff08;别再浪费钱去电脑城装系统了&#xff09; 首先打开浏览器&#xff0c;搜索MSDN回车&#xff0c;选择第一个网站 点击操作系统 往下拉找到win10专业版 选择&#xff08;business editions&#xff09;和 (x64) 打开迅雷&#xff0c;点击新建&a…

高德地图开发实战案例:使用Loca数据源展示海量点标注(海量点、自定义分类图标、聚合、信息提示、3D控件)

系列文章目录 高德地图开发实战案例:弧线连接线标注高德地图开发智慧社区网格化数据格式产生的无法单击事件的解决方案高德地图进阶开发实战案例(1):webAPI坐标转换和jsAPI批量转换高德地图进阶开发实战案例(2):电子围栏&#xff08;多边形的绘制&#xff09;的展示高德地图进…

与chatGPT的第一次亲密接触

最近&#xff0c;chatGPT火了&#xff0c;不管传统媒体&#xff0c;还是各种自媒体平台都在说它。今天我突然也想注册一个玩玩&#xff0c;注册前2步还行&#xff0c;但是等点开邮箱校验时&#xff0c;打开网页显示&#xff1a; 上网查了一下&#xff0c;没向中国开放服务&…

Java高手速成 | 对象-关系的映射、映射对象标识符与JPA API的级联操作

01、对象-关系的映射概念 Java对象和关系数据库存在一些简单的映射关系&#xff0c;比如Customer类与CUSTOMERS表映射&#xff0c;一个Customer对象与CUSTOMERS表中的一条记录映射&#xff0c;Customer类的name属性与CUSTOMERS表的NAME字段映射。 但是&#xff0c;毕竟对象模型…

有了独自开,一个人就是一个团队

文章目录 简单介绍优点 优秀案例平台福利总结 简单介绍 独自开是一个基于商品与服务交易全流程的PaaS开发平台。对于开发者&#xff0c;独自开可以协助开发者一个人独自开发一套系统。 优点 独自开有独创的分层标准化平台架构&#xff0c;可以满足系统的任何个性化需求。 …

PICT:一款功能强大的信息收集和事件响应工具

关于PICT PICT是一款功能强大的信息收集和事件响应工具&#xff0c;该工具可以帮助广大研究人员在受感染的终端节点中收集各种信息&#xff0c;以辅助进行网络安全事件应急响应。这些数据可能不够完整&#xff0c;但确实能够捕捉到很多有价值的取证信息。如果你想要获取完整的…

搜广推 隐语义模型(LMF)与矩阵分解(MF)

😄 MF的出现就是为了解决CF处理稀疏矩阵能力弱的问题,增强泛化能力。挖掘用户和物品的隐含兴趣和隐含特征。 ⭐ 在这里隐语义模型LMF在这里也就是利用MF对用户评分矩阵分解出来的用户隐向量矩阵、物品隐向量矩阵,然后基于这两个矩阵就可以计算得分,完成推荐任务。 🚀 MF…

我猜这将是程序员副业接单赚外快的最好的平台!

文章目录一、前言二、【独自开】介绍2.1 分层标准化平台架构2.2 集成第三方数字接口2.3 支持各个行业的系统定制开发三、如何在【独自开】赚钱获取收益?3.1 如何称为【独自开】开发者?3.2 如何领取任务赚取收益四、【独自开】优秀案例4.1 家政服务平台4.2 优选商城五、【独自…

设计模式之观察者模式,以C++为例。

今天来准备浅浅的过一下观察者模式&#xff0c;观察者模式也叫作&#xff1a;发布者订阅者模式。该模式的特点是多个对象依赖一个对象&#xff0c;为一对多依赖关系&#xff0c;每当一个对象改变时&#xff0c;所有依赖它的对象都会得到通知并自动更新&#xff0c;该模式主要维…

MySQL数据同步到ES集群(MySQL数据库与ElasticSearch全文检索的同步)

简介&#xff1a;MySQL数据库与ElasticSearch全文检索的同步&#xff0c;通过binlog的设置对MySQL数据库操作的日志进行记录&#xff0c;利用Python模块对日志进行操作&#xff0c;再利用kafka的生产者消费者模式进行订阅&#xff0c;最终实现MySQL与ElasticSearch间数据的同步…

C++类和对象:面向对象编程的核心。| 面向对象还编什么程啊,活该你是单身狗。

&#x1f451;专栏内容&#xff1a;C学习笔记⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;日拱一卒&#xff0c;功不唐捐 文章目录一、前言二、面向对象编程三、类和对象1、类的引入2、类的定义Ⅰ、声明和定义在一起Ⅱ、声明和定义分开Ⅲ、成员变量命…