JavaWeb-HttpServletRequest请求域接口
文章目录
- HttpServletRequest请求域接口
- HttpServletRequest请求域接口简介
- 关于请求域和应用域的区别
- 请求域接口中的相关方法
- 获取前端请求参数(getParameter系列方法)
- 存储请求域名参数(Attribute系列方法)
- 获取客户端的相关地址信息
- 获取项目的根路径
- 关于转发和重定向的细致剖析
- 转发代码实现及相关问题
- 重定向代码实现及相关问题
HttpServletRequest请求域接口
HttpServletRequest请求域接口简介
其实关于请求域这个词也蛮熟悉的, 因为我们之前学习过 应用域 这一概念, 应用域的生命周期很长, 伴随这服务器的启动和终止, 作用范围也很广, 对所有的处于当前 webapp 也就是 web 应用的所有Servlet对象都生效
-
HttpServletRequest是位于jakarta.servlet.http.*包下面的一个接口 -
继承了
ServletRequest接口
public interface HttpServletRequest extends ServletRequest -
之前我们学习过HTTP协议的相关内容, 这个对象中封装的其实就是网络传输的时候, 发送的HTTP请求(Request)中封装的相关参数内容信息
-
实现这个接口是Tomcat服务器实现的, 传递对象封装参数也是Tomcat服务器完成好的内容, 我们作为Java程序员, 只需要学习获取其中封装的相关参数即可
关于请求域和应用域的区别
- 生命周期不同, 应用域伴随着Tomcat的生命周期 而 请求域 只作用域这一次请求之内, 而且http协议的特点就是, 一次请求一次创建一次请求域对象
- 而且在进行参数设定的时候, 尽量的去选择请求域的参数而不是应用域的参数, 因为小的域的对象占用的资源比较小
请求域接口中的相关方法
上面都说了, 请求域是封装了相关的http协议的参数信息, 所以必定提供了一些方法来让我们程序员获取到这些参数的信息…
获取前端请求参数(getParameter系列方法)
首先我们思考, 前端传递过来的参数应该采用什么数据结构来组织比较好
我们从下面的前端的页面中获取信息
<!DOCTYPE html>
<html lang='en'>
<head><meta charset='UTF-8'><meta name='viewport' content='width=device-width, initial-scale=1.0'><title>个人信息</title>
</head>
<body><h2>个人信息</h2><form action="" method="get">姓名:<input type="text" name="name" value=""><br>年龄:<input type="text" name="age" value=""><br>性别:<input type="radio" name="sex" value="男"><input type="radio" name="sex" value="女"><br>爱好:<input type="checkbox" name="hobby" value="吃饭"><input type="checkbox" name="hobby" value="睡觉"><input type="checkbox" name="hobby" value="打游戏"><br><input type="submit" value="提交"></form>
</body>
</html>
我们执行 http://127.0.0.1:8080/servlet08/test.html

我们对URL拆解如下(涉及URLEncoding)

我们可以发现, 前端向后端提交数据的格式其实并不是单纯的键值对的结构存储的, 因为如果是键值对结构存储的话, 一个key只能对应一个value, 但是复选框这种提交信息的结构, 一个key可以对应多个value信息
所以实际上, 我们的前端发来的数据存储格式是一个特殊的map集合
Map<String, String[]> map = new HashMap<>();
一个String类型的key可以对应一个String[] 数组, 也就是多个value(前端传递参数都是String类型)
上面是一个html页面, 其中包含test类型文本, 单选框, 复选框

上面的方法的解释:
- String getParameter(String name): 根据key返回String数组中的第一个参数
- String[] getParameterValues(String name): 根据key返回完整的String[]数组
- Enumeration< String > getParameterNames(): 返回一个由所有key组成的集合
- Map<String, String[]> getParameterMap(): 返回一个key和value组成的完整的集合
还拿我们上面写的那个html页面进行测试(设置一下传递的Servlet路径地址)
(注意, 我们下面的method其实写错了, 实际上是post请求)

