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

Tomcat 内核详解 - Web服务器机制

详细介绍

Apache Tomcat 是一个开源的Web服务器和Servlet容器,它实现了Java Servlet、JavaServer Pages (JSP) 和WebSocket规范。Tomcat的核心设计围绕着几个关键组件,它们共同构成了处理HTTP请求、管理Web应用部署和执行Servlet逻辑的基础架构。

Apache Tomcat,作为一款流行的开源Web服务器和Servlet容器,是许多Java Web应用程序的首选部署平台。它遵循Java Servlet、JavaServer Pages (JSP)、Expression Language和WebSocket规范,提供了一个强大而灵活的环境来运行Java Web应用。以下是Tomcat内核的几个核心组件及其工作原理的详细解析:

1. 连接器(Connectors)

连接器负责监听网络端口上的HTTP(或HTTPS)请求,并将这些请求转换为Tomcat内部能够处理的形式。Tomcat支持多种连接器类型,最常用的是基于Java NIO(非阻塞I/O)的org.apache.coyote.http11.Http11NioProtocol和传统的阻塞I/O模型的org.apache.coyote.http11.Http11AprProtocol(需要APR库支持)。连接器处理请求的生命周期包括接收、解码、响应编码和发送。

2. 协议处理器(Protocol Handlers)

连接器内部使用协议处理器来处理特定协议的请求,如HTTP/1.1。协议处理器将原始的Socket通信转换为Tomcat能够处理的Request对象,并在处理完成后生成Response对象。

3. 引擎(Engine)

引擎是连接器之上的一个层次,它代表了处理请求的顶级容器。引擎可以配置多个虚拟主机(Hosts),并负责将接收到的请求分配给适当的虚拟主机处理。

4. 虚拟主机(Hosts)

虚拟主机代表了运行在服务器上的一个逻辑Web服务器,每个Host可以有自己的应用部署、日志配置和文档根目录。在多租户或多个应用共享同一台物理服务器的情况下,虚拟主机提供了隔离和管理的便利。

5. 上下文(Contexts)

上下文代表了部署在Tomcat上的一个Web应用,是Tomcat处理请求的最小单位。每个上下文对应一个特定的Web应用,包括Servlet、JSP页面、静态资源等。每个上下文都有自己的部署描述符(WEB-INF/web.xml),用于配置应用的初始化参数、Servlet映射等。

6. Servlet容器

Tomcat的Servlet容器负责Servlet的生命周期管理,包括装载、初始化、服务请求和销毁。它根据web.xml中的配置来创建Servlet实例,并在接收到请求时调用相应的Servlet方法。

7. 类加载器(Class Loaders)

Tomcat为每个Web应用提供独立的类加载器,这有助于实现应用之间的隔离,允许不同应用使用相同类库的不同版本,同时也支持热部署和重载。

8. 线程池(Thread Pools)

Tomcat使用线程池来管理处理请求的工作线程,通过配置可以调整线程池的大小、超时等参数,以优化性能和资源利用率。

9. 安全组件

包括认证(Authentication)、授权(Authorization)和SSL/TLS支持,通过配置可以实现基本的Web应用安全防护。

Tomcat的内核设计围绕着高度模块化的组件,这些组件协同工作,为Java Web应用提供了一个高效、灵活且可扩展的运行环境。开发者可以通过配置这些组件来优化应用性能、管理资源、确保安全,以及实现复杂的应用部署架构。

使用场景

1. 开发与测试环境
  • 快速原型开发:由于其轻量级和易部署的特性,Tomcat是开发新Java Web项目的理想选择。开发者可以迅速搭建开发环境,进行代码编写、调试和初步测试。
  • 单元测试与集成测试:在持续集成/持续部署(CI/CD)流程中,Tomcat常被用作运行自动化测试的服务器,以验证应用的功能性和性能。
