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

HTML 表单处理进阶:验证与提交机制的学习心得与进度(二)

步步为营:表单提交机制全面解析

提交方式详解

GET 与 POST 对比

在 HTML 表单提交中,GET 和 POST 是最为常用的两种提交方式,它们在诸多方面存在显著差异。

  • 安全性:GET 方式将表单数据附加在 URL 的查询字符串中,数据会明文显示在浏览器地址栏中,这使得数据极易被他人获取,如通过查看浏览器历史记录、网络监控等手段,因此安全性较低,不适合用于提交敏感信息,如用户密码、银行卡号等。例如,当使用 GET 方式提交登录表单时,用户名和密码会暴露在 URL 中,一旦该 URL 被泄露,用户信息将面临极大风险。而 POST 方式将数据放置在 HTTP 请求的消息体中,地址栏中不会显示提交的数据,相对而言更加安全,能有效保护敏感信息不被轻易窥探 。
  • 数据量限制:GET 方式由于受 URL 长度限制,一般情况下允许提交的数据量较小,通常为 2048 个字符左右,不同浏览器可能有所差异。当提交的数据量超过这个限制时,数据可能会被截断,导致提交失败或数据丢失。比如在进行复杂搜索时,如果搜索条件较多且较长,使用 GET 方式可能无法完整提交所有条件。POST 方式对提交的数据量没有严格限制,理论上可以提交大量数据,适用于需要提交大量文本、文件上传等场景,如用户的详细注册信息、大文件上传等 。
  • 应用场景:GET 方式适用于获取数据或进行简单查询操作,因为其提交的数据会显示在 URL 中,方便进行书签标记、分享链接等操作,并且浏览器会对 GET 请求的结果进行缓存,能提高页面加载速度。例如,在搜索引擎中输入关键词进行搜索,使用 GET 方式将关键词作为参数传递给服务器,服务器返回搜索结果,用户可以方便地分享搜索链接给他人。POST 方式则常用于需要创建新资源、提交表单数据、上传文件等操作,如用户注册、订单提交、文件上传等场景,确保数据的安全性和完整性 。
其他提交方式简介

除了 GET 和 POST 这两种常见的提交方式外,HTTP 协议还定义了其他一些方法,如 PUT、DELETE 等,它们在特定的表单提交场景中也有应用。

  • PUT:PUT 方法主要用于更新服务器上的指定资源。在表单提交中,当需要对已有的数据进行完整更新时,可以使用 PUT 方式。例如,在用户个人信息管理页面,用户修改了自己的姓名、联系方式等信息后提交表单,此时可以使用 PUT 方法将新的信息发送到服务器,服务器根据提交的数据更新对应的用户记录。PUT 方法要求客户端提供完整的资源数据,服务器会用新数据替换原有资源的内容。
  • DELETE:DELETE 方法用于删除服务器上的指定资源。在表单提交场景中,当需要删除某个资源时,可以通过表单触发 DELETE 请求。比如在一个文件管理系统中,用户选择要删除的文件后提交表单,表单使用 DELETE 方法将文件的唯一标识发送到服务器,服务器根据该标识删除对应的文件。DELETE 操作通常是不可逆的,使用时需要谨慎确认 。
  • PATCH:PATCH 方法用于对资源进行部分更新,与 PUT 方法不同,它只需要提交需要更新的部分数据,而不是整个资源的完整数据。在表单提交中,如果用户只想修改资源的某几个字段,如只修改用户的昵称或头像,使用 PATCH 方法可以更高效地进行数据传输和更新操作,减少不必要的数据传输量 。

表单提交事件与处理

原生提交事件

在 HTML 表单中,onsubmit 事件是一个非常重要的原生事件,它在表单提交时触发,开发者可以利用这个事件在表单数据发送到服务器之前进行各种数据处理和验证操作。