Servlet对象的源码如下
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.*;
import java.util.Enumeration;
import java.util.Map;@WebServlet(urlPatterns = "/getparameter")
public class GetParameterServlet extends HttpServlet {// 由于是form表单提交的数据, 我们尽量采用重写doPost的方式进行测试@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 最好还是设置一下字符集, 防止出现乱码response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();// 1. 使用getParameterMap获取整个的map形式参数集合out.print("<h3>使用getParameterMap获取整个集合</h3>");Map<String, String[]> parameterMap = request.getParameterMap();for(Map.Entry<String, String[]> entry : parameterMap.entrySet()){out.print(entry.getKey() + "=");for(String value : entry.getValue()){out.print(value + " ");}}out.print("<br>");out.print("====================================<br>");// 2. 使用getParameterNames获取整个参数集合的keyout.print("<h3>使用getParameterNames获取整个集合中的key</h3>");Enumeration<String> parameterNames = request.getParameterNames();while(parameterNames.hasMoreElements()){String name = parameterNames.nextElement();out.print(name + " ");}out.print("<br>");out.print("====================================<br>");// 3. 使用getParameterValues, 根据key获取参数集合的value数组String[] hobbys = request.getParameterValues("hobby");out.print("hobby=");for(String hobby : hobbys){out.print(hobby + " ");}out.print("<br>");out.print("====================================<br>");// 4. 使用getParameter, 根据key获取到value数组中的第一个值String name = request.getParameter("name");out.print("name=" + name);out.print("<br>");out.print("====================================<br>");}
}
测试:
下面是form表单中提交的数据信息

下面是在浏览器中输出的内容

存储请求域名参数(Attribute系列方法)
Attribute 这个词其实我们很熟悉了, 因为之前学习ServletContext就出现过这个词, 也出现了和下面一模一样的一系列方法, 当时是设置应用域对象, 但是现在是设置请求域对象


- void setAttribute(String name, Object o): 设置请求域参数
- Object getAttribute(String name): 获取请求域参数
- Enumeration< String > getAttributeNames(): 获取所有请求域的key组成的集合
- void removeAttribute(String name): 移除 key 为参数的请求域信息
没啥可说的, 直接上测试代码
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.*;
import java.util.Enumeration;// 使用注解来配置Servlet
@WebServlet("/attribute")
public class AttributeInfoServlet extends HttpServlet {// 重写doGet方法@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();// 1. 使用 void setAttribute(String name, Object o) 设置请求域参数request.setAttribute("name", "Jack");request.setAttribute("age", 18);// 2. 使用 Object getAttribute(String name) 获取请求域参数Object name = request.getAttribute("name");Object age = request.getAttribute("age");out.print("<h3>" + name + " " + age + "</h3>");out.print("<br>========================================<br>");// 3. 使用 Enumeration< String > getAttributeNames() 获取所有的请求域参数key集合Enumeration<String> attributeNames = request.getAttributeNames();while (attributeNames.hasMoreElements()) {String attributeName = attributeNames.nextElement();out.print("<h3>" + attributeName + "</h3>");}out.print("<br>========================================<br>");// 4. 使用 void removeAttribute(String name) 移除参数request.removeAttribute("name");Object name1 = request.getAttribute("name");out.print("<h3>" + name1 + "</h3>");}
}
测试结果如下

获取客户端的相关地址信息
我们需要掌握下面的三个获取地址相关信息的方法
- getRemoteAddr(): 获取客户端主机IP
- getRemotePort(): 获取客户端的应用端port(端口号)
- getRemoteHost(): 获取客户端主机名称
下面是关于上面的三个方法的测试代码(我们直接给出)
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.*;// 使用注解代替web.xml进行Servlet的配置
@WebServlet(urlPatterns = "/addr")
public class GetAddr extends HttpServlet {// 重写doGet方法@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 设置返回的类型以及获取输出流信息response.setContentType("text/html");PrintWriter out = response.getWriter();// 1. 使用getRemoteAddr获取客户端的IP信息String remoteAddr = request.getRemoteAddr();out.print("<h3>客户端的IP地址为</h3><br>");out.print(remoteAddr);out.print("<br>=====================================");// 2. 使用getRemotePort获取客户端的端口号的信息int remotePort = request.getRemotePort();out.print("<h3>客户端的端口号为</h3><br>");out.print(remotePort);out.print("<br>======================================");// 3. 使用getRemoteHost获取客户端的主机名称String remoteHost = request.getRemoteHost();out.print("<h3>客户端的主机名号为</h3><br>");out.print(remoteHost);}
}
在浏览器上面访问这个资源, 可以得到下面的内容