2. Web应用部署
  • 企业内部系统:如CRM系统、ERP系统、企业门户等,这些系统通常面向企业内部用户,要求较高的安全性及稳定性,Tomcat凭借其良好的稳定性和扩展性成为首选。
  • 电子商务网站:对于处理高并发交易、商品展示和用户管理等功能的电商网站,Tomcat配合合理的架构设计能够有效支撑业务需求。
  • 内容管理系统(CMS):如WordPress(通过Java桥接技术)、Joomla等,虽然原生不是为Java设计,但通过特定插件或适配层,也能在Tomcat上部署和运行。
3. 微服务架构
  • 微服务应用服务器:在微服务架构中,每个服务都可以独立部署和扩展。Tomcat因其轻量级,常被用作单个微服务的运行容器,便于管理和部署。
  • API Gateway:虽然Tomcat主要用于Web应用,但在某些场景下,它也可以作为API网关,托管RESTful API服务,尤其是当这些API与Java后端服务紧密集成时。
4. 教育与学习
  • 教学平台:在大学和在线课程中,Tomcat经常被用于教授Java Web开发的基础知识,因为它直接关联Java生态系统,且易于学生理解和操作。
  • 实验环境:学生和初学者可以在虚拟机或本地安装Tomcat,实践Servlet、JSP、Spring MVC等技术的学习。
5. 云服务与容器化
  • 云部署:在AWS、Azure、Google Cloud等云平台上,Tomcat可以轻松部署到云服务器或容器服务中,支持弹性伸缩和自动部署。
  • Docker容器:Tomcat非常适合容器化部署,通过Docker镜像,应用可以快速、一致地在任何支持Docker的环境中运行。
6. 开源社区项目
  • 开源软件:许多开源的Java Web应用选择Tomcat作为默认或推荐的运行环境,因为它的普及度和社区支持丰富。

实际开发中的使用详情

在实际开发中,Apache Tomcat的使用涉及多个方面,包括但不限于配置、部署、调试、性能调优和安全管理。以下是一些具体的操作和注意事项:

1. 安装与配置
  • 下载安装:从Apache官方网站下载最新稳定版的Tomcat,解压即可使用,无需安装。
  • 修改配置文件:主要配置文件包括server.xml(定义连接器、引擎、主机等)、web.xml(全局Web应用配置)、context.xml(上下文配置模板)。根据实际需求调整端口、连接器类型、JDBC资源、日志级别等。
  • 环境变量设置:可选地,设置JAVA_HOME环境变量指向正确的Java安装路径,以确保Tomcat使用期望的JDK版本。
2. 应用部署
  • 直接放置:将打包好的WAR文件直接放入webapps目录,Tomcat会自动解压部署。
  • 管理界面:通过Tomcat的Web管理界面进行应用的部署、停止、重启和删除操作。
  • 配置文件部署:在conf\Catalina\localhost目录下创建以应用名命名的XML文件,手动配置应用的上下文路径、参数等。
3. 日志管理
  • 日志配置:修改conf\logging.properties来调整日志输出级别、格式和目标。
  • 查看日志:Tomcat的日志文件通常位于logs目录下,包括catalina.out(主要日志)、localhost.*.log(本地主机日志)、manager.log(管理界面日志)等。
4. 性能调优
  • 调整线程池:在conf\server.xml中,通过修改Executor元素来调整线程池的大小、最大线程数、超时时间等。
  • 优化连接器:调整连接器的参数,如最大连接数、接受缓冲区大小、NIO/NIO2/APR的选择等,以匹配应用需求和硬件资源。
  • JVM调优:通过调整启动脚本中的JVM参数,如-Xms、-Xmx来优化内存分配,使用G1或ZGC垃圾收集器以提高响应速度。
5. 安全管理
  • 用户权限:配置conf\tomcat-users.xml,定义管理、部署、监控等角色的用户及其权限。
  • HTTPS配置:在conf\server.xml中配置SSL证书,启用HTTPS以加密通信。
  • 限制访问:使用conf\web.xml中的security-constraint标签来限制特定资源的访问。