当用户点击表单的提交按钮(<input type="submit">或<button type="submit">)时,会触发 onsubmit 事件。在事件处理函数中,可以编写 JavaScript 代码来检查表单数据的有效性,如检查必填字段是否已填写、数据格式是否正确等。如果验证通过,返回true,表单将正常提交;如果验证失败,返回false,表单将不会被提交,并阻止默认的提交行为。

例如,在一个简单的登录表单中,验证用户名和密码是否为空:

 

<form onsubmit="return validateForm()">

<input type="text" name="username" placeholder="请输入用户名">

<input type="password" name="password" placeholder="请输入密码">

<input type="submit" value="登录">

</form>

<script>

function validateForm() {

const username = document.getElementsByName('username')[0].value;

const password = document.getElementsByName('password')[0].value;

if (username === '' || password === '') {

alert('用户名和密码不能为空');

return false;

}

return true;

}

</script>

在上述代码中,当用户点击 “登录” 按钮时,会调用validateForm函数进行验证。如果用户名或密码为空,弹出提示框并返回false,阻止表单提交;只有当用户名和密码都不为空时,才返回true,允许表单提交。

使用 JavaScript 提交表单

除了通过原生的提交按钮触发表单提交外,还可以使用 JavaScript 代码来手动触发表单提交,并且可以动态构建表单数据,这在一些复杂的业务场景中非常有用。

通过 JavaScript 获取表单元素后,可以调用其submit()方法来触发表单提交。例如:

 

<form id="myForm" action="submit.php" method="post">

<input type="text" name="username" placeholder="请输入用户名">

<input type="password" name="password" placeholder="请输入密码">

</form>

<button onclick="submitForm()">提交</button>

<script>

function submitForm() {

const form = document.getElementById('myForm');

form.submit();

}

</script>

在这个例子中,点击 “提交” 按钮时,会调用submitForm函数,函数中获取表单元素并调用submit()方法,从而触发表单提交。

在动态构建表单数据方面,可以使用FormData对象。FormData对象允许以一种简单键值对的形式来构造表单数据,并且可以方便地添加文件等复杂数据类型。例如,动态添加表单字段并提交:

 

<form id="myForm" action="submit.php" method="post">

</form>

<button onclick="buildAndSubmitForm()">提交</button>

<script>

function buildAndSubmitForm() {

const form = document.getElementById('myForm');

const formData = new FormData(form);

formData.append('username', 'John');

formData.append('password', '123456');

// 假设要上传文件

const fileInput = document.createElement('input');

fileInput.type = 'file';

fileInput.name = 'avatar';

// 模拟选择了一个文件(实际应用中需用户选择)

const file = new File(['file content'], 'avatar.jpg', { type: 'image/jpeg' });

formData.append('avatar', file);

const xhr = new XMLHttpRequest();

xhr.open('POST','submit.php', true);

xhr.onreadystatechange = function() {

if (xhr.readyState === 4 && xhr.status === 200) {

console.log(xhr.responseText);

}

};

xhr.send(formData);

}

</script>

在上述代码中,buildAndSubmitForm函数创建了一个FormData对象,动态添加了用户名、密码和文件等表单数据,然后使用XMLHttpRequest对象将表单数据发送到服务器,实现了表单的动态构建和提交 。

提交后的处理与响应

当表单成功提交到服务器后,服务器会根据业务逻辑进行处理,并返回相应的结果。前端需要根据服务器的响应来进行后续的处理,常见的处理方式包括页面跳转、数据更新、错误提示等。

页面跳转

在一些情况下,表单提交成功后,需要将用户重定向到另一个页面,如用户注册成功后跳转到登录页面,订单提交成功后跳转到支付页面或订单详情页面等。可以使用 JavaScript 的window.location.href属性来实现页面跳转。例如:

 

<script>

// 假设服务器返回的响应中包含一个重定向的URL

const response = { redirectUrl: 'payment.html' };

if (response.redirectUrl) {

window.location.href = response.redirectUrl;

}

</script>

也可以在 HTML 表单的<form>标签中设置target属性,配合服务器端的重定向响应,实现页面跳转。例如,设置target="_blank"可以在新窗口中打开重定向页面:

 