注意我们的端口号其实不是固定的, 每一次请求的端口号都是在一个范围之内进行随机的, 因为我们的规范建议客户端的端口号设置为变化的, 服务器端的端口号设置为不变的…
获取项目的根路径
这个方法其实用的还是很多的, 因为我们在大量的场景中都需要动态获取根路径, 也就是项目路径, 我们在先前的内容中其实也提到过这个方法…
- getContextPath(): 获取项目部署的路径…
测试就省略了, 主要是想说这个方法的作用非常的重要, 我们好多地方获取项目的路径都需要这个方法…
关于转发和重定向的细致剖析
首先要了解, 不管是转发和重定向, 其目的都是为了实现资源的跳转
也就是Java中有两种方式实现资源的跳转
- 转发
- 重定向
转发代码实现及相关问题


getRequestDispatch(String servletName): 通过给定的转发的ServletName地址获取一个分发器对象forward(request, response): 把当前Servlet对象的请求响应对象作为参数传递到转发当中去, 从而实现位于同一个请求域的作用…
转发的代码实现
首先创建一个AServlet对象(相关注释都在代码中)
import bean.User;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.*;// 使用注解信息简化Servlet配置
// 我们把这个 AServlet 作为资源访问的入口, 然后对 BServlet进行资源的转发(所以二者本质上还是一次请求, 共享同一个请求域)
@WebServlet(urlPatterns = "/a")
public class AServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 因为要测试转发是不是在一次请求之内转发(也就是多个Servlet共享同一个request和response对象)// 我们设置相关的请求域参数(我们把用户定义在了另一个包当中, 等会我们复制代码就不展示User类了, 应该可以看懂)request.setAttribute("user", new User("huahua", "19", "zz"));// 获取分发器对象, 调用分发器对象的forward方法对这次请求进行转发RequestDispatcher requestDispatcher = request.getRequestDispatcher("/b");requestDispatcher.forward(request, response);}
}
创建一个BServlet对象作为AServlet的转发请求的地址
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import bean.User;import java.io.*;// 使用注解简化Servlet配置
// 这个BServlet作为转发的接收方, 接收AServlet的转发
@WebServlet(urlPatterns = "/b")
public class BServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();// 获取AServlet中的应用域的参数Object user = request.getAttribute("user");// 强制类型转化User us = (User) user;// 输出其中的信息内容out.print(us);}
}

我们现在在浏览器中访问AServlet的资源, 显然, 跳转到了BServlet中
- 可以发现, 在A中设置的请求域参数, B中同样可以获取, 所以可以判定二者位于同一个请求域
- 通过URL可以发现, 虽然资源跳转到了BServlet, 但是URL中的地址还是显示的AServlet的地址, 所以我们可以了解到, 其实转发是一种Tomcat服务器内部进行的资源跳转, 和浏览器无关(
和重定向区分的重要依据) - 根据上面的提示, 我们可以了解到, 转发是同一次请求的转发, 也就是只能在一种方法当中之间进行转发, 全部都在doGet内部转发, 或者全部都在doPost请求中进行转发…
转发不可以在不同的方法之间完成跳转, 测试如下
假设我们把 BServlet中的 doGet 方法转换为 doPost 方法

其他代码完全不变, 此时再次向AServlet发送请求

会发现直接报错, 报错信息是 405 method not allowed
其实针对上述问题, 我们还是有解决方案的, 只需要在doGet方法内部调用doPost就可以避免这种问题

继续访问AServlet, 会发现程序还是可以正常执行

