Java web后端2 Servlet Maven HttpServlet ServletConfig ServletContext HTTP协议

创建项目

新建项目

Java Enterprise
JDK1.8
Web Application
Tomcat
JAVA
在这里插入图片描述
默认
在这里插入图片描述
过程需要联网

Maven的配置

IDEA内置Maven
在这里插入图片描述
修改本地仓库位置,因为以后会越来越大
替换配置文件:
阿里云镜像下载
在这里插入图片描述

Servlet基础

在这里插入图片描述

1.动态Web资源开发

2.Servlet是使用Java语言编写的运行在服务器端的程序,Servlet由Servlet容器提供,所谓的Servlet容器是指提供了Servlet 功能的服务器(本书中指Tomcat),Servlet容器将Servlet动态的加载到服务器上。

3.Servlet是指任何实现了这个Servlet接口的类,Servlet主要用于处理客户端传来的HTTP请求,并返回一个响应,它能够处理的请求有doGet()和doPost()等方法。

请求静态资源(图片,文档等):读出来后直接返回响应

请求Servlet:
Servlet的请求首先会被HTTP服务器接收,HTTP服务器只负责静态HTML页面的解析,对于Servlet的请求转交给Servlet容器,Servlet容器会根据web.xml文件中的映射关系,调用相应的Servlet,Servlet将处理的结果返回给Servlet容器,并通过HTTP服务器将响应传输给客户端。

Servlet容器:一段内存空间
在这里插入图片描述

Servlet技术特点

Servlet技术具有如下特点:
1.方便:Servlet提供了大量的实用工具例程,如处理很难完成的HTML表单数据、读取和设置HTTP头,以及处理Cookie和跟踪会话等。
2.跨平台:Servlet用Java类编写,可以在不同操作系统平台和不同应用服务器平台下运行。
3.灵活性和可扩展性:采用Servlet开发的Web应用程序,由于Java类的继承性及构造函数等特点,使得应用灵活,可随意扩展。
4.除了上述几点外,Servlet还具有功能强大、能够在各个程序之间共享数据、安全性强等特点。

抽象类与接口

抽象类与接口:抽象类只能单继承,接口可以多继承。

相同点

(1)都不能被实例化
(2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。

不同点

(1)接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。

(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。

(3)接口强调特定功能的实现,而抽象类强调所属关系。

(4)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。

Servlet抽象方法

SUN公司提供了一系列接口和类,其中最重要的接口是javax.servlet.Servlet。在Servlet接口中定义了5个抽象方法

1.servlet生命周期:由servlet容器自动调用,所以返回值为void
init(),service(),destory()

2.servletCofig():一个servlet类对应一个servlet实例,有一个servletCofig(),所以每个servletCofig()都不同

3.void service():servletRequest请求对象,serveltResponse()请求响应
在这里插入图片描述
其中init()、service()和destroy()这三个方法可以表现Servlet的生命周期,它们会在某个特定的时刻被调用。另外,getServletInfo()方法用于返回Servlet的相关信息。getServletConfig()方法用于返回ServletConfig对象,该对象包含Servlet的初始化信息。需要注意的是,表中提及的Servlet容器指的是Web服务器。

service()被具体化为其他不同需要的调用方法,如GenericServlet(),HttpServlet()

servlet接口实现类

针对Servlet的接口,SUN公司提供了两个默认的接口实现类:GenericServlet和HttpServlet。
GenericServlet是一个抽象类,该类为Servlet接口提供了部分实现,它并没有实现HTTP请求处理。

HttpServlet是GenericServlet的子类,它继承了GenericServlet的所有方法,并且为HTTP请求中的POST、GET等类型【总共8种,常用两种】提供了具体的操作方法。【编程直接使用!! !】

HttpServlet的常用方法及其说明如下表所示:
在这里插入图片描述
HttpServlet示例:
在这里插入图片描述

IDEA中创建Servlet

1.新建servlet:
new-servlet
在这里插入图片描述
2.
虚拟地址映射,java servlet–》URL
1)基于注解的方式在这里插入图片描述

2)使用webapp-WEB-INF-web.xml中配置,[xml文件方式]
在这里插入图片描述
在这里插入图片描述

注意:使用新建servlet的方式,会在web.xml中创建servlet
在这里插入图片描述

3.写好之后,启动Tomcat
http://localhost:端口号/当前工程根路径/

http://localhost:8082/WebServletProject_war_exploded/
在这里插入图片描述
要访问的具体servlet:
http://localhost:8082/WebServletProject_war_exploded/servlet_1

http://localhost:端口号/当前工程根路径/value的值
在这里插入图片描述
修改样式后要重启Tomcat