<form action="submit.php" method="post" target="_blank">

<!-- 表单元素 -->

</form>

当服务器返回重定向响应(如 HTTP 状态码 302,并在响应头中包含Location字段指定重定向的 URL)时,浏览器会根据target属性和Location字段的值进行页面跳转 。

数据更新

如果表单提交是为了更新数据,如修改用户信息、商品库存等,提交成功后,需要在前端页面上实时更新相应的数据展示,以保持数据的一致性。可以通过 JavaScript 获取服务器返回的最新数据,并更新页面上对应的 DOM 元素。例如,在一个商品管理系统中,提交修改商品价格的表单后:

 

<script>

const response = { newPrice: 99.99 };

const priceElement = document.getElementById('product-price');

if (response.newPrice) {

priceElement.textContent = `¥${response.newPrice}`;

}

</script>

这样,页面上显示的商品价格就会更新为最新的值。

错误提示

当表单提交失败或服务器返回错误信息时,需要向用户显示清晰的错误提示,帮助用户了解问题所在并进行修正。错误提示可以通过弹窗、页面内的提示信息区域等方式展示。例如,使用alert函数弹出错误提示:

 

<script>

const response = { error: '用户名已存在,请重新输入' };

if (response.error) {

alert(response.error);

}

</script>

也可以在 HTML 页面中定义一个专门的提示区域,通过 JavaScript 将错误信息显示在该区域内:

 

<div id="error-message"></div>

<script>

const response = { error: '密码错误,请重试' };

const errorMessageElement = document.getElementById('error-message');

if (response.error) {

errorMessageElement.textContent = response.error;

}

</script>

通过合理的错误提示,能够提升用户体验,引导用户正确操作表单 。

实战演练:项目中的表单应用案例

案例展示

为了更直观地理解表单验证与提交机制在实际项目中的应用,下面以一个用户注册页面为例进行详细说明。该注册页面涵盖了常见的表单元素,如用户名、密码、确认密码、邮箱、手机号码等,并且对这些字段都设置了严格的验证规则。

HTML 结构如下:

 

<!DOCTYPE html>

<html lang="zh-CN">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>用户注册</title>

<style>

form {

width: 400px;

margin: 0 auto;

padding: 20px;

border: 1px solid #ccc;

border-radius: 5px;

}

label {

display: block;

margin-bottom: 5px;

}

input,

button {

width: 100%;

padding: 10px;

margin-bottom: 15px;

box-sizing: border-box;

}

button {

background-color: #007BFF;

color: white;

border: none;

cursor: pointer;

}

button:hover {

background-color: #0056b3;

}

.error {

color: red;

font-size: 12px;

}

</style>

</head>

<body>

<form id="registerForm">

<label for="username">用户名:</label>

<input type="text" id="username" name="username" placeholder="请输入用户名" required pattern="[a-zA-Z0-9]{3,12}" />

<span class="error" id="usernameError"></span>

<label for="password">密码:</label>

<input type="password" id="password" name="password" placeholder="请输入密码" required minlength="6" />

<span class="error" id="passwordError"></span>

<label for="confirmPassword">确认密码:</label>

<input type="password" id="confirmPassword" name="confirmPassword" placeholder="请确认密码" required minlength="6" />

<span class="error" id="confirmPasswordError"></span>

<label for="email">邮箱:</label>

<input type="email" id="email" name="email" placeholder="请输入邮箱" required />

<span class="error" id="emailError"></span>

<label for="phone">手机号码:</label>

<input type="text" id="phone" name="phone" placeholder="请输入手机号码" required pattern="[0-9]{11}" />

<span class="error" id="phoneError"></span>

<button type="submit">注册</button>

</form>

<script src="script.js"></script>

</body>

</html>

在上述 HTML 代码中,使用了<input>元素的required属性确保必填字段,pattern属性定义了用户名和手机号码的格式规则,minlength属性限制了密码的最小长度。同时,为每个表单字段都设置了对应的错误提示<span>元素,用于显示验证失败的信息。

