JavaWeb-HttpServletRequest请求域接口

news2025/3/6 21:13:58

文章目录

  • 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的方式进行测试
    @Override
    protected 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获取整个参数集合的key
        out.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方法
    @Override
    protected 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方法

    @Override
    protected 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 {
    @Override
    protected 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 {
    @Override
    protected 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方法
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // 在CServlet类中设置请求域参数, 然后在DServlet中获取这个请求域参数, 查看是否可以获取得到...
        request.setAttribute("user", new User("huahua", "19", "zz"));

        // 调用 sendRedirt 进行重定向操作(重定向要加上项目的地址), 重定向至DServlet
        response.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 {
    @Override
    protected 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资源内部的跳转, 具体不再演示了


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2310701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

防火墙虚拟系统实验

拓扑图 需求一 安全策略要求&#xff1a; 1、只存在一个公网IP地址&#xff0c;公司内网所有部门都需要借用同一个接口访问外网 2、财务部禁止访问Internet&#xff0c;研发部门只有部分员工可以访问Internet&#xff0c;行政部门全部可以访问互联网 3、为三个部门的虚拟系统分…

点云滤波方法:特点、作用及使用场景

点云滤波是点云数据预处理的重要步骤&#xff0c;目的是去除噪声点、离群点等异常数据&#xff0c;平滑点云或提取特定频段特征&#xff0c;为后续的特征提取、配准、曲面重建、可视化等高阶应用打下良好基础。以下是点云中几种常见滤波方法的特点、作用及使用场景&#xff1a;…

Gradle 配置 Lombok 项目并发布到私有 Maven 仓库的完整指南

Gradle 配置 Lombok 项目并发布到私有 Maven 仓库的完整指南 在 Java 项目开发中&#xff0c;使用 Lombok 可以极大地减少样板代码&#xff08;如 getter/setter 方法、构造器等&#xff09;&#xff0c;提高开发效率。然而&#xff0c;当使用 Gradle 构建工具并将项目发布到私…

ArcGIS Pro 基于基站数据生成基站扇区地图

在当今数字化的时代&#xff0c;地理信息系统&#xff08;GIS&#xff09;在各个领域都发挥着至关重要的作用。 ArcGIS Pro作为一款功能强大的GIS软件&#xff0c;为用户提供了丰富的工具和功能&#xff0c;使得数据处理、地图制作和空间分析变得更加高效和便捷。 本文将为您…

【Python · Pytorch】Conda介绍 DGL-cuda安装

本文仅涉及DGL库介绍与cuda配置&#xff0c;不包含神经网络及其训练测试。 起因&#xff1a;博主电脑安装了 CUDA 12.4 版本&#xff0c;但DGL疑似没有版本支持该CUDA版本。随即想到可利用Conda创建CUDA12.1版本的虚拟环境。 1. Conda环境 1.1 Conda环境简介 Conda&#xff1…

leetcode:2965. 找出缺失和重复的数字(python3解法)

难度&#xff1a;简单 给你一个下标从 0 开始的二维整数矩阵 grid&#xff0c;大小为 n * n &#xff0c;其中的值在 [1, n2] 范围内。除了 a 出现 两次&#xff0c;b 缺失 之外&#xff0c;每个整数都 恰好出现一次 。 任务是找出重复的数字a 和缺失的数字 b 。 返回一个下标从…

Android U 分屏——SystemUI侧处理

WMShell相关的dump命令 手机分屏启动应用后运行命令&#xff1a;adb shell dumpsys activity service SystemUIService WMShell 我们可以找到其中分屏的部分&#xff0c;如下图所示&#xff1a; 分屏的组成 简图 分屏是由上分屏(SideStage)、下分屏(MainStage)以及分割线组…

flink集成tidb cdc

Flink TiDB CDC 详解 1. TiDB CDC 简介 1.1 TiDB CDC 的核心概念 TiDB CDC 是 TiDB 提供的变更数据捕获工具&#xff0c;能够实时捕获 TiDB 集群中的数据变更&#xff08;如 INSERT、UPDATE、DELETE 操作&#xff09;&#xff0c;并将这些变更以事件流的形式输出。TiDB CDC 的…

推荐1款OCR的扫描仪软件,无需安装,打开即用!

聊一聊 现在日常办公&#xff0c;很多时候还是需要扫描仪配合。 很多时候需要将文件搜索成PDF再传输。 今天给大家分享一款OCR扫描仪软件。 软件介绍 OCR的扫描仪软件 支持扫描仪共享。 支持WIA、TWAIN、SANE和ESCL驱动程序。 还可以批量多扫描仪配置扫描&#xff0c;支持…

SpringBoot为什么默认使用CGLIB?

大家好&#xff0c;我是锋哥。今天分享关于【SpringBoot为什么默认使用CGLIB?】面试题。希望对大家有帮助&#xff1b; SpringBoot为什么默认使用CGLIB? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring Boot 默认使用 CGLIB&#xff08;Code Generation Li…

神经网络|(十三)|SOM神经网络

【1】引言 前序已经对神经网络有了基础认识&#xff0c;今天先学习SOM神经网络。 前序学习文章链接包括且不限于&#xff1a; 神经网络|(十一)|神经元和神经网络-CSDN博客 神经网络|(十二)|常见激活函数-CSDN博客 【2】SOM神经网络 SOM神经网络是一种结构比较简单、但是理…

IP协议、DNS协议、DHCP协议、Telent协议的记忆总结

首先记忆一下几个协议的端口号 HTTP&#xff1a;超文本传输协议 80 HTTPS&#xff1a;安全传输协议 443 DHCP&#xff1a;动态主机配置协议 67/68 DNS&#xff1a;域名解析协议 53 FTP&#xff1a;文件传输协议 20/21 TFTP&#xff1a;简单文件传输协议 69 TELENT&#xff1a;远…

Pico 4 Enterprise(企业版)与Unity的交互-有线串流调试篇

入手了Pico 4 E做VR开发&#xff0c;谁知入了天坑...根据官方文档&#xff0c;尝试了串流助手、企业串流、PICO Developer Center&#xff0c;陷入了各种版本问题、环境问题的陷阱。而且Pico4E的OS自24年12开始就不再更新&#xff0c;头盔中预装的企业串流版本也较低&#xff0…

DeepSeek-R1:使用KTransformers实现高效部署指南

KTransformers作为一个开源框架&#xff0c;专门为优化大规模语言模型的推理过程而设计。它支持GPU/CPU异构计算&#xff0c;并针对MoE架构的稀疏性进行了特别优化&#xff0c;可以有效降低硬件要求&#xff0c;允许用户在有限的资源下运行像DeepSeek-R1这样庞大的模型。 硬件…

任务9:交换机基础及配置

CSDN 原创主页&#xff1a;不羁https://blog.csdn.net/2303_76492156?typeblog 一、交换机基础 交换机的概念&#xff1a;交换机是一种网络设备&#xff0c;用于连接多台计算机或网络设备&#xff0c;实现数据包在局域网内的快速交换。交换机基于MAC地址来转发数据包&#x…

Notepad++ 8.6.7 安装与配置全攻略(Windows平台)

一、软件定位与核心优势 Notepad 是开源免费的代码/文本编辑器&#xff0c;支持超过80种编程语言的高亮显示&#xff0c;相比系统自带记事本具有以下优势&#xff1a; 轻量高效&#xff1a;启动速度比同类软件快30%插件扩展&#xff1a;支持NppExec、JSON Viewer等200插件跨文…

SpringMVC请求处理流程:DispatcherServlet工作原理

文章目录 引言一、DispatcherServlet概述二、DispatcherServlet初始化过程三、请求接收与处理器匹配四、请求参数绑定与处理器执行五、视图解析与渲染六、异常处理机制总结 引言 SpringMVC框架是Java Web开发中最流行的MVC框架之一&#xff0c;其核心组件DispatcherServlet作为…

解锁数据潜能,永洪科技以数据之力简化中粮可口可乐决策之路

企业数字化转型是指企业利用数字技术和信息通信技术来改变自身的商业模式、流程和增值服务&#xff0c;以提高企业的竞争力和创新能力。数字化转型已经成为企业发展的重要战略&#xff0c;尤其在当前信息技术高速发展的时代。数字化转型还涉及到企业与消费者之间的互动和沟通。…

双链路提升网络传输的可靠性扩展可用带宽

为了提升网络传输的可靠性或增加网络可用带宽&#xff0c; 通常使用双链路冗余备份或者双链路聚合的方式。 本文介绍几种双链路网络通信的案例。 5GWiFi冗余传输 双Socket绑定不同网络接口&#xff1a;通过Android的ConnectivityManager绑定5G蜂窝网络和WiFi的Socket连接&…

前端性能优化之同时插入100000个元素页面不卡顿

面试官&#xff1a;同时插入100000个元素怎么让页面不卡顿 优化前写法 首先我们来看下面的一段&#xff0c;点击按钮后&#xff0c;循环100000次&#xff0c;每次都插入一个元素&#xff0c;并且插入区域上方还有一个小球在滚动&#xff0c;在插入的过程中我们可以观察小球的…