报错:servlet不能映射为一个url模式

Caused by: java.lang.IllegalArgumentException: 名为 [servlet_2]和 [Servlet_1] 的servlet不能映射为一个url模式(url-pattern) [/servle]

注意:注解配置的value和web.xml中的配置

启动程序时自动加载Servlet程序

适用于数据库servlet加载
在这里插入图片描述
web.xml代码:
在这里插入图片描述

servlet请求的分发处理-get()和post()

get_post.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--get方法-->
<form action="http://localhost:8082/WebServletProject_war_exploded/servlet_2" method="get"><input type="submit">
</form>
<!--post方法-->
<form action="http://localhost:8082/WebServletProject_war_exploded/servlet_2" method="post"><input type="submit">
</form>
</body>
</html>

Servlet_2.java:

    @Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("3.访问");//类型转换,使用ServletRequest 子类 HttpServletRequest的getMethod()方法HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;//获取请求的方式:GET POSTString method = httpServletRequest.getMethod();//打印System.out.println(method);if (method.equals("GET")) {System.out.println("get方式");} else if (method.equals("POST")) {System.out.println("post方式");}}

使用:
在这里插入图片描述

通过继承HttpServlet实现Servlet程序

在这里插入图片描述

案例:

package nsu.edu.cn.WebServletProject;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;// value = "/servlet_1"[类名,首字母小写]--URL路径
// name不重要,可以省略value【默认】,如:@WebServlet("/servlet_1")
@WebServlet(name = "Servlet_1", value = "/servlet_1")
//响应实体内容-展示在客户端,所有的响应使用HttpServletResponse response
//获取用户请求--HttpServletRequest request
public class Servlet_1 extends HttpServlet {//用户敲回车--是get方式@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//输出一个字符串//response.getWriter().write("hello world!");// html5标签response.getWriter().write("<h2>hello world!!!!!!!</h2>");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//调用dogGet,在post时也输出字符串doGet(request, response);}
}
//虚拟地址映射,java servlet--》URL
//1.基于注解的方式
//2.使用webapp-WEB-INF-web.xml中配置

Servlet常见错误

在这里插入图片描述

在这里插入图片描述

Servlet-url定位servlet程序访问

在这里插入图片描述

servlet生命周期

将Servlet的生命周期分为三个阶段,分别是初始化阶段、运行阶段和销毁阶段。

第一次访问,才会创建实例和初始化【3,4】
如果不是第一次访问,则没有3,4步骤
在这里插入图片描述
ServletConfig使用1:

public class Servlet_2 implements Servlet {public Servlet_2() {System.out.println("1.构造器");}@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("2.初始化");}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("3.访问");}@Overridepublic void destroy() {System.out.println("4.销毁");}

在Tomcat运行时,可以把工程移除;但服务器没关闭,工程一直在容器中

在这里插入图片描述

1.初始化阶段
当客户端向Servlet容器发出HTTP请求要求访问Servlet时,Servlet容器首先会解析请求,检查内存中是否已经有了该Servlet对象,如果有直接使用该Servlet对象,如果没有就创建Servlet实例对象,然后通过调用init()方法实现Servlet的初始化工作。需要注意的是,在Servlet的整个生命周期内,它的init()方法只被调用一次。

2.运行阶段
这是Servlet生命周期中最重要的阶段,在这个阶段,Servlet容器会为这个请求创建代表HTTP请求的ServletRequest对象和代表HTTP响应的ServletResponse对象,然后将它们作为参数传递给Servlet的service()方法。service()方法从ServletRequest对象中获得客户请求信息并处理该请求,通过ServletResponse对象生成响应结果。在Servlet的整个生命周期内,对于Servlet的每一次访问请求,Servlet容器都会调用一次Servlet的service()方法,并且创建新的ServletRequest和ServletResponse对象,也就是说,service()方法在Servlet的整个生命周期中会被调用多次。

3.销毁阶段
当服务器关闭或web应用被移除出容器时,Servlet随着web应用的销毁而销毁。在销毁Servlet之前,Servlet容器会调用Servlet的destroy()方法,以便让Servlet对象释放它所占用的资源。在Servlet的整个生命周期中,destroy()方法也只被调用一次。需要注意的是,Servlet对象一旦创建就会驻留在内存中等待客户端的访问,直到服务器关闭,或web应用被移除出容器时Servlet对象才会销毁。

Servlet类的继承体系

在这里插入图片描述

ServletConfig类的使用

在这里插入图片描述
在Servlet运行期间,经常需要一些辅助信息,例如,文件使用的编码、使用Servlet程序的共享等,这些信息可以在web.xml文件中使用一个或多个<init-param>元素进行配置。

