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

Servlet 和 Spring MVC:区别与联系

前言

在 Java Web 开发中,Servlet 和 Spring MVC 是两个重要的技术。Servlet 是 Java Web 的基础组件,而 Spring MVC 是一个高级 Web 框架,建立在 Servlet 的基础之上,提供了强大的功能和易用性。这篇文章将从定义、原理、功能对比、应用场景等多个方面,详细介绍 Servlet 和 Spring MVC,并解析它们的区别与联系。


一、什么是 Servlet

1. 定义

Servlet 是 Java Web 应用的核心组件,是一种运行在服务器上的小程序,专门用于处理客户端的 HTTP 请求并生成动态响应。Servlet 是 Java EE 规范的一部分,定义了如何通过 Java 编写服务器端的 Web 应用。

2. 工作原理

Servlet 的核心思想是基于 请求-响应模型

  1. 客户端(通常是浏览器)发送 HTTP 请求。
  2. Web 容器(如 Tomcat)将请求路由到 Servlet。
  3. Servlet 处理请求,执行逻辑,生成并返回 HTTP 响应。

3. 核心组件

  • HttpServletRequest:表示客户端的请求对象,包含请求的所有信息(如请求参数、请求头等)。
  • HttpServletResponse:表示服务器的响应对象,包含响应的所有信息(如响应头、响应状态码、响应体等)。

4. Servlet 的生命周期

Servlet 的生命周期由 Web 容器管理,包含以下几个阶段:

  1. 初始化
    • Servlet 第一次被访问时,容器会加载 Servlet 类并调用 init() 方法完成初始化。
  2. 服务
    • 每次请求都会调用 service() 方法,根据请求的 HTTP 方法(GET、POST 等),调用对应的 doGet()doPost() 方法。
  3. 销毁
    • 在服务器关闭或卸载 Servlet 时,调用 destroy() 方法释放资源。

5. 示例代码

以下是一个简单的 Servlet 示例:

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {// 设置响应内容类型resp.setContentType("text/html");// 返回简单的 HTML 响应resp.getWriter().write("<h1>Hello, Servlet!</h1>");}
}

二、什么是 Spring MVC

1. 定义

Spring MVC 是基于 Spring 框架的一个 Web 开发模块,提供了 MVC(Model-View-Controller) 设计模式的完整实现。它简化了 Web 应用开发,提供了对请求映射、参数绑定、视图解析等功能的强大支持。

2. 核心思想

Spring MVC 通过 DispatcherServlet(前端控制器)将所有请求统一拦截并分发给具体的处理器(Controller),然后结合视图(View)生成响应。


3. Spring MVC 的架构

Spring MVC 的核心组件:

  1. DispatcherServlet
    • 前端控制器,负责接收和分发所有 HTTP 请求。
  2. HandlerMapping
    • 请求映射器,将 URL 映射到具体的控制器方法。
  3. Controller
    • 业务处理器,负责执行具体的逻辑。
  4. ModelAndView
    • 数据模型和视图对象,用于封装业务数据和返回的视图信息。
  5. ViewResolver
    • 视图解析器,将逻辑视图名解析为物理视图(如 JSP、Thymeleaf 页面)。
  6. View
    • 负责生成最终的响应内容(HTML、JSON 等)。

4. 工作流程

Spring MVC的工作流程_spring mvc 的工作流程-CSDN博客

  1. 客户端发送请求。
  2. DispatcherServlet 接收请求并委托给 HandlerMapping 找到对应的 Controller 方法。
  3. Controller 方法处理请求,返回数据(Model)和视图(View)。
  4. ViewResolver 将逻辑视图名解析为物理视图。
  5. 将数据渲染到视图,生成响应并返回给客户端。

5. 示例代码

以下是一个简单的 Spring MVC 示例:

Controller 类:

@Controller
public class HelloController {@GetMapping("/hello")@ResponseBodypublic String sayHello(@RequestParam String name) {return "<h1>Hello, " + name + "!</h1>";}
}

三、Servlet 和 Spring MVC 的区别