JavaScript 验证代码如下:

 

const registerForm = document.getElementById('registerForm');

const usernameInput = document.getElementById('username');

const passwordInput = document.getElementById('password');

const confirmPasswordInput = document.getElementById('confirmPassword');

const emailInput = document.getElementById('email');

const phoneInput = document.getElementById('phone');

const usernameError = document.getElementById('usernameError');

const passwordError = document.getElementById('passwordError');

const confirmPasswordError = document.getElementById('confirmPasswordError');

const emailError = document.getElementById('emailError');

const phoneError = document.getElementById('phoneError');

registerForm.addEventListener('submit', function (e) {

e.preventDefault();

let isValid = true;

// 验证用户名

if (!usernameInput.value.match(/[a-zA-Z0-9]{3,12}/)) {

usernameError.textContent = '用户名必须为3 - 12位字母或数字';

isValid = false;

} else {

usernameError.textContent = '';

}

// 验证密码

if (passwordInput.value.length < 6) {

passwordError.textContent = '密码长度至少为6位';

isValid = false;

} else {

passwordError.textContent = '';

}

// 验证确认密码

if (confirmPasswordInput.value!== passwordInput.value) {

confirmPasswordError.textContent = '两次输入的密码不一致';

isValid = false;

} else {

confirmPasswordError.textContent = '';

}

// 验证邮箱

if (!emailInput.value.match(/^[^\s@]+@[^\s@]+\.[^\s@]+$/)) {

emailError.textContent = '请输入有效的邮箱地址';

isValid = false;

} else {

emailError.textContent = '';

}

// 验证手机号码

if (!phoneInput.value.match(/[0-9]{11}/)) {

phoneError.textContent = '请输入11位手机号码';

isValid = false;

} else {

phoneError.textContent = '';

}

if (isValid) {

// 表单验证通过,模拟提交数据

const formData = {

username: usernameInput.value,

password: passwordInput.value,

email: emailInput.value,

phone: phoneInput.value

};

console.log('提交的数据:', formData);

// 实际项目中,这里可以使用AJAX将数据发送到服务器

}

});

在这段 JavaScript 代码中,通过addEventListener监听表单的submit事件,在事件处理函数中对每个表单字段进行详细的验证。如果验证失败,设置相应的错误提示信息,并将isValid变量设为false。只有当所有字段都验证通过时,才会模拟提交数据(实际项目中会使用 AJAX 将数据发送到服务器) 。

遇到的问题与解决方案

在开发这个用户注册页面的过程中,遇到了一些表单相关的问题,以下是具体问题及解决方案:

兼容性问题
  • 问题描述:在 IE 浏览器中测试时,发现 HTML5 的一些验证属性(如pattern、required)的提示样式与其他现代浏览器不一致,且部分属性的验证功能无法正常工作。
  • 解决方案:为了确保兼容性,引入了一个名为html5shiv和respond.js的库。html5shiv用于让 IE 浏览器识别 HTML5 新元素,respond.js则用于使 IE 浏览器支持 CSS3 媒体查询。同时,对于 HTML5 验证属性在 IE 中不支持的部分,使用 JavaScript 进行额外的验证补充,如手动检查必填字段和验证数据格式,确保在 IE 浏览器中也能正常进行表单验证 。
数据处理难题
  • 问题描述:在表单验证通过后,将数据发送到服务器时,遇到了数据格式不一致的问题。服务器期望接收 JSON 格式的数据,而表单默认提交的数据是application/x-www-form-urlencoded格式。
  • 解决方案:使用FormData对象来构建表单数据,并结合fetch API 将数据以 JSON 格式发送到服务器。首先创建一个FormData对象,将表单元素的值逐一添加到FormData中,然后使用fetch发送 POST 请求,设置请求头的Content-Type为application/json,并将FormData对象转换为 JSON 字符串作为请求体发送。代码如下:
 