重定向代码实现及相关问题
和转发不同, 重定向调用的API位于response对象中
通过 response 对象调用 sendReDirect(/项目路径/Servlet路径)方法进行重定向
代码测试
CServlet如下
import bean.User;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.*;// 使用注解简化开发
@WebServlet(urlPatterns = "/c")
public class CServlet extends HttpServlet {// 重写doGet方法@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 在CServlet类中设置请求域参数, 然后在DServlet中获取这个请求域参数, 查看是否可以获取得到...request.setAttribute("user", new User("huahua", "19", "zz"));// 调用 sendRedirt 进行重定向操作(重定向要加上项目的地址), 重定向至DServletresponse.sendRedirect(request.getContextPath() + "/d");}
}
DServlet
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.*;// 使用注解简化开发
@WebServlet(urlPatterns = "/d")
public class DServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();// 尝试接收CServlet中设置的请求域参数, 查看是不是可以获取到(其实本质是查看是不是一次请求)Object user = request.getAttribute("user");out.println(user == null ? "不是一个请求" : "是一个请求");}
}
向CServlet发送请求

获取响应结果如下

- 很明显的看到URL中的资源明显的发生了改变
我们不妨抓个包看一看刚才发生了什么
会发现出现了两次请求…

第一次向CServlet发送了请求, 这是第一次的请求响应信息

可以发现, 响应时的状态码是 302 Found