6. 故障排查
  • 查看日志:遇到问题时,首先检查日志文件,寻找错误信息或异常堆栈。
  • 使用JMX监控:Tomcat支持JMX,可以远程监控和管理Tomcat的各项指标,如线程池状态、内存使用情况等。
  • 分析线程堆栈:当应用挂起或响应缓慢时,使用jstack命令获取Java进程的线程堆栈信息,定位死锁或长时间运行的任务。
7. 开发工具集成
  • IDE集成:大多数Java IDE(如IntelliJ IDEA、Eclipse)都支持与Tomcat集成,便于开发、调试和热部署。
  • 持续集成:在CI/CD流程中,通过Maven或Gradle插件配置,自动化部署应用到Tomcat服务器。
注意事项
  • 资源管理:确保应用资源(如数据库连接)得到正确管理和释放,避免内存泄漏。
  • 并发和线程池配置:根据应用负载调整Tomcat的线程池大小,避免资源耗尽或响应慢。
  • 安全性:关闭不必要的服务(如管理界面),配置SSL,定期更新Tomcat版本以修复安全漏洞。

优缺点

优点
  1. 开源免费:Tomcat作为Apache软件基金会的项目,是完全开源且免费的,降低了企业的部署成本。
  2. 轻量级:相比于其他重量级应用服务器(如WebLogic、WebSphere),Tomcat启动速度快,资源占用少,适合小型到中型项目。
  3. 易于部署和配置:Tomcat的安装和配置过程相对简单,通过修改几个配置文件就能满足大部分需求。
  4. 灵活性和可扩展性:支持多种连接器、自定义配置、JMX管理等,易于根据项目需求进行定制和扩展。
  5. 广泛的社区支持:拥有庞大的开发者社区,遇到问题时容易找到解决方案或技术支持。
  6. 良好的Java EE支持:虽然不如一些商业服务器全面,但Tomcat对Servlet、JSP、WebSocket等Java EE技术标准的支持足够满足多数应用需求。
  7. 容器化友好:Tomcat轻量级的特性使其很适合容器化部署,与Docker、Kubernetes等技术兼容性好。
缺点
  1. 管理界面简单:相较于商业服务器,Tomcat的管理界面功能较为基础,对于大规模部署和复杂管理需求可能不够用。
  2. 性能和稳定性:对于高并发、大流量的场景,虽然通过优化可以达到不错的表现,但相比于专为高负载设计的商业服务器,Tomcat在处理极端情况下的性能和稳定性可能略显不足。
  3. 缺乏高级特性:缺少一些商业服务器提供的高级功能,如集群管理、高级负载均衡、事务处理等。
  4. 安全配置:默认配置下,Tomcat的安全性较低,需要手动进行一系列安全加固,如禁用不安全的HTTP方法、配置HTTPS、限制访问等。
  5. JEE支持有限:虽然支持Servlet、JSP等核心标准,但对于完整的Java EE特性支持(如EJB、JMS)不如全面支持Java EE的服务器。

代码示例

Tomcat 部署及简单Servlet代码示例
1. 准备工作

首先,确保你已安装好Java开发环境(JDK)和Apache Tomcat服务器。本示例使用Tomcat 9作为演示环境。

2. 创建Servlet项目

使用IDE(如IntelliJ IDEA或Eclipse)创建一个新的Java Web项目,或者手动创建项目结构,至少需要以下结构:

myapp/|-- WEB-INF/|-- web.xml|-- src/|-- main/|-- java/|-- com.example.myapp/|-- MyServlet.java|-- webapp/|-- index.html
3. 编写Servlet代码

MyServlet.java中编写一个简单的Servlet类:

package com.example.myapp;import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();out.println("<h1>Hello from MyServlet!</h1>");out.println("<p>This is a simple servlet example.</p>");}
}

此Servlet会在接收到GET请求时,向浏览器返回一段简单的HTML信息。

4. 配置web.xml

WEB-INF/web.xml中配置Servlet的映射:

<?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/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><servlet-name>MyServlet</servlet-name><servlet-class>com.example.myapp.MyServlet</servlet-class></servlet><servlet-mapping><servlet-name>MyServlet</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping></web-app>