if (isValid) {

const formData = new FormData();

formData.append('username', usernameInput.value);

formData.append('password', passwordInput.value);

formData.append('email', emailInput.value);

formData.append('phone', phoneInput.value);

const jsonData = JSON.stringify(Object.fromEntries(formData));

fetch('register.php', {

method: 'POST',

headers: {

'Content-Type': 'application/json'

},

body: jsonData

})

.then(response => response.json())

.then(data => {

console.log('服务器响应:', data);

// 根据服务器响应进行后续处理,如提示注册成功或失败

})

.catch(error => {

console.error('提交数据时出错:', error);

});

}

通过这种方式,成功解决了数据格式不一致的问题,确保服务器能够正确接收和处理表单提交的数据 。

总结与展望

学习总结

回顾本次对 HTML 表单处理进阶知识的学习,收获颇丰。在表单验证方面,从 HTML5 内置验证属性的便捷应用,如required确保必填字段、pattern匹配复杂格式,到 JavaScript 自定义验证函数实现更灵活的逻辑,如密码强度验证、邮箱格式验证等,都让我深刻认识到客户端验证对于提升用户体验和数据准确性的重要性。同时,理解表单控件的验证状态和反馈机制,通过ValidityState对象获取验证信息并及时向用户提示错误,进一步完善了验证流程。

而服务器端验证的学习让我明白,它是保障数据安全和完整性的关键环节,能够防止非法数据进入系统,抵御各种恶意攻击。常见后端语言如 PHP、Python(Flask 框架)、Java(Spring Boot 框架)的验证方式各有特点,都为数据的可靠处理提供了有力支持 。

在表单提交机制上,深入对比了 GET 和 POST 提交方式的差异,了解到它们在安全性、数据量限制和应用场景方面的不同,以便在实际开发中根据需求做出正确选择。同时,掌握了表单提交事件的处理方法,包括原生提交事件的利用和 JavaScript 手动提交表单的技巧,以及如何使用FormData对象动态构建表单数据。对于提交后的处理与响应,熟悉了页面跳转、数据更新和错误提示等常见操作,确保用户在表单提交后能得到及时、准确的反馈 。

通过用户注册页面的实战案例,将所学知识应用到实际项目中,不仅巩固了理论知识,还锻炼了解决实际问题的能力。在项目开发过程中,遇到并解决了兼容性问题和数据处理难题,进一步提升了自己的技术水平 。

未来展望

随着 Web 技术的不断发展,HTML 表单处理技术也在持续演进。未来,表单验证和提交机制将更加智能化和高效化。一方面,在验证方面,可能会出现更智能的验证算法,能够根据用户输入的上下文和历史数据进行更精准的验证,减少误报和漏报。同时,随着人工智能技术的发展,或许会有基于 AI 的验证工具,能够自动学习用户的输入模式,提供更个性化的验证提示和建议。另一方面,在提交机制上,随着网络技术的提升,表单数据的传输速度和安全性将进一步提高,可能会出现更高效的传输协议和加密方式,确保数据在传输过程中的完整性和保密性 。

对于前端开发者而言,持续学习和探索 HTML 表单处理技术的新特性和新应用是保持竞争力的关键。未来,我们可以深入研究一些前沿的表单处理技术,如渐进式表单增强、表单的无障碍设计等,为用户提供更加优质、便捷的交互体验。同时,结合其他前端技术,如 React、Vue 等框架,将表单处理与组件化开发、状态管理等相结合,打造更复杂、功能更强大的 Web 应用 。

希望本文能为大家在 HTML 表单处理进阶学习的道路上提供一些帮助,也期待大家在未来的学习和实践中不断探索,共同推动 Web 开发技术的进步 。

相关文章:

HTML 表单处理进阶:验证与提交机制的学习心得与进度(二)

步步为营&#xff1a;表单提交机制全面解析 提交方式详解 GET 与 POST 对比 在 HTML 表单提交中&#xff0c;GET 和 POST 是最为常用的两种提交方式&#xff0c;它们在诸多方面存在显著差异。 安全性&#xff1a;GET 方式将表单数据附加在 URL 的查询字符串中&#xff0c;数…...