当Tomcat初始化一个Servlet时,会将该Servlet的配置信息封装到一个ServletConfig对象中,通过调用init(ServletConfig config)方法将ServletConfig对象传递给Servlet。

ServletConfig类的方法:
在这里插入图片描述
web.xml代码:
在这里插入图片描述

java代码:

  @Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("2.初始化");//1.获取servlet程序的别名servlet-name的值: <servlet-name>servlet_1</servlet-name>System.out.println("别名:"+servletConfig.getServletName());
//2.获取初始化参数init-param <init-param>中的参数名和参数值System.out.println("参数:"+servletConfig.getInitParameter("username"));System.out.println("参数:"+servletConfig.getInitParameter("userport"));System.out.println("参数:"+servletConfig.getInitParameterNames());//3.获取servletContext对象System.out.println("对象:"+servletConfig.getServletContext());}

ServletConfig使用2:
在这里插入图片描述

重写了init()方法,一定要调用super.init(config),调用父类的init()方法
在这里插入图片描述

ServletContext类的使用

介绍:
当Servlet容器启动时,会为每个Web应用创建一个唯一的ServletContext对象代表当前Web应用,该对象不仅封装了当前Web应用的所有信息,而且实现了多个Servlet之间数据的共享。
操作范围:整个web工程
在这里插入图片描述

作用:
存取数据:先存入,否则为null;
在这里插入图片描述
1.获取Web应用程序的初始化参数

在web.xml文件中,不仅可以配置Servlet的初始化信息,还可以配置整个Web应用的初始化信息。

<context-param>元素位于根元素中,它的子元素<param-name>和<param-value>分别用来指定参数的名字和参数值。

要想获取这些参数信息,可以使用ServletContext接口,该接口中定义的getInitParameterNames()getInitParameter(String name)方法分别用来获取参数名和参数值。

2.实现多个Servlet对象共享数据

由于一个Web应用中的所有Servlet共享同一个ServletContext对象,因此ServletContext对象的域属性可以被该Web应用中的所有Servlet访问。

在ServletContext接口中定义了分别用于增加、删除、设置ServletContext域属性的四个方法
在这里插入图片描述
3.读取Web应用下的资源文件

在实际开发中,有时候可能会需要读取Web应用中的一些资源文件,比如配置文件,图片等。

为此,在ServletContext接口中定义了一些读取Web资源的方法,这些方法是依靠Servlet容器来实现的。

Servlet容器根据资源文件相对于Web应用的路径,返回关联资源文件的IO流、资源文件在文件系统的绝对路径等。
在这里插入图片描述

示例:
web.xml:
在这里插入图片描述

<!--SerletContext的上下文参数,属于整个工程,可以配置多组--><context-param><param-name>name</param-name><param-value>dq</param-value></context-param><context-param><param-name>age</param-name><param-value>20</param-value></context-param><!--不同的url映射在同一个xml上-->

Servlet_3.java

public class Servlet_3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.获取web.xml中配置的上下文参数//获取上下文对象//写法2: getServletConfig().getServletContext();ServletContext servletContext = getServletContext();//获取上下文参数String name = servletContext.getInitParameter("name");String age = servletContext.getInitParameter("age");System.out.println("context:name=" + name + " age=" + age);//2.获取当前的工程名路径:/工程路径System.out.println("当前工程路径:"+servletContext.getContextPath());//3.获取工程部署后在服务器硬盘上的绝对路径/*/被服务器解析地址为:http://ip:port/工程名/映射到IDEA代码的web目录* */System.out.println("工程部署的路径:"+servletContext.getRealPath("/"));System.out.println("工程下css目录的绝对路径:"+servletContext.getRealPath("/css"));System.out.println("工程下jsp1目录的绝对路径:"+servletContext.getRealPath("/jsp/jsp1.js"));//        context:name=dq age=20
//        当前工程路径:/WebServletProject_war_exploded
//        工程部署的路径:D:\CodeProject\JavaWeb_DQ\WebServletProject\target\WebServletProject-1.0-SNAPSHOT\
//        工程下css目录的绝对路径:D:\CodeProject\JavaWeb_DQ\WebServletProject\target\WebServletProject-1.0-SNAPSHOT\css
//        工程下jsp1目录的绝对路径:D:\CodeProject\JavaWeb_DQ\WebServletProject\target\WebServletProject-1.0-SNAPSHOT\jsp\jsp1.js//4.像Map一样存取数据servletContext.setAttribute("key1","v1");servletContext.setAttribute("key2","u");//唯一的上下文对象System.out.println(servletContext);System.out.println("v1="+servletContext.getAttribute("key1"));System.out.println("v2="+servletContext.getAttribute("key2"));}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