对比维度ServletSpring MVC
定位Java Web 开发的基础技术。基于 Servlet 构建的高级 Web 框架。
设计思想直接基于 HTTP 请求-响应模型。基于 MVC(Model-View-Controller)设计模式。
开发复杂度较高,需要手动解析请求和生成响应。较低,提供自动化功能(如参数绑定、视图解析)。
功能丰富度功能较少,需要自行实现扩展(如请求映射、数据绑定)。功能丰富,内置请求映射、表单验证、异常处理等功能。
请求映射静态 URL 映射,直接通过 Web 容器配置路由。灵活的动态映射,支持正则表达式、RESTful URL 等。
视图支持需要手动拼接 HTML 或 JSP 页面。支持多种视图技术(JSP、Thymeleaf、JSON 等)。
表单验证需要手动校验参数。提供注解式校验(如 @Valid@NotNull)。
异常处理需要在代码中显式捕获异常并处理。提供全局异常处理机制(如 @ControllerAdvice)。
扩展性扩展性有限,需通过 Filter 或 Listener 实现一些通用功能。提供拦截器机制,支持 AOP 和依赖注入,扩展性极强。
学习曲线入门简单,但复杂项目开发难度大。需要学习 Spring 框架基础,初学者学习曲线稍陡。
适用场景小型项目或需要直接操作 HTTP 请求的场景。中大型项目,特别是需要高扩展性和快速开发的场景。

四、Servlet 和 Spring MVC 的联系

尽管 Servlet 和 Spring MVC 在定位和功能上有所不同,但它们之间有着密切的联系:

1. 基于 Servlet 构建

  • Spring MVC 是构建在 Servlet 基础之上的高级框架。
  • Spring MVC 的核心组件 DispatcherServlet 本质上是一个 Servlet,它负责接收和分发请求。

2. Servlet 是 Spring MVC 的基础

  • Spring MVC 使用 Servlet 来处理 HTTP 请求,但屏蔽了复杂的细节,例如参数解析、请求分发等。

3. Spring MVC 依赖 Servlet 容器

  • Spring MVC 必须运行在支持 Servlet 的 Web 容器(如 Tomcat、Jetty)中。
  • Servlet 容器负责加载和管理 DispatcherServlet

五、什么时候选择 Servlet 或 Spring MVC

1. 使用 Servlet

  • 适合小型项目,功能简单。
  • 希望深入理解 Java Web 的底层原理。
  • 不需要复杂的框架支持,能够手动实现请求处理和响应。

2. 使用 Spring MVC

  • 适合中大型项目,功能复杂。
  • 需要高效开发、灵活配置和良好的扩展能力。
  • 希望享受 Spring 框架的生态系统(如 Spring Data、Spring Security 等)。

示例代码

假设我们需要构建一个简单的 Web 服务:

  • 请求路径:http://localhost:8080/hello?name=Tom
  • 返回内容:Hello, Tom!

完整 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 注解映射路径 "/hello"
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {// 初始化 Servlet(只执行一次)@Overridepublic void init() throws ServletException {super.init();System.out.println("Servlet 初始化完成!");}// 处理 GET 请求@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 设置响应内容类型resp.setContentType("text/html;charset=UTF-8");// 获取请求参数String name = req.getParameter("name");if (name == null || name.isEmpty()) {name = "World"; // 默认值}// 返回动态响应resp.getWriter().write("<h1>Hello, " + name + "!</h1>");}// 销毁 Servlet(只执行一次,用于释放资源)@Overridepublic void destroy() {super.destroy();System.out.println("Servlet 已被销毁!");}
}

代码优化点

  1. 注解简化配置:
    • 使用 @WebServlet 注解代替传统的 web.xml 配置。
  2. 默认参数处理:
    • 如果用户未传递参数,返回默认的 "World"。
  3. 字符编码:
    • 通过 resp.setContentType("text/html;charset=UTF-8") 设置字符编码,防止中文乱码。
  4. 日志输出:
    • init()destroy() 方法中添加日志信息,便于调试。