这段配置告诉Tomcat,当接收到以/hello结尾的请求时,应该由MyServlet来处理。

5. 部署应用
  • 将项目打包成WAR文件(一般IDE有自动打包功能),然后复制到Tomcat的webapps目录下。
  • 或者直接将项目目录(不打包)移动到webapps目录下,Tomcat会自动识别并部署。
6. 启动Tomcat并测试
  • 启动Tomcat服务器。
  • 打开浏览器,访问http://localhost:8080/myapp/hello(假设Tomcat运行在本地,端口为默认的8080)。

如果一切配置正确,你应该能看到Servlet响应的信息:“Hello from MyServlet!”和“这是一个简单的Servlet示例”。

注意事项
  • 确保你的IDE或命令行中使用的Java版本与Tomcat兼容。
  • 检查Tomcat的日志文件(通常位于logs/catalina.out),以获取启动和运行时的错误信息。
  • 在开发过程中,可以利用IDE的热部署功能来快速迭代Servlet代码,而无需每次修改后都重启Tomcat服务器。

可能遇到的问题及解决方案

在使用Apache Tomcat进行Web应用开发和部署的过程中,可能会遇到各种问题。以下是一些常见的问题及其解决方案:

1. 应用部署失败

问题:将应用部署到Tomcat时,发现应用没有启动,或者在访问时显示404错误。

解决方案

  • 检查logs/catalina.out文件,查看是否有详细的错误信息,如类找不到、配置错误等。
  • 确认web.xml中的Servlet映射是否正确。
  • 确保应用的WAR包已正确解压,且目录结构符合预期。
  • 检查Tomcat的server.xml配置,确认端口没有冲突,应用的上下文路径是否正确配置。
2. 内存溢出

问题:应用运行一段时间后,Tomcat崩溃,日志中出现OutOfMemoryError

解决方案

  • 调整JVM参数,增加堆内存大小,例如 -Xms1024m -Xmx2048m 分别设置了最小和最大堆内存。
  • 定期重启Tomcat服务,避免长时间运行积累内存泄漏。
  • 使用工具(如VisualVM)进行内存分析,找出内存泄漏的原因并修复。
3. 性能问题

问题:在高并发访问下,Tomcat响应变慢,甚至超时。

解决方案

  • 调整连接器(Connector)配置,如增加最大线程数(maxThreads)、调整接受缓冲区大小(acceptCount)。
  • 使用异步Servlet或 Comet处理长连接,减少线程占用。
  • 对应用进行性能分析,优化数据库查询、减少不必要的资源加载等。
4. 安全问题

问题:应用受到攻击,如SQL注入、跨站脚本攻击(XSS)等。

解决方案

  • 使用HTTPS,配置SSL以保护数据传输安全。
  • web.xml中添加合适的过滤器,如防止XSS攻击的过滤器。
  • 严格限制对管理界面的访问,设置强密码,使用安全的连接器配置(如禁用HTTP TRACE方法)。
5. 类加载冲突

问题:应用部署后,出现ClassNotFoundException或NoSuchMethodError等错误。

解决方案

  • 确认应用的类库是否与Tomcat自带的类库版本冲突,必要时更换或排除冲突的库。
  • 检查应用的类加载器配置,确保应用间和Tomcat本身的类加载隔离。
6. 日志过多

问题:Tomcat产生的日志文件过大,磁盘空间紧张。

解决方案

  • 调整日志级别,减少不必要的日志输出。
  • 设置日志滚动策略,如按时间或大小滚动日志文件,避免单个文件过大。
  • 定期清理旧日志文件。
7. 端口占用

问题:启动Tomcat时提示端口已被占用。

解决方案

  • 使用netstat -ano | findstr "端口号"(Windows)或lsof -i :端口号(Linux/Mac)查找占用端口的进程。
  • 关闭占用端口的进程,或修改Tomcat的server.xml,使用其他未被占用的端口。