Servlet_4.java

public class Servlet_4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//所有工程类都可以获取Context的存取数据ServletContext context=getServletContext();//唯一的上下文对象System.out.println(context);System.out.println("v1="+context.getAttribute("key1"));System.out.println("v2="+context.getAttribute("key2"));}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

ServletContext读取配置文件类中信息properties

新建my.properties
在这里插入图片描述

在这里插入图片描述
写入内容:
在这里插入图片描述
ReadProperties .java代码:

public class ReadProperties extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置服务器与客户端的字符集为UTF-8response.setContentType("text/html; charset=UTF-8");ServletContext context = getServletContext();//获取my.properties资源的真实路径//HTTP状态 500 - 内部服务器错误:路径/my.propertiesString RealPath = context.getRealPath("/WEB-INF/classes/my.properties");//字符输入流,读取my.properties资源FileReader fileReader = new FileReader(RealPath);//初始化配置文件类Properties properties = new Properties();//加载my.properties文件properties.load(fileReader);//properties.getProperty("name")获取my.properties资源中的信息,通过键值对方式String print = "name=" + properties.getProperty("name") + " address=" + properties.getProperty("address") + " age=" + properties.getProperty("age");response.getWriter().write(print);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

使用的地址

String RealPath = context.getRealPath("/WEB-INF/classes/my.properties");

浏览器中:
在这里插入图片描述

HTTP协议

介绍
在这里插入图片描述

请求的HTTP协议格式:
1)GET请求:
【】表示可选
在这里插入图片描述

GET请求的HTTP协议内容:
在这里插入图片描述
2)POST请求
在这里插入图片描述

POST请求的HTTP协议内容:
在这里插入图片描述
HTTP常用请求头说明
在这里插入图片描述

HTTP的GET与POST请求
在这里插入图片描述

响应的HTTP协议格式
在这里插入图片描述

在这里插入图片描述
常见的响应码:
在这里插入图片描述

MIME类型说明

RTF:文本

在这里插入图片描述

浏览器中查看HTTP协议

谷歌:
检查-网络-Headers
在这里插入图片描述
MricoSoft Edge浏览器:
检查-网络-全部-标头
在这里插入图片描述

IE浏览器:
在IE浏览器-查看源-网络
在这里插入图片描述

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

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

相关文章

STL源码剖析 配接器

配接器(adapters)在 STL组件的灵活组合运用功能上&#xff0c;扮演着轴承、转换器的角色。Adapter这个概念&#xff0c;事实上是一种设计模式(design pattern)。 Design Patterns)) 一书提到23个最普及的设计模式&#xff0c;其中对odopter样式的定义如下&#xff1a;将 一个cl…

中科大 计算机网络3 网络边缘Edge

网络结构 边缘系统 网络核心 接入网 方块&#xff1a;边缘系统(主机) 圆的&#xff1a;网络核心&#xff0c;数据交换作用 连接边缘系统和网络核心的叫做接入网&#xff08;access&#xff09;&#xff0c;把边缘的主机接入到网络核心&#xff08;所以是分布式的&#xff09; …

STL源码剖析 入门开始 STL概论与版本简介

源代码之中时而会出现一些全局函数调用操作&#xff0c;尤其是定义于<stl_construct.h> 之中用于对象构造与析构的基本函数&#xff0c;以及定义于<stl_uninitialized.h>之 中 用 于 内 存 管 理 的 基 本 函 数 &#xff0c; 以及定义于<stl_algobase.h>之中…

中科大 计算机网络4 网络核心Core 分组交换 电路交换

网络核心 电路交换&#xff08;线路交换&#xff09;&#xff1a;打电话之前&#xff0c;先建立一条链路&#xff08;物理&#xff09; 分组交换&#xff1a;存储转发的方式 电路交换&#xff08;线路交换&#xff09; 通过信令&#xff08;控制信息&#xff0c;如&#xf…

STL 源码剖析 空间配置器

以STL的运用角度而言&#xff0c;空间配置器是最不需要介绍的东西&#xff0c;它总是隐藏在一切组件&#xff08;更具体地说是指容器&#xff0c;container&#xff09; 的背后但是STL的操作对象都存放在容器的内部&#xff0c;容器离不开内存空间的分配为什么不说allocator是内…

中科大 计算机网络7 分组延迟 分组丢失 吞吐量