JavaScript | 爬虫逆向 | 语法基础| 01

一、摘要 实践是最好的导师 二、环境配置 在开始之前&#xff0c;需要确保你的计算机上已经安装了 Node.js。Node.js 是一个开源的、跨平台的 JavaScript 运行时环境&#xff0c;它允许你在服务器端运行 JavaScript 代码。 1. 下载 安装地址&#xff1a;https://nodejs.org…...

python解决多个矢量点图层合并为一个点图层

1、解决矢量点图层的合并 2、解决多个点图层分别合并为不同图层&#xff08;一个文件夹下所有点图层合并为一个图层&#xff0c;以下代码为两个文件夹&#xff0c;分别合并为两个总的图层&#xff09; import geopandas as gpd import os import pandas as pddef merge_shapef…...

VL开源模型实现文本生成图片

一、 基础知识 根据描述生成图片的视觉-语言模型&#xff08;Vision-Language Models, VL 模型&#xff09;是近年来多模态生成领域的热点研究方向。这些模型能够根据自然语言描述生成高质量的图像&#xff0c;广泛应用于艺术创作、设计辅助、虚拟场景构建等领域。 1 根据描述…...

字节跳动实习生主导开发强化学习算法,助力大语言模型性能突破

目录 禹棋赢的背景与成就 主要成就 DAPO算法的技术细节 算法优势 禹棋赢的研究历程 关键时间节点 字节跳动的“Top Seed人才计划” 计划特点 小编总结 在大模型时代&#xff0c;经验不再是唯一的衡量标准&#xff0c;好奇心、执行力和对新技术的敏锐洞察力成为推动技术…...

九、JavaScript作用域、预解析

一、JavaScript作用域 1.JavaScript作用域 ①代码名字&#xff08;变量&#xff09;在某个范围内起作用和效果 目的是为了提高程序的可靠性更重要的是减少命名冲突 ②js的作用域&#xff08;es6&#xff09;之前&#xff1a;全局作用域 局部作用域 ③全局作用域&#xff1a;整…...

前后端+数据库的项目实战:hbu迎新网-较复杂(下)javaweb

目录 十一、实现对内容的富文本编辑&#xff08;换行、图片颜色等等样式&#xff09; &#xff08;1&#xff09;下载富文本编辑器&#xff0c;引入资源 &#xff08;2&#xff09;将原项目的内容部分替换为富文本编辑器 1、替换添加页面 2、替换修改页面&#xff08;和添…...

Java-模块二-2

整数类型 byte&#xff1a;在 Java 中占用8位&#xff08;1字节&#xff09;&#xff0c;因此它的取值范围是从 -128 到 127。这是最小的整数类型&#xff0c;适合用于节省空间的情况。 short&#xff1a;这种类型的大小是16位&#xff08;2字节&#xff09;&#xff0c;允许的…...

Redis、Memcached应用场景对比

环境 Redis官方网站&#xff1a; Redis - The Real-time Data Platform Redis社区版本下载地址&#xff1a;Install Redis | Docs Memcached官方网站&#xff1a;memcached - a distributed memory object caching system Memcached下载地址&#xff1a;memcached - a dis…...

【单片机通信技术应用——学习笔记三】液晶屏显示技术,取模软件的应用

一、液晶显示技术简介 1.RGB信号线 RGB是一种色彩模式&#xff0c;是工业界的一种颜色标准&#xff0c;是通过红&#xff08;R&#xff09;、绿&#xff08;G&#xff09;、蓝&#xff08;B&#xff09;三个颜色通道的变化&#xff0c;以及它们相互之间的叠加来得到各式各样的…...

MySQL颠覆版系列————MySQL新特性(开启数据库的新纪元)上篇