针对以上问题,持续监控Tomcat的运行状态,合理配置和优化,可以显著提升应用的稳定性和性能。

相关文章:

Tomcat 内核详解 - Web服务器机制

详细介绍 Apache Tomcat 是一个开源的Web服务器和Servlet容器&#xff0c;它实现了Java Servlet、JavaServer Pages (JSP) 和WebSocket规范。Tomcat的核心设计围绕着几个关键组件&#xff0c;它们共同构成了处理HTTP请求、管理Web应用部署和执行Servlet逻辑的基础架构。 Apac…...

几个人脸库对于面部动作识别的功能比较

经粗略研究,insightface只能识别面部特征点的位置,根据这些位置不能直接推出一个人是否在睡觉。 OpenFace 是一个高级的面部行为分析工具,它能够识别和分析多种面部动作单位(Facial Action Coding System, FACS),这些动作单位是根据面部肌肉活动定义的。每个动作单位(A…...

IDEA 使用Alibaba Cloud Toolkit 实现远程 自动部署

安装插件 maven方式部署 配置服务器主机信息 配置发布到主机 单击Select 单击run 就可以将选择module的jar文件上传到服务器的指定位置了 Alibaba Cloud Toolkit 上传文件的方式部署...

蓝桥杯备战15.完全二叉树的权值

P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using namespace std; #define endl \n #define int long long const int N 2e510; int a[N]; signed main() {std::ios::sync_with_stdio(0),cin.ti…...

【前端】LayUI监听事件汇总

一、监听单选按钮事件 点击资源类型单选按钮时&#xff0c;请求后台接口&#xff0c;把接口返回的内容追加到选择资源下拉框内 HTML <div class"layui-form-item"><label class"layui-form-label">资源类型&#xff1a;</label><d…...

【多电压流程 Multivoltage Flow】- 5.特定工具使用建议(1.VCS NLP VC LP)

本章提供了关于使用Synopsys工具进行低功耗设计和分析的信息。它包含以下部分: • 使用VCS NLP和VC LP进行多电压验证 • 使用Design Compiler进行逻辑综合 • 使用IC Compiler进行设计规划 • 使用IC Compiler进行物理实现 • 使用IC Compiler II和Fusion Compiler进行物…...

Elasticsearch 实现word、pdf、txt、excel文档内容快速检索(保姆级教程)

本文主要讲解ES如何从提取文档中提取内容&#xff08;word、pdf、txt、excel等文件类型&#xff09;&#xff0c;实现快速检索文档内容实现。 特别说明一下&#xff0c;为什么用7.10.0版本&#xff0c;因为在项目中除了精确匹配的要求&#xff0c;也会有模糊查询&#xff08;关…...

[初学rust] 04_rust复合类型

rust复合类型 字符串 由于rust的字符串元素类型是u8(1字节),但是字符类型是unicode(4字节) 索引不能像C那样读取又由于String类型和&str类型都是utf-8编码&#xff0c;中文占3字节切片可能会导致崩溃 slice(切片) 切片就是对String类型中的一部分的引用&#xff0c;它…...

什么是Zoho CRM客户关系系统管理?

以客户为中心的商业时代&#xff0c;卓越的客户体验已成为企业持续增长与成功的关键,为了在这场激烈的市场竞争中脱颖而出&#xff0c;企业需要一套强大、灵活且智能的客户关系管理系统——Zoho CRM应运而生&#xff0c;它不仅是管理客户信息的工具箱&#xff0c;更是驱动业务增…...

青岛东软载波子公司东软载波微电子授权世强硬创代理,出货量累计超20亿颗

凭借业内独特的互联网推新模式&#xff0c;世强先进&#xff08;深圳&#xff09;科技股份有限公司&#xff08;下称“世强先进”&#xff09; 获得本土工业MCU企业——上海东软载波微电子有限公司&#xff08;下称“东软载波微电子”&#xff0c;英文&#xff1a;essemi&#…...

YOLO损失函数——SIoU和Focal Lossr损失函数解析

1. 概述 YOLO&#xff08;You Only Look Once&#xff09; 系列模型以其实时目标检测能力而闻名&#xff0c;其有效性在很大程度上归功于其专门设计的损失函数。在本文中&#xff0c;这里将深入探讨YOLO演进中不可或缺的各种YOLO损失函数&#xff0c;并重点介绍它们在PyTorch中…...

C++:编程世界的永恒之石

在编程的广袤领域中&#xff0c;C犹如一块永恒的基石&#xff0c;历经岁月的洗礼&#xff0c;依旧坚固而璀璨。它的深厚底蕴、强大功能和广泛的应用领域&#xff0c;使其成为无数程序员心中的信仰与追求。 一、C&#xff1a;历史与传承的交汇点 C的历史可追溯到上世纪80年代&…...

线上3D博物馆搭建简单吗?有何优势?有哪些应用场景?

随着科技的飞速发展&#xff0c;传统的博物馆参观方式正在经历一场前所未有的变革&#xff0c;在科技的“加持”下&#xff0c;不少博物馆凭借强大的技术、创意和美学实践&#xff0c;频频“出圈”&#xff0c;线上3D博物馆逐渐崛起&#xff0c;这不仅丰富了人们的文化体验&…...

Rust 语言的“命名空间” —— mod

在Rust中&#xff0c;虽然没有像C中的namespace这样的显式关键字&#xff0c;但是Rust通过模块&#xff08;mod&#xff09;系统提供了一种类似命名空间的功能。模块允许你将相关的代码组织在一起&#xff0c;并可以通过pub关键字来控制哪些项&#xff08;如函数、结构体、枚举…...

加速科技突破2.7G高速数据接口测试技术

随着显示面板分辨率的不断提升&#xff0c;显示驱动芯片&#xff08;DDIC&#xff09;的数据接口传输速率越来越高&#xff0c;MIPI、LVDS/mLVDS、HDMI等高速数据接口在DDIC上广泛应用。为满足高速数据接口的ATE测试需求&#xff0c;作为国内少数拥有完全自研的LCD Driver测试解…...

从0开始搭建一个react项目 第一 二 三天

从0开始搭建一个react项目 今天接到一个任务让我把原来用ext.js写的前端换成react写的&#xff0c;我好慌的&#xff0c;因为我就是一个小白&#xff0c;之前只做过简单的二次开发功能。唉&#xff0c;我只是一个领着微薄薪水的小实习生&#xff0c;为什么要有这个任务&#x…...

LSTM与GAN创新结合!模型性能起飞,准确率超98%

今天来聊一个深度学习领域非常具有创新性的研究方向&#xff1a;LSTM结合GAN。 LSTM擅长处理和记忆长期的时间依赖关系&#xff0c;而GAN可以学习复杂的数据分布并生成逼真的数据样本。通过充分结合两者的优势&#xff0c;我们可以增强模型对复杂数据的处理能力&#xff0c;提…...

E2E测试学习

一、什么是E2E测试 e2e(end to end)&#xff0c;也叫端到端测试&#xff0c;是一种用于测试应用程序流是否从头到尾按设计执行的方法。 执行端到端测试的目的是识别系统依赖关系&#xff0c;并确保在各种系统组件和系统之间传递正确的信息。端到端测试的目的是测试 整个软件的…...

基于死区补偿的永磁同步电动机矢量控制系统simulink仿真模型

整理了基于死区补偿的永磁同步电动机矢量控制系统simulink仿真&#xff0c;该模型使用线性死区补偿的PMSM矢量控制算法进行仿真&#xff0c;使用Foc电流双闭环 。 1.模块划分清晰&#xff0c;补偿前后仿真有对比&#xff0c;易于学习; 2.死区补偿算法的线性区区域可调; 3.自…...

GSCoolink GSV6125 替LT6711A HDMI2.0转Type-C/DP1.4

GSCoolink GSV6125 在 Type C/Dp monitor&#xff0c;线材&#xff0c;VR/AR&#xff0c;系统均有大量的应用机会&#xff0c;且目前只有龙迅LT6711A 竞争对手。 Gscoolink GSV6125是一款高性能、低功耗的HDMI 2.0转Type-C/DP1.4转换器。通过集成增强型微控制器&#xff0c;GS…...

【自然语言处理】【大模型】DeepSeek-V2论文解析

论文地址&#xff1a;https://arxiv.org/pdf/2405.04434 相关博客 【自然语言处理】【大模型】DeepSeek-V2论文解析 【自然语言处理】【大模型】BitNet&#xff1a;用1-bit Transformer训练LLM 【自然语言处理】BitNet b1.58&#xff1a;1bit LLM时代 【自然语言处理】【长文本…...

前端面试题日常练-day10 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末。 1. 下面哪个CSS属性用于设置元素的字体样式&#xff1f; a) font-size b) font-color c) font-style d) font-weight2. 如何在JavaScript中判断一个变量的类型&#xff1f; a) typeOfb) getTypec)…...

conan2 基础入门(04)-指定编译器(gcc为例)

conan2 基础入门(04)-指定编译器(gcc为例) 文章目录 conan2 基础入门(04)-指定编译器(gcc为例)⭐准备生成profile文件预备文件和Code ⭐使用指令预览正确执行结果可能出现的问题 ⭐具体讲解conancmake ENDsettings.yml ⭐准备 生成profile文件 # 生成默认profile文件&#xf…...

谈谈std::map的lower_bound

我们知道std::map内部是一个红黑树&#xff0c;放到std::map里的数据等有一个能比较大小的方法。它相当于java里面的TreeMap。 它里面有个lower_bound方法&#xff0c;返回一个迭代器&#xff0c;它指向map里第一个大于等于参数的元素。 方法的签名很简单&#xff0c;但是在不同…...

不知道代理IP怎么挑?一文带你了解挑选的关键点!

IP代理在如今的网络环境中扮演者至关重要的角色。通过使用代理IP&#xff0c;可以增强用户个人信息和网络的安全。但想要挑选到适合自己的代理IP&#xff0c;并非是一件易事。今天就为大家带来挑选代理IP的关键注意点&#xff0c;帮你轻松筛选出最佳的选择。 稳定性与速度&…...

java 并发线程应用

java 并发线程相关 线程状态 新建(NEW): 创建后尚未启动。可运行(RUNABLE): 正在 Java 虚拟机中运行。但是在操作系统层面,它可能处于运行状态,也可能等待资源调度(例如处理器资源),资源调度完成就进入运行状态。所以该状态的可运行是指可以被运行,具体有没有运行要看底层…...

Java面试八股文(SpringCloud篇)

****************************************************...

PWRWER

编译烧录完代码之后&#xff0c;按下复位键屏幕会进行刷新&#xff0c;数据不会丢失 如果按下按键&#xff0c;进行页擦除&#xff0c;之后再按下复位键&#xff0c;发现屏幕不会再进行刷新&#xff0c;原因是程序已经被擦除&#xff0c;损毁&#xff0c;无法运行&#xff0c;此…...

怎样恢复E盘里删了的文件夹,2024让EasyRecovery来帮你轻松恢复

使用EasyRecovery易恢复进行数据恢复非常简单。首先&#xff0c;用户需要选择需要恢复的数据类型&#xff0c;如文档、图片、视频等。然后&#xff0c;软件会对选定的存储设备进行全面扫描&#xff0c;以寻找可恢复的数据。在扫描过程中&#xff0c;用户可以预览部分已找到的文…...

OSPF实验

需求&#xff1a; 1、R6为ISP只能配置IP地址&#xff0c;R1-R5的环回为私有网段。 2、R1/4/5为全连的MGRE结构&#xff0c;R1/2/3为星型的拓扑结构&#xff0c;R1为中心站点。 3、所有私有的网段可以互相通讯&#xff0c;私有网段使用OSPF协议完成。 第一步、搭建拓扑并按如…...