如何运行

  1. 将代码打包为 .war 文件,并部署到 Tomcat。
  2. 访问 URL:http://localhost:8080/hello?name=Tom
  3. 返回结果:Hello, Tom!

Spring MVC 实现

Spring MVC 的实现更加简洁且功能强大。以下代码实现相同的功能。

Controller 类

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class HelloController {// 处理 GET 请求,映射路径 "/hello"@GetMapping("/hello")@ResponseBodypublic String sayHello(@RequestParam(name = "name", required = false, defaultValue = "World") String name) {// 返回动态内容return "<h1>Hello, " + name + "!</h1>";}
}

Spring Boot 主类

如果使用 Spring Boot 构建项目,可以通过以下代码快速启动:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringMvcApplication {public static void main(String[] args) {SpringApplication.run(SpringMvcApplication.class, args);}
}

代码优化点

  1. 注解驱动开发:
    • 使用 @Controller@GetMapping 注解处理请求,简化了配置。
  2. 自动参数绑定:
    • 使用 @RequestParam 自动从请求中提取参数,同时设置默认值。
  3. 自动响应:
    • 通过 @ResponseBody 将返回的字符串直接作为响应体,省去了手动处理 HttpServletResponse
  4. Spring Boot 快速启动:
    • 使用 Spring Boot 自动化配置,无需单独部署到 Tomcat。

如何运行

  1. 将代码保存为一个 Spring Boot 应用。
  2. 运行主类 SpringMvcApplication
  3. 访问 URL:http://localhost:8080/hello?name=Tom
  4. 返回结果:Hello, Tom!

示例场景扩展

为了更好地理解 Servlet 和 Spring MVC 的应用场景,我们再扩展一个功能:根据用户输入返回 JSON 数据。

Servlet 示例(返回 JSON 数据)

import com.google.gson.Gson;
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;
import java.util.HashMap;
import java.util.Map;@WebServlet("/json")
public class JsonServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 设置响应类型为 JSONresp.setContentType("application/json;charset=UTF-8");// 获取请求参数String name = req.getParameter("name");if (name == null || name.isEmpty()) {name = "World";}// 构造响应数据Map<String, String> responseData = new HashMap<>();responseData.put("message", "Hello, " + name + "!");// 将数据转换为 JSONString jsonResponse = new Gson().toJson(responseData);// 返回 JSON 响应resp.getWriter().write(jsonResponse);}
}

Spring MVC 示例(返回 JSON 数据)

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;@RestController
public class JsonController {@GetMapping("/json")public Map<String, String> sayHello(@RequestParam(name = "name", required = false, defaultValue = "World") String name) {// 构造响应数据Map<String, String> response = new HashMap<>();response.put("message", "Hello, " + name + "!");return response;}
}

doGet()doPost()service() 的区别

特性service()doGet()doPost()
定位通用方法,用于处理所有 HTTP 请求类型。专门用于处理 HTTP GET 请求。专门用于处理 HTTP POST 请求。
调用方式由 Web 容器直接调用。service() 方法根据 HTTP 请求方法分发调用。service() 方法根据 HTTP 请求方法分发调用。
实现目的自动分发请求到对应的 doXxx() 方法。处理只读请求(如查询数据)。处理数据提交(如表单、文件上传)。
开发者重写很少被重写,通常由 Web 容器托管。常被重写以处理 GET 请求。常被重写以处理 POST 请求。
请求语义无特定语义,作为分发入口。遵循 HTTP GET 请求的语义(幂等)。遵循 HTTP POST 请求的语义(非幂等)。

六、总结

区别

  • Servlet 是 Java Web 开发的基础技术,提供了直接操作 HTTP 请求和响应的能力,适合小型项目或需要深入了解底层原理的场景。
  • Spring MVC 是一个基于 Servlet 的高级 Web 框架,提供了大量的自动化功能和开发便利性,适合中大型项目。

联系