文章目录 前言一、窗口函数&#xff08;Window Functions&#xff09;1.1 窗口函数概念1.2 常见的窗口函数 二、公用表表达式&#xff08;Common Table Expressions, CTEs&#xff09;2.1 公用表表达式的概念2.2 常见的公用表表达式 三、JSON增强3.1 JSON增强的概念3.2 常见的J…...

MySQL 调优:查询慢除了索引还能因为什么?

文章目录 情况一&#xff1a;连接数过小情况二&#xff1a;Buffer Pool 太小 MySQL 查询慢除了索引还能因为什么&#xff1f;MySQL 查询慢&#xff0c;我们一般也会想到是因为索引&#xff0c;但除了索引还有哪些原因会导致数据库查询变慢呢&#xff1f; 以下以 MySQL 中一条 S…...

Java实习生面试题(2025.3.23 be)

一、v-if与v-show的区别 v-show 和 v-if 都是 Vue 中的条件渲染指令&#xff0c;它们的主要区别在于渲染策略&#xff1a;v-if 会根据条件决定是否编译元素&#xff0c;而 v-show 则始终编译元素&#xff0c;只是通过改变 CSS 的 display 属性来控制显示与隐藏。 二、mybatis-…...

如何在百度搜索上删除与自己名字相关的资料

个人信息的网络足迹如同一张无形的网&#xff0c;将我们与世界的每一个角落紧密相连。然而&#xff0c;当某些与自己名字相关的资料不再希望被公众轻易检索到时&#xff0c;如何在百度搜索中有效“隐身”&#xff0c;成为了一个亟待解决的问题。面对复杂多变的网络环境&#xf…...

【C语言】C语言使用随机数srand,rand

C语言使用随机数srand,rand 可直接编译使用&#xff1a; #include <stdio.h> #include <time.h> #include <stdlib.h> #include <unistd.h>/* c语言提供的跟随机数有关的函数:int rand(void);返回值:产生的随机数void srand(unsiqned int seed);参数…...

为容器指定固定IP地址

文章目录 为容器指定固定IP地址可以通过以下步骤实现&#xff0c;适用于Docker环境&#xff1a;**方法一&#xff1a;使用Docker自定义桥接网络****方法二&#xff1a;Docker Compose配置****关键注意事项** 为容器指定固定IP地址可以通过以下步骤实现&#xff0c;适用于Docker…...

kube-score K8S Yaml静态代码分析工具详解

kube-score 是一款专注于 Kubernetes 配置文件的静态代码分析工具&#xff0c;旨在通过自动化检查帮助用户识别资源配置中的潜在问题&#xff0c;并遵循最佳实践以提升集群的安全性、稳定性和性能。以下是其核心功能、使用方法和应用场景的详细解析&#xff1a; 一、核心功能与…...

Spring Boot 整合 Elasticsearch 实践:从入门到上手

引言 Elasticsearch 是一个开源的分布式搜索引擎&#xff0c;广泛用于日志分析、搜索引擎、数据分析等场景。本文将带你通过一步步的教程&#xff0c;在 Spring Boot 项目中整合 Elasticsearch&#xff0c;轻松实现数据存储与查询。 1. 创建 Spring Boot 项目 首先&#xff…...

使用外部事件检测接入 CDH 大数据管理平台告警

CDH 大数据管理平台 CDH&#xff08;Cloudera Distribution Hadoop&#xff09;是一个企业级的大数据平台&#xff0c;由 Cloudera 公司提供&#xff0c;它包含了 Apache Hadoop 生态系统中的多种开源组件&#xff0c;并对其进行了优化和集成&#xff0c;以支持大规模数据存储…...

RabbitMQ八股文

RabbitMQ RabbitMQ 核心概念与组件1. RabbitMQ 核心组件及其作用1.1 生产者&#xff08;Producer&#xff09;1.2 交换机&#xff08;Exchange&#xff09;1.3 队列&#xff08;Queue&#xff09;1.4 绑定&#xff08;Binding&#xff09;1.5 消费者&#xff08;Consumer&#…...

MongoDB(五) - Studio 3T 下载与安装教程