也就是发生了重定向的操作
第二次请求是直接通过浏览器向DServlet发送了一个请求而不是Tomcat资源内部的跳转, 具体不再演示了
相关文章:
JavaWeb-HttpServletRequest请求域接口
文章目录 HttpServletRequest请求域接口HttpServletRequest请求域接口简介关于请求域和应用域的区别 请求域接口中的相关方法获取前端请求参数(getParameter系列方法)存储请求域名参数(Attribute系列方法)获取客户端的相关地址信息获取项目的根路径 关于转发和重定向的细致剖析…...
【C++】switch 语句编译报错:error: jump to case label
/home/share/mcrockit_3588/prj_linux/../source/rkvpss.cpp: In member function ‘virtual u32 CRkVpss::Control(u32, void*, u32)’: /home/share/mcrockit_3588/prj_linux/../source/rkvpss.cpp:242:8: error: jump to case label242 | case emRkComCmd_DBG_SaveInput:|…...
防火墙虚拟系统实验
拓扑图 需求一 安全策略要求: 1、只存在一个公网IP地址,公司内网所有部门都需要借用同一个接口访问外网 2、财务部禁止访问Internet,研发部门只有部分员工可以访问Internet,行政部门全部可以访问互联网 3、为三个部门的虚拟系统分…...
点云滤波方法:特点、作用及使用场景
点云滤波是点云数据预处理的重要步骤,目的是去除噪声点、离群点等异常数据,平滑点云或提取特定频段特征,为后续的特征提取、配准、曲面重建、可视化等高阶应用打下良好基础。以下是点云中几种常见滤波方法的特点、作用及使用场景:…...
Gradle 配置 Lombok 项目并发布到私有 Maven 仓库的完整指南
Gradle 配置 Lombok 项目并发布到私有 Maven 仓库的完整指南 在 Java 项目开发中,使用 Lombok 可以极大地减少样板代码(如 getter/setter 方法、构造器等),提高开发效率。然而,当使用 Gradle 构建工具并将项目发布到私…...
ArcGIS Pro 基于基站数据生成基站扇区地图
在当今数字化的时代,地理信息系统(GIS)在各个领域都发挥着至关重要的作用。 ArcGIS Pro作为一款功能强大的GIS软件,为用户提供了丰富的工具和功能,使得数据处理、地图制作和空间分析变得更加高效和便捷。 本文将为您…...
【Python · Pytorch】Conda介绍 DGL-cuda安装
本文仅涉及DGL库介绍与cuda配置,不包含神经网络及其训练测试。 起因:博主电脑安装了 CUDA 12.4 版本,但DGL疑似没有版本支持该CUDA版本。随即想到可利用Conda创建CUDA12.1版本的虚拟环境。 1. Conda环境 1.1 Conda环境简介 Conda࿱…...
Spring AI:开启Java开发的智能新时代
目录 一、引言二、什么是 Spring AI2.1 Spring AI 的背景2.2 Spring AI 的目标 三、Spring AI 的核心组件3.1 数据处理3.2 模型训练3.3 模型部署3.4 模型监控 四、Spring AI 的核心功能4.1 支持的模型提供商与类型4.2 便携 API 与同步、流式 API 选项4.3 将 AI 模型输出映射到 …...
leetcode:2965. 找出缺失和重复的数字(python3解法)
难度:简单 给你一个下标从 0 开始的二维整数矩阵 grid,大小为 n * n ,其中的值在 [1, n2] 范围内。除了 a 出现 两次,b 缺失 之外,每个整数都 恰好出现一次 。 任务是找出重复的数字a 和缺失的数字 b 。 返回一个下标从…...
Android U 分屏——SystemUI侧处理
WMShell相关的dump命令 手机分屏启动应用后运行命令:adb shell dumpsys activity service SystemUIService WMShell 我们可以找到其中分屏的部分,如下图所示: 分屏的组成 简图 分屏是由上分屏(SideStage)、下分屏(MainStage)以及分割线组…...
面试基础---MySQL 事务隔离级别与 MVCC 深度解析
MySQL 事务隔离级别与 MVCC 深度解析:原理、实践与源码分析 引言 在高并发的互联网应用中,数据库事务的隔离级别是保证数据一致性和并发性能的关键。MySQL 通过多版本并发控制(MVCC)机制实现了不同的事务隔离级别。本文将深入探…...
第十二届蓝桥杯大学A组java省赛答案整理
货物摆放 题目描述 小蓝有一个超大的仓库,可以摆放很多货物。 现在,小蓝有 nn 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。 小蓝希望所…...
浅浅初识AI、AI大模型、AGI
前记:这里只是简单了解,后面有时间会专门来扩展和深入。 当前,人工智能(AI)及其细分领域(如AI算法工程师、自然语言处理NLP、通用人工智能AGI)的就业前景呈现高速增长态势,市场需求…...
flink集成tidb cdc
Flink TiDB CDC 详解 1. TiDB CDC 简介 1.1 TiDB CDC 的核心概念 TiDB CDC 是 TiDB 提供的变更数据捕获工具,能够实时捕获 TiDB 集群中的数据变更(如 INSERT、UPDATE、DELETE 操作),并将这些变更以事件流的形式输出。TiDB CDC 的…...
【flutter】TextField输入框工具栏文本为英文解决(不用安装插件版本
输入框长按选项菜单复制、粘贴、剪切、全选部分默认为英文,对于只需要对此部分做中文本地化,不需要考虑其他语言及全局本地化的项目,可以直接自定义一个本地化代理方法进行覆盖,不需要额外下载插件 // 自定义本地化代理 class _C…...
推荐1款OCR的扫描仪软件,无需安装,打开即用!
聊一聊 现在日常办公,很多时候还是需要扫描仪配合。 很多时候需要将文件搜索成PDF再传输。 今天给大家分享一款OCR扫描仪软件。 软件介绍 OCR的扫描仪软件 支持扫描仪共享。 支持WIA、TWAIN、SANE和ESCL驱动程序。 还可以批量多扫描仪配置扫描,支持…...
SpringBoot为什么默认使用CGLIB?
大家好,我是锋哥。今天分享关于【SpringBoot为什么默认使用CGLIB?】面试题。希望对大家有帮助; SpringBoot为什么默认使用CGLIB? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring Boot 默认使用 CGLIB(Code Generation Li…...
去除HTML有序列表(ol)编号的多种解决方案
以下是去除HTML有序列表(ol)编号的多种解决方案: <!DOCTYPE html> <html> <head> <style> /* 基础方案:完全移除编号 */ ol.no-number {list-style-type: none; /* 移除默认编号 */padding-left: 0; /* 移除默认缩进 */…...
神经网络|(十三)|SOM神经网络
【1】引言 前序已经对神经网络有了基础认识,今天先学习SOM神经网络。 前序学习文章链接包括且不限于: 神经网络|(十一)|神经元和神经网络-CSDN博客 神经网络|(十二)|常见激活函数-CSDN博客 【2】SOM神经网络 SOM神经网络是一种结构比较简单、但是理…...
IP协议、DNS协议、DHCP协议、Telent协议的记忆总结
首先记忆一下几个协议的端口号 HTTP:超文本传输协议 80 HTTPS:安全传输协议 443 DHCP:动态主机配置协议 67/68 DNS:域名解析协议 53 FTP:文件传输协议 20/21 TFTP:简单文件传输协议 69 TELENT:远…...
Pico 4 Enterprise(企业版)与Unity的交互-有线串流调试篇
入手了Pico 4 E做VR开发,谁知入了天坑...根据官方文档,尝试了串流助手、企业串流、PICO Developer Center,陷入了各种版本问题、环境问题的陷阱。而且Pico4E的OS自24年12开始就不再更新,头盔中预装的企业串流版本也较低࿰…...
DeepSeek-R1:使用KTransformers实现高效部署指南
KTransformers作为一个开源框架,专门为优化大规模语言模型的推理过程而设计。它支持GPU/CPU异构计算,并针对MoE架构的稀疏性进行了特别优化,可以有效降低硬件要求,允许用户在有限的资源下运行像DeepSeek-R1这样庞大的模型。 硬件…...
企业日常工作中常用的 Linux 操作系统命令整理
Linux 操作系统命令整理 在企业级运维、开发和日常工作中,Linux 命令是绕不开的核心技能。不论是日志排查、进程管理,还是高效运维优化,掌握这些命令都能让你事半功倍!本篇文章整理了自己在日常工作中积累最常用的 Linux 命令&am…...
任务9:交换机基础及配置
CSDN 原创主页:不羁https://blog.csdn.net/2303_76492156?typeblog 一、交换机基础 交换机的概念:交换机是一种网络设备,用于连接多台计算机或网络设备,实现数据包在局域网内的快速交换。交换机基于MAC地址来转发数据包&#x…...
Notepad++ 8.6.7 安装与配置全攻略(Windows平台)
一、软件定位与核心优势 Notepad 是开源免费的代码/文本编辑器,支持超过80种编程语言的高亮显示,相比系统自带记事本具有以下优势: 轻量高效:启动速度比同类软件快30%插件扩展:支持NppExec、JSON Viewer等200插件跨文…...
SpringMVC请求处理流程:DispatcherServlet工作原理
文章目录 引言一、DispatcherServlet概述二、DispatcherServlet初始化过程三、请求接收与处理器匹配四、请求参数绑定与处理器执行五、视图解析与渲染六、异常处理机制总结 引言 SpringMVC框架是Java Web开发中最流行的MVC框架之一,其核心组件DispatcherServlet作为…...
YOLOv8目标检测推理流程及C++代码
这部分主要是使用c++对Onnx模型进行推理,边先贴代码,过段时间再详细补充下代码说明。 代码主要分成三部分,1.main_det.cpp推理函数主入口;2.inference_det.h 头文件及inference_det.cpp具体函数实现;3.CMakeList.txt. 1.main_det 推理配置信息全部写在config.txt中,执行…...
解锁数据潜能,永洪科技以数据之力简化中粮可口可乐决策之路
企业数字化转型是指企业利用数字技术和信息通信技术来改变自身的商业模式、流程和增值服务,以提高企业的竞争力和创新能力。数字化转型已经成为企业发展的重要战略,尤其在当前信息技术高速发展的时代。数字化转型还涉及到企业与消费者之间的互动和沟通。…...
Redis3 Hash 类型命令详解
1. 什么是 Redis Hash? Redis Hash 是一种 键值对集合,类似于 Java 里的 HashMap,可以用来存储对象的数据。例如,你可以将用户信息存储在 Redis 的 Hash 结构中,每个字段代表用户的一个属性。 示例: HSE…...
双链路提升网络传输的可靠性扩展可用带宽
为了提升网络传输的可靠性或增加网络可用带宽, 通常使用双链路冗余备份或者双链路聚合的方式。 本文介绍几种双链路网络通信的案例。 5GWiFi冗余传输 双Socket绑定不同网络接口:通过Android的ConnectivityManager绑定5G蜂窝网络和WiFi的Socket连接&…...