分组丢失和延迟的原因 队列太长没有意义&#xff0c;用户需求 排队&#xff1a;输出能力<到来的分组&#xff0c;需要等待 四种分组延迟 节点处理延迟&#xff1a;确定的 排队延迟&#xff1a;随机&#xff0c;取决于网络情况 一个比特的传输时间&#xff1a; R1Mbps …

STL源码剖析 迭代器iterator的概念 和 traits编程技法

iterator模式定义如下&#xff1a;提供一种方法&#xff0c;使之能够依序巡访某个 聚合物(容器)所含的各个元素&#xff0c;而又无需暴露该聚合物的内部表述方式.STL的中心思想在于&#xff1a;将数据容器(containers)和算法(algorithms)分开&#xff0c;彼此独立设计&#xff…

中科大 计算机网络11 应用层原理

应用层大纲 传输层向应用层提供的服务&#xff0c;形式是Socket API&#xff08;原语&#xff09; 一些网络应用的例子 互联网层次中&#xff0c;应用层协议最多 流媒体应用&#xff1a;直播 网络核心最高的层次就是网络层 应用进程通信方式 C/S&#xff1a; 客户端&…

STL源码剖析 序列式容器 vector 和 ilist

Vector list 单向链表 ilistlist的删除操作&#xff0c;也只有指向被删除元素的迭代器会失效&#xff0c;其他迭代器不会受到影响

中科大 计算机网络5 接入网和物理媒体

接入网 接入网&#xff1a;把边缘&#xff08;主机&#xff09;接入核心&#xff08;路由器&#xff0c;交换机&#xff09; 骨干网【连接主机和主机】和接入网中都有物理媒体 接入方式&#xff1a;有线和无线 带宽共享/独享 接入网&#xff1a;住宅接入modem modem调制解调…

STL源码剖析 序列式容器 deque双端队列

相较于vector的内存拷贝&#xff0c;deque在内存不足时只需要进行内存的拼接操作即可&#xff0c;不需要重新配置、复制、释放等操作&#xff0c;代价就是迭代器的架构不是一个普通的指针&#xff0c;比较复杂d e q u e 的迭代器 deque是分段连续空间。维持其“整体连续”假象…

中科大 计算机网络6 Internet结构和ISP

互联网的结构 端系统通过接入ISPs接入互联网 n个ISP互相连接&#xff1a; IXP,Internet exchage point:互联网接入点&#xff0c;互联网交互点 ISP&#xff1a;互联网服务提供商&#xff0c;提供接入&#xff0c;提供网络【中国移动&#xff0c;中国电信】 ICP&#xff1a…

STL源码剖析 Stack栈 queue队列

随机迭代器用于随机数据访问&#xff0c;所以栈stack不具备此功能

中科大 计算机网络8 协议层次和服务模型

协议层次 协议层次&#xff1a;现实生活中的例子 分层 分层处理和实现复杂系统 图中&#xff0c;左边是模块&#xff0c;右边是分层 计算机的设计是分层&#xff0c;每一层实现一个或一组功能&#xff0c;下层向上层提供服务&#xff1b;但效率比较低 对等层实体通过协议来交换…

STL源码剖析 heap堆结构

heap一般特指max-heap&#xff0c;即最大的元素位于heap和array的首部 heap不提供遍历功能&#xff0c;也不提供迭代功能

中科大 计算机网络9 互联网历史

总纲 计算机网络 早期1960以前 1961-1972 NCP协议&#xff1a;相当于现在的TCP和IP协议 每个节点即是数据的源也是数据的目标

STL源码剖析 序列式容器 slist

STL l i s t 是个双向链表(double linked lis t) 。SGI STL提供了一个单向链 表 (single linked lis t) , 名 为 slist s l i s t 和 l i s t 的主要差别在于&#xff0c;前者的迭代器属于单向的Forwardlterotor, 后者的迭代器属于双向的Bidirectional Iterator.为此&#xff0…

中科大 计算机网络12 Web和HTTP

Web与HTTP 对象&#xff1a;web页中其实是对象链接 URL&#xff1a;通用资源定位符【任何对象都可以使用URL来唯一标识】 用户名&#xff1a;口令【支持匿名访问&#xff0c;用户名和口令不计】 端口&#xff1a;HTTP&#xff1a;80 FTP&#xff1a;21【使用默认端口号&#x…

STL源码剖析 关联式容器 树 红黑树、二叉搜索树、平衡二叉搜索树

所谓关联式容器&#xff0c;观念上类似关联式数据库(实际上则简单许多)&#xff1a;每笔数据(每个元素)都有一个键值(key)和一个实值(value) 2。当元素被插入到关联式 容器中时&#xff0c;容器内部结构(可能是RB-tree,也可能是hash-table)便依照其键 值大小&#xff0c;以某种…