文章目录 前言一、Studio 3T 简介二、下载及安装1. 下载2. 安装 三、使用Studio 3T连接MongoDB 前言 本文旨在全面且深入地为你介绍 Studio 3T。从其丰富的功能特性、跨平台使用的便捷性&#xff0c;到详细的下载安装步骤&#xff0c;以及关键的连接 MongoDB 操作&#xff0c;…...

2025高频面试算法总结篇【链表堆栈队列】

文章目录 直接刷题链接直达反转链表环形链表判断一个序列是否为合理的出栈顺序最长有效括号旋转链表复杂链表的复制约瑟夫环问题滑动窗口最大值 直接刷题链接直达 反转链表 206. 反转链表 环形链表 141. 环形链表142. 环形链表 II 判断一个序列是否为合理的出栈顺序 946.…...

Java主流开发框架之请求响应常用注释

1.RestController 标记一个类为 REST 控制器&#xff0c;处理 HTTP 请求并直接返回数据&#xff08;如 JSON/XML&#xff09;&#xff0c;而不是视图&#xff08;如 HTML&#xff09;&#xff0c;一般是放在类的上边 RestController public class UserController {GetMapping…...

汽车制造MES

一、整体生产工序 整车的车间主要分为4个部分&#xff1a;冲压、焊装、涂装、总装、整车入库 系统架构 二、车间概括 1.冲压车间 2.焊装车间 3.涂装车间 4.总装车间 1.整车装配的部件都要可追溯、数据实时性要求高、涉及分装与总装的协调、物流配送的协调、质量批处理的协调、…...

LeetCode 2643.一最多的行:模拟(更新答案)

【LetMeFly】2643.一最多的行&#xff1a;模拟(更新答案) 力扣题目链接&#xff1a;https://leetcode.cn/problems/row-with-maximum-ones/ 给你一个大小为 m x n 的二进制矩阵 mat &#xff0c;请你找出包含最多 1 的行的下标&#xff08;从 0 开始&#xff09;以及这一行中…...

固定翼无人机姿态和自稳模式

固定翼无人机的‌姿态模式&#xff08;Attitude/Angle Mode&#xff09;‌和‌自稳模式&#xff08;Stabilize Mode&#xff09;‌是两种常见的飞行控制模式&#xff0c;它们在飞控系统介入程度、操作逻辑及适用场景上有显著区别。以下是两者的详细对比及使用指南&#xff1a; …...

K8S中若要挂载其他命名空间中的 Secret

在Kubernetes&#xff08;k8s&#xff09;里&#xff0c;若要挂载其他命名空间中的Secret&#xff0c;你可以通过创建一个 Secret 的 ServiceAccount 和 RoleBinding 来实现对其他命名空间 Secret 的访问&#xff0c;接着在 Pod 中挂载这个 Secret。下面是详细的步骤和示例代码…...

关于Unity的CanvasRenderer报错

MissingReferenceException: The object of type ‘CanvasRenderer’ has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object. UnityEngine.UI.GraphicRaycaster.Raycast (UnityEng…...

LangChain组件Tools/Toolkits详解(5)——返回产出artifact

LangChain组件Tools/Toolkits详解(5)——返回产出artifact 本篇摘要14. LangChain组件Tools/Toolkits详解14.5 返回产出artifact14.5.1 定义工具14.5.2 使用ToolCall调用工具14.5.3 与模型一起使用14.5.4 从子例化BaseTool返回参考文献本章目录如下: 《LangChain组件Tools/T…...

信奥赛CSP-J复赛集训(模拟算法专题)(26):P5412 [YNOI2019] 排队

信奥赛CSP-J复赛集训(模拟算法专题)(26):P5412 [YNOI2019] 排队 题目描述 小明所在的班级要举办一场课外活动,在活动开始之前老师告诉小明:“需要把男女生分成两队,并且每一队都要按照身高从矮到高进行排序”。但是由于小明的马虎,没有把老师的安排转达给同学,导致全…...