【Java项目脚手架系列】第二篇:JavaWeb项目脚手架
【Java项目脚手架系列】第二篇:JavaWeb项目脚手架
前言
在Java Web开发中,一个好的项目脚手架可以大大提高开发效率,减少重复工作。本篇文章将介绍一个基于Maven的JavaWeb项目脚手架,它包含了基础的Web开发配置和常用功能。
什么是JavaWeb项目脚手架?
JavaWeb项目脚手架是一个基于Maven的Web项目模板,它提供了:
- 标准的Web项目结构
- 基础的Web开发配置
- 常用功能组件
- 最佳实践示例
JavaWeb项目脚手架
1. 项目结构
javaweb-scaffold/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ ├── filter/
│ │ │ │ └── CharacterEncodingFilter.java
│ │ │ └── servlet/
│ │ │ ├── Error404Servlet.java
│ │ │ ├── Error500Servlet.java
│ │ │ └── HelloServlet.java
│ │ ├── resources/
│ │ │ └── log4j2.xml
│ │ └── webapp/
│ │ ├── WEB-INF/
│ │ │ └── web.xml
│ │ ├── error/
│ │ │ ├── 404.jsp
│ │ │ └── 500.jsp
│ │ └── index.jsp
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── example/
│ │ └── servlet/
│ │ └── HelloServletTest.java
│ └── resources/
├── docs/
│ └── 02-javaweb-scaffold.md
├── pom.xml
└── README.md
2. 核心文件内容
2.1 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>javaweb-scaffold</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><servlet.version>4.0.1</servlet.version><jsp.version>2.3.3</jsp.version><jstl.version>1.2</jstl.version><junit.version>5.8.2</junit.version><mockito.version>4.5.1</mockito.version><lombok.version>1.18.24</lombok.version><log4j2.version>2.17.2</log4j2.version></properties><dependencies><!-- Servlet API --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>${servlet.version}</version><scope>provided</scope></dependency><!-- JSP API --><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>${jsp.version}</version><scope>provided</scope></dependency><!-- JSTL --><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>${jstl.version}</version><scope>compile</scope></dependency><!-- JUnit 5 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>${junit.version}</version><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>${junit.version}</version><scope>test</scope></dependency><!-- Mockito --><dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>${mockito.version}</version><scope>test</scope></dependency><!-- Lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version><scope>provided</scope></dependency><!-- Log4j2 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>${log4j2.version}</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>${log4j2.version}</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>${log4j2.version}</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>${maven.compiler.source}</source><target>${maven.compiler.target}</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.2</version></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.22.2</version></plugin><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8080</port><path>/javaweb-scaffold</path></configuration></plugin></plugins></build>
</project>
2.2 web.xml
<?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"><display-name>JavaWeb Scaffold</display-name><!-- 字符编码过滤器 --><filter><filter-name>characterEncodingFilter</filter-name><filter-class>com.example.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- 错误页面配置 --><error-page><error-code>404</error-code><location>/error/404.jsp</location></error-page><error-page><error-code>500</error-code><location>/error/500.jsp</location></error-page>
</web-app>
2.3 CharacterEncodingFilter.java
package com.example.filter;import javax.servlet.*;
import java.io.IOException;public class CharacterEncodingFilter implements Filter {private String encoding;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {encoding = filterConfig.getInitParameter("encoding");if (encoding == null) {encoding = "UTF-8";}}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {request.setCharacterEncoding(encoding);response.setCharacterEncoding(encoding);chain.doFilter(request, response);}@Overridepublic void destroy() {}
}
2.4 HelloServlet.java
package com.example.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")
public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");response.getWriter().write("Hello from JavaWeb Scaffold!");}
}
2.5 Error404Servlet.java
package com.example.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("/error/404")
public class Error404Servlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");request.getRequestDispatcher("/error/404.jsp").forward(request, response);}
}
2.6 Error500Servlet.java
package com.example.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("/error/500")
public class Error500Servlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");request.getRequestDispatcher("/error/500.jsp").forward(request, response);}
}
2.7 index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>JavaWeb Scaffold</title>
</head>
<body><div class="container"><h1>Welcome to JavaWeb Scaffold</h1><p>Click <a href="hello">here</a> to test the HelloServlet.</p></div>
</body>
</html>
2.8 log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"><Properties><Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Property><Property name="APP_LOG_ROOT">logs</Property></Properties><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="${LOG_PATTERN}"/></Console><RollingFile name="FileAppender" fileName="${APP_LOG_ROOT}/app.log"filePattern="${APP_LOG_ROOT}/app-%d{yyyy-MM-dd}-%i.log"><PatternLayout pattern="${LOG_PATTERN}"/><Policies><TimeBasedTriggeringPolicy interval="1"/><SizeBasedTriggeringPolicy size="10MB"/></Policies><DefaultRolloverStrategy max="10"/></RollingFile></Appenders><Loggers><Root level="info"><AppenderRef ref="Console"/><AppenderRef ref="FileAppender"/></Root></Loggers>
</Configuration>
2.9 404.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>404 - Page Not Found</title><style>.error-container {text-align: center;margin-top: 100px;}.error-code {font-size: 72px;color: #e74c3c;}.error-message {font-size: 24px;margin: 20px 0;}.home-link {color: #3498db;text-decoration: none;}</style>
</head>
<body><div class="error-container"><div class="error-code">404</div><div class="error-message">Oops! The page you're looking for doesn't exist.</div><a href="${pageContext.request.contextPath}/" class="home-link">Return to Home</a></div>
</body>
</html>
2.10 500.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>500 - Internal Server Error</title><style>.error-container {text-align: center;margin-top: 100px;}.error-code {font-size: 72px;color: #e74c3c;}.error-message {font-size: 24px;margin: 20px 0;}.error-details {color: #7f8c8d;margin: 20px 0;}.home-link {color: #3498db;text-decoration: none;}</style>
</head>
<body><div class="error-container"><div class="error-code">500</div><div class="error-message">Internal Server Error</div><div class="error-details">An unexpected error occurred. Please try again later.</div><a href="${pageContext.request.contextPath}/" class="home-link">Return to Home</a></div>
</body>
</html>
2.11 HelloServletTest.java
package com.example.servlet;import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.io.StringWriter;import static org.mockito.Mockito.*;class HelloServletTest {@Mockprivate HttpServletRequest request;@Mockprivate HttpServletResponse response;private HelloServlet servlet;private StringWriter stringWriter;private PrintWriter writer;@BeforeEachvoid setUp() throws Exception {MockitoAnnotations.openMocks(this);servlet = new HelloServlet();stringWriter = new StringWriter();writer = new PrintWriter(stringWriter);when(response.getWriter()).thenReturn(writer);}@Testvoid doGet_ShouldWriteHelloMessage() throws Exception {// Whenservlet.doGet(request, response);// Thenverify(response).setContentType("text/html;charset=UTF-8");writer.flush();assertTrue(stringWriter.toString().contains("Hello from JavaWeb Scaffold!"));}
}
3. 使用说明
-
环境准备
- JDK 8+
- Maven 3.6+
- Tomcat 8.5+
-
克隆项目
git clone git@gitee.com:zengqiang_wang/leecode-inteview-questions-journal.git
-
导入IDE
- 推荐使用IntelliJ IDEA
- 选择"Open as Maven Project"
-
运行项目
mvn tomcat7:run
访问:http://localhost:8080/javaweb-scaffold/
4. 最佳实践
-
项目结构
- 遵循标准的Web项目结构
- 合理划分包层次
- 保持代码整洁
-
编码规范
- 统一使用UTF-8编码
- 使用字符编码过滤器
- 规范JSP页面编码
-
错误处理
- 配置统一的错误页面
- 记录详细的错误日志
- 提供友好的错误提示
-
测试编写
- 使用JUnit 5编写单元测试
- 使用Mockito模拟Servlet环境
- 测试覆盖核心功能
5. 常见问题
-
IDEA社区版无Tomcat插件
- 使用Maven插件运行
- 安装Smart Tomcat插件
- 配置Tomcat服务器
-
首页500错误
- 检查JSTL依赖配置
- 简化JSP页面内容
- 配置错误页面
-
编码问题
- 确保所有文件使用UTF-8编码
- 配置字符编码过滤器
- 检查JSP页面编码声明
6. 总结
这个JavaWeb项目脚手架提供了一个基础的Web开发环境,包含了常用的配置和功能。通过解决常见问题,我们可以快速搭建一个可用的Web项目。
7. 下期预告
下一期我们将介绍SpringMVC项目脚手架,它将基于本期项目进行扩展,添加Spring MVC相关功能,包括:
- 标准的MVC架构
- 统一响应处理
- 统一异常处理
- 参数校验
- 文件上传
- RESTful API支持
敬请期待!
相关文章:
【Java项目脚手架系列】第二篇:JavaWeb项目脚手架
【Java项目脚手架系列】第二篇:JavaWeb项目脚手架 前言 在Java Web开发中,一个好的项目脚手架可以大大提高开发效率,减少重复工作。本篇文章将介绍一个基于Maven的JavaWeb项目脚手架,它包含了基础的Web开发配置和常用功能。 什…...
【机器学习-线性回归-5】多元线性回归:概念、原理与实现详解
线性回归是机器学习中最基础且广泛应用的算法之一,而多元线性回归则是其重要扩展。本文将全面介绍多元线性回归的核心概念、数学原理及多种实现方式,帮助读者深入理解这一强大的预测工具。 1. 多元线性回归概述 1.1 什么是多元线性回归 多元线性回归(…...
《TCP/IP详解 卷1:协议》之第十章:动态选路协议
目录 一、常见的动态路由协议 二、RIP 1、RIP 版本1: 1.1、报文格式 2、RIP 版本2: 2.1、报文格式 三、OSPF 1、链路状态路由协议 2、工作原理 3、OSPF的特点 四、BGP 五、参考链接 一、常见的动态路由协议 路由协议(Routing Pr…...
逆向常见题目—迷宫类题目
逆向常见题目—迷宫类题目 迷宫(maze) 思路: 1.找到地图(字符串) 2.找到方向(上左下右) 3.找到起点到终点 然后将路径输出即可 特征: 标题,hint为maze 或者 看到字符串###等等 整理字符串为图形.py (要是不是正方形需要自己输出行和列) import mathdef arra…...
Redis 数据类型详解(二):Hash 类型全解析
文章目录 一、什么是 Redis 的 Hash 类型?二、Hash为什么在有些时候比String好用三、常见命令1.HSET key field value2.HGET key field3.HMSET4.HMGET5.HGETALL6.HKEYS7.HVALS8.HINCRBY9.HSETNX 四、应用场景五、性能优势六、注意事项总结 提示:以下是本…...
Vite简单介绍
Vite 是一个现代化的前端构建工具,由 Vue.js 的创始人 Evan You 开发,旨在提供更快的开发体验和更高效的构建流程。它的名字来源于法语单词“vite”,意为“快速”,这也反映了它的核心优势——极速的冷启动和热模块替换(…...
jwt身份验证和基本的利用方式
前言 : 什么是jwt(json web token)? 看看英文单词的意思就是 json形式的token 他的基本的特征 : 类似于这样的 他有2个点 分割 解码的时候会有三个部分 头部 payload 对称密钥 这个就是对称加密 头部&am…...
基于YOLOv的目标检测训练数据构建方法研究—图像采集、标注、划分与增强一体化流程设计
在目标检测任务中,高质量的训练数据是模型性能提升的关键。本文围绕 YOLOv 系列模型,系统性地研究了目标检测训练数据的构建方法,提出了一套从图像采集、标注、数据集划分到数据增强的一体化流程设计 。通过多源图像采集策略确保样本多样性&a…...
c++类【开端】
运算符重载 方式:operator运算符(参数列表){}。 运算符就是:-*/[]等。 运算符重载,和定义一个方法效果是一样的,只是,重载运算符让类的-*/等操作看起来和普通数字的-*/一样。仅是看起来一样。我们重载运算符…...
wordperss AI插件:AI图文+视频+长尾关键词自动生成,已内置deepseek、kimi全模型,支持简单一键接入更多自定义API
【2.17最新版】Linkreate wordperss AI插件:AI图文视频长尾关键词自动生成,已内置deepseek、kimi全模型。 支持自定义接入其它API,包括但不限于腾讯云API和它的deepseek模型 后台只需要设置对应的API url 、模型 、API key,就可以让插件调用…...
【免费分享无广告】刷视频助手抖音快手小红书视频号自动脚本刷视频养号
养号可做极速版刷视频任务支持最新版软件 【资 源 名 称】刷视频助手 【资 源 版 本】1.0.2 【资 源 大 小】11.66M 【资 源 系 统】安卓 【资 源 介 绍】刷视频养号助手,操作简单,就一个页面。亲测无广纯净,打开即用 ———————————…...
Javascript大致框架
一、JavaScript简介 JavaScript,简称JS,是一种高级的、解释型的编程语言,主要用于为网页添加动态功能。它最初由Netscape公司于1995年推出,最早名为LiveScript,后更名为JavaScript。尽管名字中带有“Java”࿰…...
Linux 权限
目录 一、Linux 权限概念 1.1 用户 1.2 用户切换 1.3 sudo指令提权 1.4 文件访问者的分类(人) 1.5 文件类型和访问权限(事物属性) 1.6 文件访问权限和相关设置方法 1) chmod 2)chown 3)chgrp 二…...
linux stm32mp157 GIC-V2 中断处理过程分析
/* ** 中断触发时,调用的 handle_arch_irq 入口地址。 ** 因为此时,挂接的就是 gic_handle_irq 函数!gic_handle_irq 是个全局函数指针, ** static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs) ** 它是Lin…...
Linux安装RTL8215网卡驱动
一、下载RTL8215驱动 下载地址:https://www.realtek.com/Download/ToDownload?typedirect&downloadid3763 二、安装编译工具 找一台能够访问互联网的linux服务器,下载对应的deb包 sudo apt-get install --download-only make gcc bzip2这将只下…...
用 Python 分析 IRIS 数据集:概率论与数理统计实战教程
一、引言 在数据科学的世界里,IRIS 数据集就像是一位常客,频繁出现在各种数据分析和机器学习的案例中。它包含 150 条记录,分属 Setosa、Versicolour、Virginica 这 3 种鸢尾花类别,每条记录还带有萼片长度、萼片宽度、花瓣长度、…...
QT6 源(79):阅读与注释表盘 QDial 的源码,其是基类QAbstractSlider 的子类,及其刻度线的属性举例
(1)源代码来自于头文件 qdial . h : #ifndef QDIAL_H #define QDIAL_H#include <QtWidgets/qtwidgetsglobal.h>#include <QtWidgets/qabstractslider.h>QT_REQUIRE_CONFIG(dial);QT_BEGIN_NAMESPACEclass QDialPrivate; class Q…...
Python 函数装饰器和闭包(闭包)
本章内容: Python 如何计算装饰器句法 Python 如何判断变量是不是局部的 闭包存在的原因和工作原理 nonlocal 能解决什么问题 掌握这些基础知识后,我们可以进一步探讨装饰器: 实现行为良好的装饰器 标准库中有用的装饰器 实现一个参数化装饰器…...
linux种文件名usr的含义是什么?
在Linux操作系统中,/usr目录是一个核心且容易引发困惑的概念。它既承载着历史演变的痕迹,又在现代系统中承担着关键功能。本文将从定义、结构、历史演变及常见问题等角度,全面解析usr的含义及其在Linux中的作用。 一、usr的起源与定义 1. 词…...
2025年中国光电子器件产业链分析
中商情报网讯:光电子器件作为信息时代的“光子引擎”,正从通信领域向消费电子、工业、医疗等全场景渗透。未来,随着材料科学、光子集成技术的突破,光电子器件将进一步重塑人类的信息交互方式,成为数字经济的关键基础设…...
基于 jQuery 实现灵活可配置的输入框验证功能
在 Web 表单开发中,输入框验证是保障数据准确性和安全性的关键环节。无论是用户注册、信息提交还是数据录入场景,都需要对用户输入内容进行合法性检查。本文将介绍如何使用 HTML、CSS 和 jQuery 构建一个可灵活配置的输入框验证系统,轻松应对…...
GPU性能加速的隐藏魔法:Dual-Issue Warp Schedule全解析
一、先来点"前菜":什么是Warp Schedule? 想象你是一个GPU的老板(比如NVIDIA老黄),手下有几万个"线程员工"要管理。直接让几万人同时开会?那得疯。于是你发明了"Warp"&#…...
无人机 | 无人机设计概述
无人机设计是一个复杂的系统工程,涉及空气动力学、电子技术、材料科学、控制算法等多个领域的综合应用。以下是无人机设计的主要模块和关键要素概述: 一、总体设计目标 任务需求定义 用途:航拍、物流、农业、军事侦察、环境监测等性能指标&am…...
电子邮件相关协议介绍
0 Preface/Foreword 1 协议介绍 电子邮件包含的主要协议: SMTPPOPIMAP 1.1 SMPT SMPT: Simple Mail Transfer Protocol,电子邮件传输的标准协议,负责将邮件从发送方传输到接收方邮件服务器。 1.2 POP POP: Post Office Protoc…...
标题:试验台铁地板:革新之路
在铁路行业中,地板是一项至关重要的元素,直接关系到列车的安全、舒适性以及使用寿命。近年来,试验台铁地板的开发和应用成为了铁路行业的热门话题之一。试验台铁地板的出现标志着铁路行业在技术创新方面迈出了重要的一步。本文将从试验台铁地…...
【C++】grpc(一):安装
因为接触了一些第三方项目和其他原因,我需要了解一些 RPC 相关的知识,首选的就是 Google 的 gRPC 库了。 安装 依然是使用WSL,发行版为Ubuntu 22.04.5 LTS gRPC的官网如下:https://grpc.org.cn/docs/languages/cpp/quickstart/…...
精益数据分析(41/126):深入解读移动应用商业模式的关键指标与策略
精益数据分析(41/126):深入解读移动应用商业模式的关键指标与策略 在创业与数据分析的学习征程中,我们不断探索不同商业模式的核心要点,以挖掘其中的商业价值。今天,我依旧带着与大家共同进步的初心&#…...
Python字符串全解析:从基础操作到高级应用的技术指南
引言 Python字符串作为编程领域的核心数据类型,其丰富的操作方法直接影响代码效率和可维护性。本文基于Python 3.10环境,结合工程实践中的高频需求,深度解析12类字符串操作技术,涵盖驻留机制、高效查询、编码…...
直方图反向投影
目录 一、概念 二、OpenCV C实现 2.1 基础实现代码 2.2 优化实现(带遮罩) 三、应用场景 3.1 目标跟踪 3.2 图像分割 3.3 工业检测 四、性能优化技巧 一、概念 直方图反向投影(Histogram Back Projection)是一种基于概率的图…...
TCP/IP协议深度解析:从分层架构到TCP核心机制
TCP/IP协议深度解析:从分层架构到TCP核心机制 一、TCP/IP协议族架构与核心概念 1. 协议族四层架构概述 TCP/IP是互联网的基础架构,采用四层分层模型,每层分工明确,协同实现网络通信: 层次核心功能关键协议/技术典…...
【动态规划】子序列问题
个人主页 : zxctscl 专栏 【C】、 【C语言】、 【Linux】、 【数据结构】、 【算法】 如有转载请先通知 文章目录 前言1 300. 最长递增子序列(经典)3.1 分析3.2 代码 2 376. 摆动序列2.1 分析2.2 代码 3 673. 最长递增子序列的个数3.1 分析3.…...
【C++】什么是头文件?
在 C 中,头文件(通常以 .h 或 .hpp 为扩展名)是用于声明类、函数、变量、宏和其他代码结构的文件。头文件的主要目的是提供接口定义,使得这些声明可以在多个源文件(.cpp 文件)中共享,从而避免重…...
shell(9)
流程控制(if) 1.if判断 i.基本语法(单分支) if [ 条件判断式 ] then 代码 fi ii.基本语法(多分支) if [ 条件判断式 ] then 代码 elif [ 条件判断式 ] 代码 ...... fi 注意事项:[ 条…...
Java设计模式: 工厂模式与策略模式
Java设计模式: 工厂模式与策略模式 在软件开发领域,设计模式是一种可重复使用的解决方案,用来解决常见的设计问题。工厂模式和策略模式是常用的设计模式之一,它们能够帮助开发人员更好地组织和管理代码,提高代码的可维护性和可扩展…...
大模型微调Fine-tuning:从概念到实践的全面解析
目录 引言 一、什么是大模型微调? 1.1 预训练与微调的区别 1.2 微调的技术演进 二、为什么需要微调? 2.1 解决大模型的固有局限 2.2 微调的优势 三、主流微调方法 3.1 全参数微调 3.2 参数高效微调(PEFT) 四、微调实践指…...
5月5日日记
今天是假期的最后一天,早上爽睡到11点起床。其实九点多就醒了,但是不愿意起来,睡了俩小时又。起来之后就点了外卖,西红柿打卤面两个卤蛋,11块钱很实惠。 起来之后洗袜子,简单策划了一下红色合唱。 给电动…...
TopK题-快速选择方法
代码 class Solution {public int findKthLargest(int[] nums, int k) {//k 就是对应的是下标 n - k 的位置 也就是说我们要的是下标n-k的元素return quickselect(nums, 0, nums.length - 1, nums.length - k);}public int quickselect(int[] nums, int left, int right, int …...
【SpringBoot篇】详解短信验证码登录功能实现
一:需求分析与设计 1.1 发送短信验证码 (1)产品原型 (2)业务逻辑 (3)接口设计 1.2 短信验证码登录 (1)业务逻辑 …...
深入理解 Bash 中的 $‘...‘ 字符串语法糖
在 Bash 脚本编程中,字符串处理是不可或缺的一部分。为了让开发者更高效地处理特殊字符和控制字符,Bash 引入了一种独特的字符串语法糖:$(带单引号的 ANSI-C 风格字符串)。这种语法来源于 C 语言的 ANSI-C 标准&#x…...
机器人强化学习入门学习笔记(二)
基于上一篇的《机器人强化学习入门学习笔记》,在基于 MuJoCo 的仿真强化学习训练中,除了 PPO(Proximal Policy Optimization)之外,还有多个主流强化学习算法可用于训练机器人直行或其他复杂动作。 🧠 一、常见强化学习算法对比(可用于 MuJoCo) 算法类型特点适合场景PP…...
Vue3携手Echarts,打造炫酷数据可视化大屏
一、引言 在数字化时代,数据如同企业的血液,蕴含着巨大的价值。而如何将这些抽象的数据转化为直观、易懂的信息,以便更好地支持决策和展示成果,成为了众多开发者和企业关注的焦点。数据可视化大屏应运而生,它以直观、醒…...
Java Web项目部署指南2025
Java Web项目部署指南 适用场景:本地 Windows 开发打包 → 远程 Ubuntu 服务器部署(2025年最佳实践) 适合人群:Java Web初学者、运维新手、需要一站式部署流程的开发者 🚀 部署流程横向流程图 #mermaid-svg-aznXsajzfU…...
STC单片机与淘晶驰串口屏通讯例程之04【密码登录与修改】
大家好,我是『芯知识学堂』的SingleYork,上一讲笔者给大家介绍了STC单片机与淘晶驰串口屏通讯例程之03【单片机程序解析】,今天笔者要跟大家分享的淘晶驰串口屏的密码登录与密码修改功能的实现。 很多项目中,为了保护某些参数不被随意修改,往往需要增加密码来保护,这也是…...
青听音乐 1.0.6| 全网音乐免费听,无损下载,4条音源,界面简洁无广告
一款强大的音乐播放器,内部集成了相当丰富的功能,可以一键搜索任何想要的歌曲或歌手专辑,同时还支持下载和收藏,拥有非常流畅的速度,使用起来没有任何限制!软件自带有大厂的解析音源,运行非常稳…...
FISCO BCOS【初体验笔记】
飞梭区块链搭建初体验笔记 环境部署创建四个节点的飞梭区块链用的VMware17 centos 7.9 区块链是飞梭2.0用的webase-frontJava环境的正确安装Webase-front搭建 智能合约设计一点合约调试笔记 智能合约abi文件转为go文件后端项目配置相关工具linux常用命令(防忘记&…...
56.[前端开发-前端工程化]Day03-webpack构建工具
邂逅Webpack和打包过程 1 认识webpack工具 前端开发的流程 内置模块path path常见的API 在webpack中的使用 认识webpack 脚手架依赖webpack Webpack到底是什么呢 Webpack官方的图片 Vue项目加载的文件有哪些呢? Webpack的使用前提 Webpack的安装 2 webpack基本打包…...
两次解析格式化字符串 + 使用SQLAlchemy的relationship执行任意命令 -- link-shortener b01lersCTF 2025
题目描述: A fast and reliable link shortener service, with a new feature to add private links! 我们走一遍逻辑 注册 app.route("/register", methods[GET, POST]) def register(): """ 用户注册路由,处理用户注册请求ÿ…...
双目测量中的将视差图重投影成三维坐标图
双目测距主要步骤如下: 左右两张图片 → 匹配 → 得到视差图 disp; 使用 cv2.reprojectImageTo3D(disp, Q) 将视差图 重投影 成三维坐标图 → 得到 points_3d 什么是 points_3d? points_3d cv2.reprojectImageTo3D(disp, Q)points_3d.shap…...
WebAssembly(Wasm):现代Web开发的超级加速器
在当今的Web开发领域,性能和效率是开发者们永恒的追求目标。随着Web应用的复杂度不断增加,传统的JavaScript在某些场景下已经难以满足高性能计算和复杂逻辑处理的需求。此时,WebAssembly(Wasm)作为一种新兴的Web技术&a…...
学习黑客Nmap 命令法诀
筑基期第二重 — Nmap 命令法诀 修炼目标 这一重我们要把上一阶段学到的“神识探查原理”化成 实战招式:掌握日常最常用的 Nmap 命令,并能随心组合。每条命令都配上“修仙比喻”,让你边笑边记。 1. 基础法诀速查表(凡修版…...