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

JavaWeb ——HttpServletRequest 请求对象(附代码)

HttpServletRequest 是 JavaWeb 三大对象之一封装了客户端向服务器发送的所有请求数据是处理前端请求、获取参数、实现请求转发的工具。一、HttpServletRequest1. 作用当客户端发送 HTTP 请求到 Tomcat 服务器时Tomcat 会为每一次请求创建一个 HttpServletRequest 对象封装请求头、请求参数、请求 URL、客户端信息等所有请求数据开发者通过该对象即可获取客户端的所有请求信息。2. 功能分类封装并获取请求头数据如 User-Agent、Host获取请求相关基础信息请求方式、URL、客户端 IP、项目路径等解析并获取请求参数单值参数 / 多值参数支持 GET/POST解决请求中文乱码问题GET/POST 分别处理作为域对象实现一次请求内的数据共享实现请求转发服务器内部跳转3. 环境准备JDK8、Tomcat8.5默认支持 GET 请求中文无需额外配置项目结构原生 JavaWeb 项目包名cn.tx.servlet项目名javaweb0315下文所有路径均基于此可自行替换二、获取请求头数据1. 方法EnumerationString getHeaderNames()获取所有请求头名称String getHeader(String name)根据指定名称获取请求头值2. 代码1 ServletRequestHeaderServlet.javapackage cn.tx.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; public class RequestHeaderServlet extends HttpServlet { Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 解决响应中文乱码避免页面输出中文乱码 response.setContentType(text/html;charsetutf-8); PrintWriter out response.getWriter(); // 获取所有请求头名称并遍历 EnumerationString headerNames request.getHeaderNames(); while (headerNames.hasMoreElements()) { String headerName headerNames.nextElement(); String headerValue request.getHeader(headerName); // 控制台打印请求头 System.out.println(headerName : headerValue); // 页面打印请求头 out.write(headerName : headerValue br/); } } }2 配置 web.xml!-- 注册获取请求头Servlet -- servlet servlet-nameRequestHeaderServlet/servlet-name servlet-classcn.tx.servlet.RequestHeaderServlet/servlet-class /servlet servlet-mapping servlet-nameRequestHeaderServlet/servlet-name url-pattern/request/header/url-pattern /servlet-mapping3. 运行验证访问地址http://localhost:8080/javaweb0315/request/header页面会展示所有请求头如 Host、User-Agent、Accept、Cookie 等Tomcat 控制台同步打印相同内容可用于服务端日志排查三、获取请求相关基础信息1. 常用方法方法名作用示例结果String getContextPath()获取项目上下文路径动态获取项目名/javaweb0315String getMethod()获取请求方式GET/POSTString getRequestURI()获取请求 URI不含域名、端口、参数/javaweb0315/request/infoStringBuffer getRequestURL()获取完整请求 URL不含参数http://localhost:8080/javaweb0315/request/infoString getQueryString()获取 URL 后的请求参数GET 专属name张三age20String getRemoteAddr()获取客户端 IP 地址127.0.0.1String getServletPath()获取Servlet 访问路径/request/infoint getServerPort()获取服务器端口号80802. 代码1 ServletRequestInfoServlet.javapackage cn.tx.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class RequestInfoServlet extends HttpServlet { Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(text/html;charsetutf-8); response.getWriter().write(请求信息已打印到Tomcat控制台前往查看); // 逐行打印请求基础信息 System.out.println( HttpServletRequest请求基础信息 ); System.out.println(项目上下文路径 request.getContextPath()); System.out.println(请求方式 request.getMethod()); System.out.println(请求URI request.getRequestURI()); System.out.println(完整请求URL request.getRequestURL()); System.out.println(URL请求参数 request.getQueryString()); System.out.println(客户端IP request.getRemoteAddr()); System.out.println(Servlet访问路径 request.getServletPath()); System.out.println(服务器端口 request.getServerPort()); System.out.println(客户端端口 request.getRemotePort()); System.out.println(请求协议 request.getScheme()); System.out.println(服务器名称 request.getServerName()); } }2 配置 web.xml!-- 注册获取请求信息Servlet -- servlet servlet-nameRequestInfoServlet/servlet-name servlet-classcn.tx.servlet.RequestInfoServlet/servlet-class /servlet servlet-mapping servlet-nameRequestInfoServlet/servlet-name url-pattern/request/info/url-pattern /servlet-mapping3. 运行验证访问地址带参数测试 GEThttp://localhost:8080/javaweb0315/request/info?name张三age20重点查看 Tomcat 控制台getContextPath()是动态获取项目名的关键避免硬编码项目名导致的 404 问题。四、获取请求参数获取请求参数是 HttpServletRequest最常用的功能支持解析 GET/POST 提交的参数分单值参数文本、单选框和多值参数复选框方法通用GET/POST 无区别。1. 获取参数方法方法名作用适用场景String getParameter(String name)根据参数名获取单个值文本框、单选框、下拉框String[] getParameterValues(String name)根据参数名获取值数组复选框一个参数对应多个值EnumerationString getParameterNames()获取所有参数名遍历所有请求参数MapString, String[] getParameterMap()获取所有参数的键值对批量处理参数、参数校验2. 代码含 GET/POST 测试表单1 测试表单request_param.jsp放在 WebContent 下%-- 测试GET/POST提交单值参数多值参数 --% % page contentTypetext/html;charsetUTF-8 languagejava % html head titleHttpServletRequest获取请求参数/title /head body h3GET方式提交参数在地址栏可见/h3 form action${pageContext.request.contextPath}/request/param methodget 用户名input typetext nameusername value张三 placeholder请输入中文brbr 密码input typepassword namepassword value123456brbr 性别input typeradio namegender valuemale checked男 input typeradio namegender valuefemale女brbr 爱好input typecheckbox namehobby valuegame checked游戏 input typecheckbox namehobby valueread看书 input typecheckbox namehobby valuecode checked编程brbr input typesubmit valueGET提交 /form hr stylecolor: #ccc; h3POST方式提交参数在请求体不可见/h3 form action${pageContext.request.contextPath}/request/param methodpost 用户名input typetext nameusername value李四 placeholder请输入中文brbr 密码input typepassword namepassword value654321brbr 性别input typeradio namegender valuemale男 input typeradio namegender valuefemale checked女brbr 爱好input typecheckbox namehobby valuegame checked游戏 input typecheckbox namehobby valueread checked看书 input typecheckbox namehobby valuecode编程brbr input typesubmit valuePOST提交 /form /body /html2 参数解析 ServletRequestParamServlet.javapackage cn.tx.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import java.util.Map; import java.util.Set; public class RequestParamServlet extends HttpServlet { Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 解决POST请求中文乱码GET请求Tomcat8.5无需处理 request.setCharacterEncoding(UTF-8); // 解决响应中文乱码 response.setContentType(text/html;charsetutf-8); PrintWriter out response.getWriter(); // 1. 获取单值参数 out.write(h3 1. 单值参数获取getParameter()/h3); String username request.getParameter(username); String password request.getParameter(password); String gender request.getParameter(gender); out.write(用户名 username br/); out.write(密码 password br/); out.write(性别 gender br/); // 2. 获取多值参数复选框 out.write(h3 2. 多值参数获取getParameterValues()/h3); String[] hobbies request.getParameterValues(hobby); if (hobbies ! null hobbies.length 0) { out.write(爱好); for (String hobby : hobbies) { out.write(hobby ); } out.write(br/); } // 3. 遍历所有参数名 out.write(h3 3. 遍历所有参数名getParameterNames()/h3); EnumerationString paramNames request.getParameterNames(); while (paramNames.hasMoreElements()) { String paramName paramNames.nextElement(); // 多值参数需特殊处理单值参数直接获取 String paramValue request.getParameter(paramName); out.write(参数名 paramName → 参数值 paramValue br/); } // 4. 获取参数Map批量处理 out.write(h3 4. 获取参数键值对getParameterMap()/h3); MapString, String[] paramMap request.getParameterMap(); SetString paramKeys paramMap.keySet(); for (String key : paramKeys) { String[] values paramMap.get(key); out.write(key → ); for (String val : values) { out.write(val ); } out.write(br/); } } }3 配置 web.xml!-- 注册获取请求参数Servlet -- servlet servlet-nameRequestParamServlet/servlet-name servlet-classcn.tx.servlet.RequestParamServlet/servlet-class /servlet servlet-mapping servlet-nameRequestParamServlet/servlet-name url-pattern/request/param/url-pattern /servlet-mapping3. 运行验证访问表单地址http://localhost:8080/javaweb0315/request_param.jsp分别点击GET 提交和POST 提交页面均可正确解析单值参数和多值参数中文无乱码五、解决请求中文乱码问题前端提交中文参数时若不做编码处理后端会获取到???乱码主要原因是Tomcat 默认使用 ISO-8859-1 编码解析请求而前端默认是 UTF-8 编码编码不一致导致乱码。1. POST 请求中文乱码// 必须在所有getParameter()方法之前调用 request.setCharacterEncoding(UTF-8);说明该方法仅对POST 请求有效因为 POST 参数在请求体中方法作用于请求体编码在第一次调用 getParameter ()之前设置否则无效只需调用一次所有参数都会使用 UTF-8 解析2. GET 请求中文乱码Tomcat8.5 免处理GET 请求参数在URL 地址栏中无请求体因此request.setCharacterEncoding(UTF-8)对其无效处理方式分版本版本 1Tomcat8.5推荐Tomcat8.5 及以上版本默认使用 UTF-8 解析 URL 参数无需任何额外处理直接获取即可正常显示中文。版本 2Tomcat8.5 以下两种解决方案方案 1手动转局部有效推荐// 先通过ISO-8859-1获取字节数组再通过UTF-8解码 String username request.getParameter(username); username new String(username.getBytes(ISO-8859-1), UTF-8);方案 2修改 Tomcat 配置全局有效找到 Tomcat 安装目录下的/conf/server.xml在 Connector 标签中添加URIEncodingUTF-8Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 URIEncodingUTF-8/修改后重启 Tomcat所有 GET 请求的中文参数都会自动用 UTF-8 解析。六、request 域对象 请求转发1. request 域对象说明request 是域对象作用范围为一次请求的整个生命周期从客户端发起请求到服务器响应结束可通过 request 域在一次请求内的多个组件如 Servlet→Servlet、Servlet→JSP之间共享数据与 ServletContext 域的区别ServletContext 域是全局域服务器启动到关闭request 域是局部域仅一次请求更安全、更轻量域对象方法void setAttribute(String name, Object value)向域中存入数据键值对值为 Object 类型Object getAttribute(String name)根据键名获取域中数据需强制类型转换void removeAttribute(String name)根据键名移除域中数据2. 请求转发说明请求转发是服务器内部的跳转由 HttpServletRequest 实现是将请求从一个 Servlet/JSP 转发到另一个 Servlet/JSP整个过程属于一次请求。特点服务器内部跳转客户端浏览器地址栏不变整个过程是一次请求request 域数据可在转发的组件间共享转发路径为服务器内部路径无需加项目名仅能转发到当前项目内部的资源无法跨域方法// 路径为目标资源的Servlet/JSP路径无需加项目名 request.getRequestDispatcher(/目标资源路径).forward(request, response);3. 代码Servlet→Servlet 转发 域数据共享1 转发方 ServletRequestForwardServlet1.java存入域数据package cn.tx.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class RequestForwardServlet1 extends HttpServlet { Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 解决POST中文乱码 request.setCharacterEncoding(UTF-8); // 获取前端提交的参数模拟业务处理 String username request.getParameter(username); // 向request域存入数据一次请求内共享 request.setAttribute(userName, username); request.setAttribute(msg, 这是从转发方Servlet1传入的域数据); request.setAttribute(code, 200); // 请求转发到Servlet2服务器内部路径无需加项目名 request.getRequestDispatcher(/request/forward2).forward(request, response); } }2 被转发方 ServletRequestForwardServlet2.java获取域数据package cn.tx.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class RequestForwardServlet2 extends HttpServlet { Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 解决响应中文乱码 response.setContentType(text/html;charsetutf-8); PrintWriter out response.getWriter(); // 从request域中获取Servlet1转发过来的数据 String userName (String) request.getAttribute(userName); String msg (String) request.getAttribute(msg); Integer code (Integer) request.getAttribute(code); // 页面展示域数据 out.write(h3 请求转发成功 - 获取request域数据 /h3); out.write(状态码 code br/); out.write(用户名 userName br/); out.write(提示信息 msg br/); // 可选移除域数据 request.removeAttribute(userName); } }3 转发测试表单request_forward.jsp%-- 请求转发测试表单提交到Servlet1转发到Servlet2 --% % page contentTypetext/html;charsetUTF-8 languagejava % html head titlerequest请求转发域对象/title /head body h3request请求转发测试一次请求域数据共享/h3 form action${pageContext.request.contextPath}/request/forward1 methodpost 请输入用户名中文input typetext nameusername placeholder如张三 requiredbrbr input typesubmit value提交并转发 /form /body /html4 配置 web.xml!-- 注册转发方Servlet1 -- servlet servlet-nameRequestForwardServlet1/servlet-name servlet-classcn.tx.servlet.RequestForwardServlet1/servlet-class /servlet servlet-mapping servlet-nameRequestForwardServlet1/servlet-name url-pattern/request/forward1/url-pattern /servlet-mapping !-- 注册被转发方Servlet2 -- servlet servlet-nameRequestForwardServlet2/servlet-name servlet-classcn.tx.servlet.RequestForwardServlet2/servlet-class /servlet servlet-mapping servlet-nameRequestForwardServlet2/servlet-name url-pattern/request/forward2/url-pattern /servlet-mapping4. 运行验证访问表单地址http://localhost:8080/javaweb0315/request_forward.jsp输入中文用户名如张三点击「提交并转发」地址栏不变仍为/request/forward1页面跳转到 Servlet2 的内容页面正确展示从 Servlet1 的 request 域中获取的所有数据中文无乱码一次请求内request 域数据可在转发的组件间自由共享。七、要点总结HttpServletRequest 为每一次请求创建一个实例封装所有请求数据获取参数的 4 个方法通用GET/POST 请求无区别重点处理中文乱码POST 乱码用request.setCharacterEncoding(UTF-8)必须在 getParameter () 之前调用Tomcat8.5 默认支持 GET 中文低版本需手动转码或修改 server.xmlrequest 是域对象作用范围为一次请求用于转发时的数据共享请求转发是服务器内部跳转地址栏不变一次请求无需加项目名1request.getParameter () 和 request.getAttribute () 的区别维度getParameter()getAttribute()作用获取前端提交的请求参数获取域中存入的对象数据数据来源前端表单 / URL 地址栏后端通过 setAttribute () 存入返回值类型String单值/String []多值Object需强制类型转换适用场景解析前端提交的参数一次请求内的组件间数据共享2请求转发的特点服务器内部跳转浏览器地址栏不发生变化整个过程属于一次 HTTP 请求request 域数据可共享转发路径为服务器内部路径无需添加项目名仅能转发到当前项目内部资源不支持跨域效率高无需客户端再次发起请求3为什么 POST 请求的中文乱码处理方法对 GET 无效POST 请求的参数存放在请求体中request.setCharacterEncoding(UTF-8)作用于请求体的编码解析GET 请求的参数存放在URL 地址栏中无请求体因此该方法对其无效Tomcat8.5 对 URL 地址栏的参数默认使用 UTF-8 解析因此无需额外处理八、访问地址汇总获取请求头http://localhost:8080/javaweb0315/request/header获取请求基础信息http://localhost:8080/javaweb0315/request/info?name张三age20获取请求参数GET/POSThttp://localhost:8080/javaweb0315/request_param.jsp请求转发 域对象http://localhost:8080/javaweb0315/request_forward.jsp结尾HttpServletRequest 是 JavaWeb 开发的基础也是后续学习 SSM、Spring Boot 的铺垫。本文所有代码均基于原生 JavaWeb 规范可直接复刻运行。如果觉得本文对你有帮助欢迎点赞 收藏 关注后续会持续更新 JavaWeb 知识点

相关文章:

JavaWeb ——HttpServletRequest 请求对象(附代码)

HttpServletRequest 是 JavaWeb 三大对象之一,封装了客户端向服务器发送的所有请求数据,是处理前端请求、获取参数、实现请求转发的工具。一、HttpServletRequest 1. 作用当客户端发送 HTTP 请求到 Tomcat 服务器时,Tomcat 会为每一次请求创建…...

COMSOL锂枝晶应力模型:到手即用

comsol锂枝晶应力模型,到手就能用。打开COMSOL看到锂枝晶模型就手痒?先别急着点"计算",咱们得把应力场和电化学揉明白了。模型库里的枝晶生长模块虽然自带基础设置,但想要真实模拟SEI膜破裂和机械变形,得自己加亿点点细…...

深入理解 synchronized:到底锁的是谁?

在 Java 多线程并发编程里,synchronized 是保证线程安全的核心关键字,但很多开发者只知道它能加锁,却不清楚它到底锁的是什么、不同写法锁的范围有何区别。这篇文章就把 synchronized 的锁对象、作用范围、经典测试用例一次性讲透&#xff0c…...

避坑指南:Containerd镜像加速新旧版本配置差异详解

Containerd镜像加速配置全解析:从版本差异到最佳实践 在云原生技术栈中,容器运行时作为基础组件的重要性不言而喻。作为Docker的轻量级替代方案,Containerd凭借其稳定性和高性能逐渐成为Kubernetes生态中的主流选择。然而,在实际生…...

2026-03-22 全国各地响应最快的 BT Tracker 服务器(联通版)

数据来源:https://bt.me88.top 序号Tracker 服务器地域网络响应(毫秒)1http://211.75.205.187:80/announce上海联通192http://211.75.210.221:6969/announce江苏镇江联通223http://93.158.213.92:1337/announce北京联通1284udp://176.99.7.59:6969/announce天津联通…...

2026年03月21日最热门的开源项目(Github)

根据本期榜单的数据分析,可以提取出以下几个关键点: 1. 项目种类与趋势 语言分布: 此榜单中的项目主要采用 JavaScript、TypeScript 和 Python 等语言,显示了这些编程语言在人工智能及相关技术领域的广泛应用。项目类型: 许多项目都集中在人…...

Comsol 模拟电击穿与电树枝现象

comsol 电击穿,电树枝,通过消耗复合材料静电能,形成随机电击穿通道,可根据SEM 照片制定不同的击穿路径,同时考虑晶粒与晶界不同的击穿场强,由于晶界的阻挡作用,击穿强度增加。 晶界面设置不同的…...

基于MATLAB的单相双极性SPWM逆变电路系统设计:探索SVPWM的独特魅力

基于MATLAB的单相双极性SPWM逆变电路系统设计 本设计包括设计报告,仿真程序。 系统优势 通过对比方波逆变器和正弦波逆变器,阐述了SVPWM逆变器在改善输出波形质量方面的优势如下: (1)谐波抑制: 方波逆变器的…...

【手把手教程】阿里云OpenClaw一键部署指南,两步解锁龙虾AI助理!

2026年,开源AI智能体OpenClaw(昵称“龙虾AI”)凭借其“能动手做事”的颠覆性能力,迅速成为技术圈与普通用户热议的焦点。这款以红色龙虾为图标的AI工具,不仅支持文件管理、浏览器自动化、代码编写等本地化操作&#xf…...

3DSlicer实战:从零开始完成冠脉精准分割

1. 为什么选择3DSlicer进行冠脉分割 第一次接触医学影像分析的朋友可能会问:市面上这么多专业软件,为什么偏偏推荐3DSlicer?我刚开始做心脏CT分析时也纠结过这个问题,实测对比过多个工具后,发现3DSlicer有三大不可替代…...

别再只用pretrained=True了!timm库加载模型权重的5种实战姿势(附避坑清单)

解锁timm库模型权重加载的5种高阶玩法:从精准控制到性能优化 在深度学习项目实践中,模型权重的加载远不止pretrainedTrue这么简单。当你需要处理自定义权重、进行模型微调或优化加载性能时,timm库提供了丰富的底层控制接口。本文将深入剖析五…...

OpenCloudOS 8实战:从零构建高性能WordPress企业官网

1. 企业官网与个人博客的技术差异 很多刚接触WordPress的朋友可能觉得,搭建企业官网和个人博客没什么区别。但实际在企业级应用中,流量压力、安全要求和功能复杂度都完全不同。我去年帮一家50人规模的科技公司迁移官网时就深有体会——他们原先用共享主机…...

鸿蒙HarmonyOS开发踩坑记:POST请求参数到底该放哪儿?别再用拼接URL的老办法了!

鸿蒙HarmonyOS开发实战:POST请求参数传递的正确姿势与深度解析 作为一名从Android转向HarmonyOS开发的程序员,我最初也陷入了POST请求传参的困惑。在Android世界里,Retrofit或OKHttp早已帮我们封装好了POST请求的参数处理,但在Har…...

别再死记硬背了!用Keil5和STM32F103C8T6搞懂GPIO八种模式,看这篇就够了

从电路原理到实战应用:深度解析STM32 GPIO八种工作模式 理解GPIO的本质 当我们第一次接触STM32的GPIO时,常常会被各种模式搞得晕头转向。与其死记硬背,不如从电路设计的角度来理解GPIO的本质。GPIO(General Purpose Input/Output&…...

Uniapp实战:5分钟搞定谷歌地图选点定位(附完整代码与避坑指南)

Uniapp集成谷歌地图选点功能的完整实现方案 1. 谷歌地图在Uniapp中的应用场景 对于面向海外市场的Uniapp应用开发,谷歌地图集成是一个常见需求。无论是电商应用的收货地址选择、社交应用的打卡功能,还是出行服务的定位服务,都需要可靠的地图选…...

重复文件处理的三种方案对比:删除、压缩还是硬链接?EternalBlaze实测报告

随着数字资产的不断累积,重复文件已成为困扰众多计算机用户的普遍问题。 面对这一挑战,业界形成了三种主流处理方案:直接删除、压缩归档以及硬链接合并。 每种方案各有优劣,适用于不同的应用场景。 本文将通过实测对比&#xf…...

QCLAW 浏览器联通指南:原理、架构与配置详解

本文档旨在帮助用户深入理解 QCLAW 如何通过 OpenClaw Browser Relay 控制浏览器,彻底解决常见的 500 Internal Server Error 问题,并提供标准的配置流程。 一共进行了45次对话,消耗了token:6,199,223,跑通该流程&…...

ESP32驱动OV7670摄像头(无FIFO)保姆级教程:从GitHub克隆到网页实时显示

ESP32驱动OV7670摄像头(无FIFO)全流程实战指南 在智能硬件开发领域,视觉感知一直是提升项目智能化水平的关键。对于预算有限的学生团队和物联网爱好者来说,ESP32搭配OV7670摄像头无疑是最经济实惠的视觉解决方案之一。本文将带你…...

【国产单片机】华大HC32L13系列printf调试实战:从半主机模式到MicroLib的深度解析

1. 为什么printf在华大HC32L13上不工作? 第一次用华大HC32L13开发板时,我像往常一样在代码里写了个printf("Hello World"),结果发现串口死活没输出。这个问题困扰了我整整两天,后来才发现问题出在ARM内核的特殊机制上。…...

HarmonyOS APP<玩转React>开源教程二十:收藏功能实现

第20次:收藏功能实现收藏功能让用户可以标记感兴趣的课程,方便后续快速访问。本次课程将完整实现收藏功能,包括服务层、状态管理和收藏页面。项目效果学习目标 掌握 BookmarkService 设计学会收藏状态管理实现收藏列表持久化完成收藏页面开发…...

nnUNetV2实战:从零构建医学影像2D分割数据集全流程解析

1. 环境准备与框架安装 第一次接触nnUNetV2时,我被它繁琐的环境依赖搞得焦头烂额。现在回想起来,其实只要掌握几个关键点就能避开大部分坑。建议使用Python 3.9的环境,我实测Python 3.10的兼容性最好。先通过conda创建隔离环境: c…...

从吾爱论坛到开源神器:EternalBlaze作者的技术初心与硬链接工具诞生记

在国产软件生态中,有这样一群开发者——他们不为商业利益,只为解决实际问题; 他们不求声名远播,只愿作品惠及他人。 EternalBlaze的创作者Henglie正是这样一位典型的技术实践者。 这款源于吾爱破解论坛的硬链接工具&#xff0c…...

大容量硬盘空间管理实战:用EternalBlaze硬链接技术优化TB级存储资源

在数据爆炸式增长的时代,个人用户拥有数TB存储空间已不罕见。 从4K视频素材到高分辨率照片,从虚拟机镜像到开发环境快照,大容量硬盘承载着日益庞大的数字资产。 然而,存储容量的扩张往往伴随着效率的下降——重复文件在庞大的数…...

python cosyVoice实现tts文本转语音、音频(未完成)

文章目录步骤chatTts需要连外网不好用,想着本地弄个。阿里开源项目cosyVoice(舒适语音)(是cosy,不是cos)评级比较不错。步骤 1、pycharm工作区新建文件夹cosyVoice-demo,进入文件夹clone代码。 https://github.com/FunAudioLLM/CosyVoice.gi…...

深搜算法 6300:Grid Path Construction(2418)

6300:Grid Path Construction(2418)时间限制: 1000 ms 内存限制: 524288 KB 提交数: 0 通过数: 0 Special Judge【题目描述】Given an nm grid and two squares a(y1,x1) and b(y2,x2), create a path from a to b that visits each square exactly…...

别再乱用jet了!Matplotlib中5个最值得推荐的科学可视化colormap及使用场景

科学可视化中的色彩艺术:Matplotlib最佳colormap实践指南 在科研论文和工程报告中,数据可视化是传递复杂信息的核心手段。然而,许多研究者至今仍在无意识地使用已被科学可视化领域淘汰的jet色标——这种彩虹色标不仅会造成数据特征的误读&…...

3DTiles白膜性能优化指南:如何让SHP建筑模型在Cesium中流畅加载

3DTiles白膜性能优化实战:从SHP到Cesium的高效加载策略 当我们将城市级建筑SHP数据转换为3DTiles白膜时,最令人头疼的莫过于浏览器中缓慢的加载速度和卡顿的交互体验。我曾在一个智慧园区项目中处理过包含2万多栋建筑的SHP数据集,初始转换后的…...

从YouTube到国内大厂,VPU(视频处理单元)如何重塑视频云的技术栈?

VPU技术革命:解码下一代视频云架构的三大范式转移 当你在深夜用手机观看4K直播时,是否想过每秒数GB的视频数据如何穿越千里依然清晰流畅?当城市每个角落的摄像头都在实时上传画面时,这些海量视频流又如何在云端被高效处理&#xf…...

NRF52系列选型终极指南:从52810到52840,5个关键指标帮你省下30%成本

NRF52系列选型终极指南:从52810到52840,5个关键指标帮你省下30%成本 在物联网设备开发中,芯片选型往往决定了项目60%以上的成本结构。作为Nordic Semiconductor的明星产品线,NRF52系列凭借其出色的低功耗性能和丰富的外设资源&…...

联发科MTK Sensor Bring Up避坑指南:以STK3321为例的常见问题解析

联发科MTK Sensor Bring Up深度实战:STK3321典型问题与系统化解决方案 在联发科(MTK)平台进行传感器(Sensor) Bring Up是智能设备开发中的关键环节,却也是最容易踩坑的技术难点之一。作为MTK生态中广泛使用的环境光传感器,STK3321的集成过程看…...