  • Spring MVC 是建立在 Servlet 技术之上的框架,它通过 DispatcherServlet 实现请求的接收和分发。
  • Servlet 是 Spring MVC 的基础,但 Spring MVC 封装了许多底层细节,使开发更高效。

相关文章:

Servlet 和 Spring MVC:区别与联系

前言 在 Java Web 开发中&#xff0c;Servlet 和 Spring MVC 是两个重要的技术。Servlet 是 Java Web 的基础组件&#xff0c;而 Spring MVC 是一个高级 Web 框架&#xff0c;建立在 Servlet 的基础之上&#xff0c;提供了强大的功能和易用性。这篇文章将从定义、原理、功能对…...

【君正T31开发记录】12.编译工具相关总结及介绍

移植交叉工具包的时候&#xff0c;发现这是很多工具的集合包&#xff1b;以及写makefile的时候&#xff0c;也需要了解下这些工具的作用及用法&#xff0c;这里总结记录一下常见的工具及相关用法。 g C编译器&#xff0c;用于编译C源代码文件&#xff0c;这个很常见&#xff0…...

Python 开发框架搭建简单博客系统:代码实践与应用

在当今数字化时代&#xff0c;博客作为一种流行的信息分享和交流平台&#xff0c;拥有广泛的受众。Python 以其强大的功能和丰富的库&#xff0c;为构建博客系统提供了理想的技术支持。本文将详细介绍如何利用 Python 开发框架搭建一个简单博客系统&#xff0c;包括功能实现、代…...

Java 正则表达式入门与应用(详细版)

正则表达式&#xff08;Regular Expression&#xff0c;简称Regex&#xff09;是一种文本模式匹配工具&#xff0c;在许多编程语言中都得到了广泛应用。Java 作为一种强大的编程语言&#xff0c;提供了对正则表达式的内建支持&#xff0c;使得在字符串处理、数据验证和文本解析…...

高效内存管理与调试技巧:深入解析 AddressSanitizer

在现代 C开发中&#xff0c;内存管理是一个至关重要但也容易出错的领域。即使使用了智能指针和其他高效工具&#xff0c;复杂的项目仍可能出现内存泄漏、非法访问等问题。为了解决这些问题&#xff0c;Google 开发了一个强大的工具——AddressSanitizer (ASan)。本文将详细介绍…...

力扣第137题:只出现一次的数字 II C语言解法

力扣第137题&#xff1a;只出现一次的数字 II C语言解法 题目描述 给定一个整数数组 nums&#xff0c;其中每个元素出现三次&#xff0c;除了一个元素出现一次。找出那个只出现一次的元素。 说明&#xff1a; 你的算法应该具有线性时间复杂度。你不可以使用额外的空间&…...

【Qt】控件概述和QWidget核心属性1(enabled、geometry、windowTitle、windowIcon、QRC机制)

一、控件概念 界面上各种元素、各种部分的统称&#xff08;如按钮、输入框、下拉框、单选复选框...&#xff09; Qt作为GUI开发框架&#xff0c;内置了各种的常用控件&#xff0c;并支持自定义控件。 二、控件体系发展 1.没有完全的控件&#xff0c;需要使用绘图API手动绘制…...

25年1月更新。Windows 上搭建 Python 开发环境:PyCharm 安装全攻略(文中有安装包不用官网下载)

python环境没有安装的可以点击这里先安装好python环境&#xff0c;python环境安装教程 安装 PyCharm IDE 获取 PyCharm PyCharm 提供两种主要版本——社区版&#xff08;免费&#xff09;和专业版&#xff08;付费&#xff09;。对于初学者和个人开发者而言&#xff0c;社区…...

软件工程大复习之(四)——面向对象与UML

4.1 面向对象概述 面向对象&#xff08;OO&#xff09;是一种编程范式&#xff0c;它将数据和处理数据的方法封装在对象中。面向对象的主要概念包括&#xff1a; 对象&#xff1a;实例化的数据和方法的集合。类&#xff1a;对象的蓝图或模板。封装&#xff1a;隐藏对象的内部…...

前端基础函数算法整理应用(sort+reduce+date+双重for循环)

文章目录 基础函数算法reduce 函数算法sort 函数算法时间排序1. 对日期字符串数组进行排序2. 对包含日期对象的数组进行排序3. 对包含时间戳的数组进行排序4. 对包含日期时间信息的对象数组进行排序 基础函数算法 一、排序算法 冒泡排序&#xff08;Bubble Sort&#xff09; …...

web系统漏洞攻击靶场

摘 要 互联网极速发展的同时&#xff0c;也会带来一些安全性的风险&#xff0c;一些不为人知的安全问题也逐渐暴露出来。近年来&#xff0c;媒体不断披露了许多网络安全事故&#xff0c;许多网络应用程序被黑客攻击&#xff0c;导致内部数据外泄&#xff0c;人们开始认识到网络…...

苍穹外卖-day07(Spring Cache 购物车业务逻辑)

内容 缓存菜品缓存套餐添加购物车查看购物车清空购物车 功能实现&#xff1a;缓存商品、购物车 效果图&#xff1a; 1. 缓存菜品 1.1 问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增…...

win10 VS2019上libtorch库配置过程

win10 VS2019上libtorch库配置过程 0 引言1 获取libtorch2 在VS上配置使用libtorch库3 结语 0 引言 &#x1f4bb;&#x1f4bb;AI一下&#x1f4bb;&#x1f4bb;   libtorch库是一个用于深度学习的C库&#xff0c;是PyTorch的官方C前端。它提供了用于构建和训练深度学习模…...

git 常用命令和本地合并解决冲突

目录 一、常用命令 二、本地可视化合并分支解决冲突 一、常用命令 最近&#xff0c;使用mac电脑&#xff0c;无法直接使用小乌龟进行可视化操作&#xff0c;现在记录一些常用命令。 拉取&#xff1a; git clone <git url> 仅拉起某个单独分支&#xff1a; git clo…...

Elasticsearch 创建索引 Mapping映射属性 索引库操作 增删改查

Mapping Type映射属性 mapping是对索引库中文档的约束&#xff0c;有以下类型。 text&#xff1a;用于分析和全文搜索&#xff0c;通常适用于长文本字段。keyword&#xff1a;用于精确匹配&#xff0c;不会进行分析&#xff0c;适用于标签、ID 等精确匹配场景。integer、long…...

Objective-C语言的数据结构

Objective-C语言中的数据结构 Objective-C是一种面向对象的编程语言&#xff0c;其在苹果公司的软件开发中得到了广泛应用。它主要用于开发macOS和iOS应用程序。虽然Objective-C有许多丰富的特性&#xff0c;但在程序设计中&#xff0c;数据结构仍然是构建任何应用程序的基础。…...

智能水文:ChatGPT等大语言模型如何提升水资源分析和模型优化的效率

大语言模型与水文水资源领域的融合具有多种具体应用&#xff0c;以下是一些主要的应用实例&#xff1a; 1、时间序列水文数据自动化处理及机器学习模型&#xff1a; ●自动分析流量或降雨量的异常值 ●参数估计&#xff0c;例如PIII型曲线的参数 ●自动分析降雨频率及重现期 ●…...

ETL的工作原理

ETL的工作原理 什么是ETL_云计算主题库-阿里云 ETL的工作原理可以分为三个主要的步骤&#xff1a;Extract&#xff08;提取&#xff09;、Transform&#xff08;转换&#xff09;、Load&#xff08;加载&#xff09;。 工作步骤 描述 Extract &#xff08;提取&#xff09;…...

黑马头条平台管理实战

黑马头条 08平台管理 1.开始准备和开发思路1.1.开发网关1.2编写admin-gateway 代码 2.开发登录微服务2.1编写登录微服务 3.频道管理4.敏感词管理5.用户认证审核6.自媒体文章人工审核99. 最后开发中碰到的问题汇总1.关于nacos 配置 问题2.在开发频道管理新增频道后端无法接收到前…...

电池管理系统(BMS)架构详细解析:原理与器件选型指南

BMS&#xff08;电池管理系统&#xff09;架构详细讲解 从你提供的BMS&#xff08;Battery Management System&#xff09;架构图来看&#xff0c;主要涉及到电池监控模块、通信模块、功率控制模块等部分。下面我将详细讲解该架构的各个功能模块及其工作原理。 1. 电池管理核…...

SpringBoot环境和Maven配置

SpringBoot环境和Maven配置 1. 环境准备2. Maven2.1 什么是Maven2.2 为什么要学 Maven2.3 创建一个 Maven项目2.4 Maven核心功能2.4.1 项目构建2.4.2 依赖管理2.4.3 Maven Help插件 2.5 Maven 仓库2.5.1本地仓库2.5.2 中央仓库2.5.3 私有服务器, 也称为私服 2.6 Maven设置国内源…...

lambda用法及其原理

目录 lambda形式lambda用法1.sort降序2.swap3.捕捉列表 习题解题 lambda形式 [capture-list](parameters)->return type{function boby}[capture-list]&#xff1a;[捕捉列表]用于捕捉函数外的参数&#xff0c;可以为空&#xff0c;但不能省略&#xff1b;(parameters) &am…...

Postgresql源码(139)vim直接修改postgresql表文件的简单实例

1 前言 PG可以用pageinspect方便的读取查看表文件。本篇介绍一种用vim查看、编辑的方法&#xff0c;案例比较简单&#xff0c;主要分享原理。 修改表文件和controlfile是非常危险的行为&#xff0c;请不要在生产尝试。 2 用例 简化问题&#xff0c;用简单编码的数据类型。 d…...

Lianwei 安全周报|2025.1.2

以下是本周「Lianwei周报」&#xff0c;我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件&#xff0c;保证大家不错过本周的每一个重点&#xff01; 政策/标准/指南最新动态 01 国家数据局等五部门印发《关于促进企业数据资源开发利用的意见》 为充分释放企业…...

Vue3-跨层组件通信Provide/Inject机制详解

Vue 3 中的 Provide 和 Inject 机制是专为跨层级传递数据而设计的&#xff0c;适用于祖先组件和后代组件之间的通信。与props 和 emits 不同&#xff0c;Provide/Inject 可以跨越多个层级进行数据传递&#xff0c;而不需要逐层传递。 1. Provide provide 是一个在祖先组件中提…...

springcloud 介绍

Spring Cloud是一个基于Spring Boot的微服务架构解决方案集合&#xff0c;它提供了一套完整的工具集&#xff0c;用于快速构建分布式系统。在Spring Cloud的架构中&#xff0c;服务被拆分为一系列小型、自治的微服务&#xff0c;每个服务运行在其独立的进程中&#xff0c;并通过…...

css预处理器sass

在前端开发的世界中&#xff0c;CSS 是构建网页样式的基础。然而&#xff0c;随着项目规模的增大&#xff0c;纯 CSS 的编写和维护往往会变得复杂而繁琐。为了解决这些痛点&#xff0c;Sass&#xff08;Syntactically Awesome Style Sheets&#xff09;应运而生。Sass 是一种 C…...

匠人天工Ai浮雕网站创新发布了ZBrush插件,提效500%,为AI+数字雕刻行业带来新的活力

2025年1月6日&#xff0c;杭州——杭州仓颉造梦数字科技公司旗下产品匠人天工近日宣布推出一款创新的ZBrush插件&#xff0c;旨在为AI数字雕刻行业带来前所未有的效率提升。该插件通过一系列智能化功能&#xff0c;大幅简化了数字雕刻的建模流程&#xff0c;使建模效率提高了50…...

解决 Pangolin 版本不兼容导致的编译错误

在使用 Pangolin 库时&#xff0c;有时候会遇到由于版本不兼容而导致的编译错误。本文将通过一个具体的错误案例&#xff0c;展示如何识别和解决这种问题。 问题描述 在编译时&#xff0c;遇到如下编译错误&#xff1a; /usr/local/include/pangolin/gl/glsl.hpp: In member…...

day01_ Java概述丶开发环境的搭建丶常用DOS命令

编程常识 什么是编程&#xff1f; 所谓编程&#xff0c;就是人们可以使用编程语言对计算机下达命令&#xff0c;让计算机完成人们需要的功能。 编程语言的发展历程 第一代&#xff1a;机器语言 &#xff0c;机器语言由数字组成所有指令。计算器解析运行速度&#xff0c;最快…...

进程间通信——网络通信——UDP

进程间通信&#xff08;分类&#xff09;&#xff1a;网络通信、无名管道、有名管道、信号、消息队列、共享内存、信号量集 OSI七层模型&#xff1a;&#xff08;理论模型&#xff09; 应用层 : 要传输的数据信息&#xff0c;如文件传输&#xff0c;电子邮件等 表示层 : 数…...

(六)vForm 动态表单(数据量大,下拉选卡顿问题)

系列文章目录 (一)vForm 动态表单设计器之使用 (二)vForm 动态表单设计器之下拉、选择 (三)vForm 动态表单解决下拉框无数据显示id问题 (四)vForm 动态表单自定义组件、属性 (五)vForm 动态表单文件上传、下载 文章目录 目录 前言 一、组件改造 1.添加分页所需参…...

asp.net core mvc的 ViewBag , ViewData , Module ,TempData

在 ASP.NET MVC 和 ASP.NET Core MVC 中&#xff0c;ViewBag 和 ViewData 是两种用于将数据从控制器传递到视图&#xff08;View&#xff09;的常用方法。它们都允许控制器将动态数据传递给视图&#xff0c;但它们的实现方式有所不同。关于 Module&#xff0c;它通常指的是某种…...

C#语言的软件开发工具

C#语言的软件开发工具 C#语言作为一种现代化的编程语言&#xff0c;凭借其强大的功能和丰富的生态系统&#xff0c;在软件开发领域得到了广泛的应用。随着C#语言的发展&#xff0c;越来越多的开发工具应运而生。本文将详细介绍C#语言常用的开发工具&#xff0c;包括集成开发环…...

iOS - AutoreleasePool

1. 基本数据结构 // AutoreleasePool 的基本结构 struct AutoreleasePoolPage {static pthread_key_t const key AUTORELEASE_POOL_KEY;magic_t const magic;id *next; // 指向下一个可存放对象的地址pthread_t const thread; // 所属线程AutoreleasePoolPage …...

数据仓库建设方案和经验总结

在做数据集成的过程中&#xff0c;往往第二步的需求就是建设数仓由于数据分散在不同的存储环境或数据库中&#xff0c;对于新业务需求的开发需要人工先从不同的数据库中同步、集中、合并等处理&#xff0c;造成资源和人力的浪费。同时&#xff0c;目前的系统架构&#xff0c;无…...

该单据从未生成交易分录

经常听到采购说&#xff0c;采购匹配明细表中没有xx料号的记录&#xff0c;没有xx供应商的记录。它们用这个报表来与供应商对账的。每每以此为借口拖延着货款不付。没有记录出来&#xff0c;原因各种。之前没有记录下来&#xff0c;想不起来。今天重新分析发现其中一个原因&…...

Flink DataSet API

文章目录 DataSet SourcesDataSet TransformationDataSet Sink序列化器样例一&#xff1a;读 csv 文件生成 csv 文件样例二&#xff1a;读 starrocks 写 starrocks样例三&#xff1a;DataSet、Table Sql 处理后写入 StarRocksDataSet<Row> 遍历遇到的坑 分类&#xff1a;…...

Bash Shell的操作环境

目录 1、路径与指令搜寻顺序 2、bash的进站&#xff08;开机&#xff09;与欢迎信息&#xff1a;/etc/issue&#xff0c;/etc/motd &#xff08;1&#xff09;/etc/issue &#xff08;2&#xff09;/etc/motd 3、bash的环境配置文件 &#xff08;1&#xff09;login与non-…...

web自动化测试环境搭建(python环境下selenium)

环境搭建步骤 安装selenium pip install selenium 安装浏览器 安装浏览器驱动 谷歌浏览器&#xff1a;chromdriver.exe ie浏览器:ieserverdriver.exe FireFox浏览器:geckodriver.exe 特别注意⚠️&#xff1a;下载驱动版本必须与浏览器版本一致 下载地址 淘宝镜像&#xff1…...

解决cursor AI编辑器控制台console中文乱码

chcp 查看当前控制台编码 936 &#xff1a; gbk编码 控制台输入&#xff1a;chcp 65001 设置为utf8...

fail api scope is not declared in the privacy agreement微信小程序uniapp 解决录音无法播放、授权

已解决 fail api scope is not declared in the privacy agreement微信小程序uniapp 解决录音无法播放、授权 没有声明内容协议导致的 微信公众平台&#xff1a;https://mp.weixin.qq.com/【1.左下角的-移动过去后会出现 “帐号设置”】 【2.基本设置->服务内容声明->修…...

ArkTs 状态管理装饰器

在构建页面多为静态界面&#xff0c;如果希望构建一个动态的&#xff0c;有交互的界面&#xff0c;就需要引入‘状态’的概念。 一.基本概念 1.状态变量&#xff1a;被状态装饰器装饰的变量&#xff0c;状态变量值的改变或引起UI的渲染更新 2.常规变量&#xff1a;没有被状态…...

Linux CentOS 7系统如何修改panel 重新打开最小化的界面/软件/程序

CentOS 7系统下&#xff0c;部分用户可能一开始打开界面没有类似Windows的下方菜单栏&#xff0c;只有一个浮动的panel。一旦打开软件&#xff0c;然后点击最小化后&#xff0c;找不到重新打开的方法。 右键panel&#xff0c;点击Add New Items… 选择以下三个基本就可以了&am…...

猫的眼睛有几种颜色?

在猫咪神秘而迷人的世界里&#xff0c;它们的眼睛犹如璀璨星辰&#xff0c;闪烁着各异的光芒&#xff0c;颜色丰富多样&#xff0c;令人着迷。 猫眼睛的颜色&#xff0c;粗略一数&#xff0c;常见的便有黄色、蓝色、绿色、棕色&#xff0c;还有那神秘的异瞳。这些色彩并非无端生…...

200道Java面试题(2025)

Java 基础 1. JDK 和 JRE 有什么区别&#xff1f; JDK&#xff1a;Java Development Kit 的简称&#xff0c;Java 开发工具包&#xff0c;提供了 Java 的开发环境和运行环境。 JRE&#xff1a;Java Runtime Environment 的简称&#xff0c;Java 运行环境&#xff0c;为 Java …...

ros2笔记-2.5.3 多线程与回调函数

本节体验下多线程。 python示例 在src/demo_python_pkg/demo_python_pkg/下新建文件&#xff0c;learn_thread.py import threading import requestsclass Download:def download(self,url,callback):print(f线程&#xff1a;{threading.get_ident()} 开始下载&#xff1a;{…...

openwrt nginx UCI配置过程

openwrt 中nginx有2种配置方法&#xff0c;uci nginx uci /etc/config/nginx 如下&#xff1a; option uci_enable true‘ 如果是true就是使用UCI配置&#xff0c;如果 是false&#xff0c;就要使用/etc/nginx/nginx.conf&#xff0c;一般不要修改。 如果用UCI&#xff0c;其…...

【数据结构】双向循环链表的使用

双向循环链表的使用 1.双向循环链表节点设计2.初始化双向循环链表-->定义结构体变量 创建头节点&#xff08;1&#xff09;示例代码&#xff1a;&#xff08;2&#xff09;图示 3.双向循环链表节点头插&#xff08;1&#xff09;示例代码&#xff1a;&#xff08;2&#xff…...

《Python游戏编程入门》注-第9章8

2 游戏信息的显示 在游戏窗口的上部会显示游戏分数、游戏关卡、剩余砖块数以及剩余小球数等信息,如图12所示。 图12 游戏信息显示 使用如图13所示的代码实现以上功能。 图13 显示游戏信息的代码 其中,print_text()函数MyLibrary....