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

手写tomcat:基本功能实现(4)

逻辑架构

 

  1. HTTP 请求与 Socket

    • 左侧的 “HTTP 请求” 箭头指向 “socket”,表示客户端发送的 HTTP 请求通过 socket 传输到服务器。Socket 负责接收请求,并提取出其中的 请求路径(如 /first)和 请求方法(如 GET、POST),为后续处理做准备。
  2. Servlet 容器的路由机制

    • 图中粉色表格代表 Servlet 容器内的路由映射表,每一行记录了一个 URL 路径与对应 Servlet 对象的映射关系。例如,路径 /first 对应 firstServlet 对象,/second 对应 secondServlet 对象。容器根据 socket 提取的请求路径,从映射表中找到匹配的 Servlet 来处理请求。
  3. Web 应用结构(webapps)

    • webapps 是存放 Web 应用的目录,图中 myweb 是其中一个应用,包含两类资源:
      • Servlet 资源:动态处理请求的 Servlet 程序。
      • 静态资源:如 HTML、CSS、图片等无需动态处理的文件。
  4. 核心类与注解支持

    • 右侧蓝色区域包含 HttpServlet 类、HttpRequest 和 HttpResponse,它们是处理请求和响应的核心类。HttpServlet 是 Servlet 的基类,HttpRequest 用于封装请求信息,HttpResponse 用于构造响应数据。
    • 紫色区域表示对 @WebServlet 注解的支持。该注解用于配置 Servlet 对应的 URL 路径等信息,简化 Servlet 的注册过程,与图中路由映射表的功能相呼应。

TomcatRoute类

package com.qcby.config;import com.qcby.Util.SearchClassUtil;
import com.qcby.servlet.Httpservlet;
import com.qcby.zj.YbyServlet;import java.util.HashMap;
import java.util.List;import java.util.List;
import java.util.Map;public class TomcatRoute {public static HashMap<String, Httpservlet> Route = new HashMap<>();static {List<String> classesPath = SearchClassUtil.searchClass();for (String path : classesPath) {try {//加载类Class clazz = Class.forName(path);//获取注解YbyServlet webServlet = (YbyServlet) clazz.getDeclaredAnnotation(YbyServlet.class);
//                对象Object servlet = clazz.getDeclaredConstructor().newInstance();Route.put(webServlet.url(), (Httpservlet) servlet);
//                Httpservlet servlet = (Httpservlet) clazz.newInstance();
//                servletMap.put(webServlet.url(),servlet);System.out.println(Route);} catch (Exception e) {e.printStackTrace();}}}}

主要功能是自动扫描带有特定注解的 Servlet 类并注册到路由表中。使用静态 HashMap 存储路径到 Servlet 的映射关系。加载类:Class.forName("com.qcby.servlet.HomeServlet")。

一、核心功能与设计思想

public class TomcatRoute {public static HashMap<String, Httpservlet> Route = new HashMap<>();static { ... }
}

功能:自动扫描并注册所有带有YbyServlet注解的 Servlet 类

设计思想

  • 基于 "约定优于配置" 原则,通过注解简化 Servlet 注册
  • 使用静态代码块确保在类加载时完成初始化
  • 采用单例模式管理 Servlet 实例(每个 Servlet 只有一个实例)

二、核心组件详解

1. 路由注册表

public static HashMap<String, Httpservlet> Route = new HashMap<>();
  • 数据结构:静态 HashMap 存储路径到 Servlet 的映射
  • :URL 路径(如/user),来自YbyServlet注解的url()属性
  • :实现了Httpservlet接口的 Servlet 实例

2. 类扫描机制

List<String> classesPath = SearchClassUtil.searchClass();
  • SearchClassUtil功能
    • 扫描指定包下的所有类
    • 返回类的全限定名列表(如["com.qcby.servlet.UserServlet", "com.qcby.servlet.OrderServlet"]
  • 实现方式
    • 使用类加载器获取资源路径
    • 递归遍历所有.class文件
    • 将文件路径转换为类的全限定名

HttpServletResponse类

package com.qcby.Response;import com.qcby.Request.HttpServletRequest;import java.io.IOException;
import java.io.OutputStream;public class HttpServletResponse {private OutputStream outputStream;public HttpServletResponse(OutputStream outputStream){this.outputStream = outputStream;}public  void writeServlet(String context) throws IOException {outputStream.write(context.getBytes());}
}

这段代码实现了 HTTP 响应的基础功能,负责将服务器处理结果返回给客户端

Tomcat

package com.qcby;
//tomcat主启动类
import com.qcby.config.TomcatRoute;
import com.qcby.servlet.Httpservlet;
import com.qcby.Request.HttpServletRequest;
import com.qcby.Response.HttpServletResponse;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;public class Mytomcat {static HashMap<String,Httpservlet> routes= TomcatRoute.Route;public  static void dispatch(HttpServletRequest request,HttpServletResponse response) throws IOException {Httpservlet servlet=routes.get(request.getPath());if(servlet!=null){servlet.service(request,response);}}public static void main(String[] args) {try {System.out.append("服务器启动......");
//				1.定义ServerSocket对象进行服务器的端口注册ServerSocket serverSocket = new ServerSocket(8080);while (true) {
//				2.监听客户端的socket链接程序Socket socket = serverSocket.accept();//阻塞监听
//				3.从socket对象当中获得一个字节流对象InputStream iStream = socket.getInputStream();HttpServletRequest request=new HttpServletRequest();BufferedReader reader=new BufferedReader(new InputStreamReader(iStream));String str=reader.readLine();request.setMethod(str.split("\\s")[0]);request.setPath(str.split("\\s")[1]);System.out.println(request.getMethod() + " " + request.getPath());OutputStream outputStream=socket.getOutputStream();HttpServletResponse response=new HttpServletResponse(outputStream);dispatch(request,response);}} catch(Exception e){e.printStackTrace();}}}

 

相关文章:

手写tomcat:基本功能实现(4)

逻辑架构 HTTP 请求与 Socket&#xff1a; 左侧的 “HTTP 请求” 箭头指向 “socket”&#xff0c;表示客户端发送的 HTTP 请求通过 socket 传输到服务器。Socket 负责接收请求&#xff0c;并提取出其中的 请求路径&#xff08;如 /first&#xff09;和 请求方法&#xff08;如…...

String的一些固定程序函数

append reverse length toString...

SECERN AI提出3D生成方法SVAD!单张图像合成超逼真3D Avatar!

SECERN AI提出的3D生成方法SVAD通过视频扩散生成合成训练数据&#xff0c;利用身份保留和图像恢复模块对其进行增强&#xff0c;并利用这些经过优化的数据来训练3DGS虚拟形象。SVAD在新的姿态和视角下保持身份一致性和精细细节方面优于现有最先进&#xff08;SOTA&#xff09;的…...

windows触摸板快捷指南

以下是结构化整理后的触控手势说明&#xff0c;采用清晰的层级划分和标准化表述&#xff1a; **触控手势操作规范****1. 单指操作****2. 双指操作****3. 三指操作****4. 四指操作** **优化说明&#xff1a;** 触控手势操作规范 1. 单指操作 手势功能描述等效操作单击滑动选择…...

Mipsel固件Fuzzing小记

Mipsel固件Fuzzing小记 0x01 准备 1.1 安装必要工具链 首先需要安装 MIPS 交叉编译工具链和相关依赖&#xff1a; sudo apt-get install -y gcc-mipsel-linux-gnu g-mipsel-linux-gnu binwalk qemu-user-static afl这些工具分别用于&#xff1a;交叉编译、固件解包、二进制…...

边缘计算:物联网的“加速器”与“守护者”

引言 随着物联网&#xff08;IoT&#xff09;的快速发展&#xff0c;越来越多的设备接入网络&#xff0c;产生了海量的数据。传统的云计算架构面临着延迟高、带宽不足、数据安全等问题。边缘计算作为一种新兴技术&#xff0c;正在成为解决这些问题的关键手段。本文将探讨边缘计…...

简单网络交换、路由-华三RRPP以太环网

1、RRPP简单介绍 RRPP用来组建环网的链路层协议&#xff0c;工作在二层&#xff0c;比STP收敛更快&#xff0c;同时与STP、Smart-link互斥。很多企业很少应用环网组网&#xff0c;但是小编所在工业生产制造企业在特定工艺的区域对环网应用颇多&#xff0c;RRPP小编还是推荐网工…...

Kotlin变量与数据类型详解

Kotlin 变量与基本数据类型详解 一、变量声明 1. val vs var val&#xff1a;不可变变量&#xff08;只读&#xff09;&#xff0c;类似 Java 的 finalvar&#xff1a;可变变量 val name "Kotlin" // 类型推断为 String var age 25 // 类型推断为 I…...

【Redis】List 列表

文章目录 初识列表常用命令lpushlpushxlrangerpushrpushxlpop & rpoplindexlinsertllen阻塞操作 —— blpop & brpop 内部编码应用场景 初识列表 列表类型&#xff0c;用于存储多个字符串。在操作和实现上&#xff0c;类似 C 的双端队列&#xff0c;支持随机访问(O(N)…...

React中useState中更新是同步的还是异步的?

文章目录 前言一、useState 的基本用法二、useState 的更新机制1. 内部状态管理2. 状态初始化3. 状态更新 三、useState 的更新频率与异步行为1. 异步更新与批量更新2. 为什么需要异步更新&#xff1f; 四、如何正确处理 useState 的更新1. 使用回调函数形式的更新2. 理解异步更…...

Python语法强化

在正式编写第一个Python程序前&#xff0c;我们先复习一下什么是命令行模式和Python交互模式。 命令行模式 在Windows开始菜单选择“Terminal”&#xff0c;就进入到PowerShell命令行模式&#xff0c;它的提示符类似PS C:\>&#xff1a; ┌───────────────…...

FastMCP:为大语言模型构建强大的上下文和工具服务

FastMCP&#xff1a;为大语言模型构建强大的上下文和工具服务 在人工智能快速发展的今天&#xff0c;大语言模型&#xff08;LLM&#xff09;已经成为许多应用的核心。然而&#xff0c;如何让这些模型更好地与外部世界交互&#xff0c;获取实时信息&#xff0c;执行特定任务&am…...

TC3xx学习笔记-UCB BMHD使用详解(二)

文章目录 前言Confirmation的定义Dual UCB: Confirmation StatesDual UCB: Errored State or ECC Error in the UCB Confirmation CodesECC Error in the UCB ContentDual Password UCB ORIG and COPY Re-programming UCB_BMHDx_ORIG and UCB_BMHDx_COPY (x 0-3)BMHD Protecti…...

【Docker】docker compose和docker swarm区别

Docker Swarm 和 Docker Compose 的核心区别&#xff1a; 1. 定位不同 Docker Compose 单机多容器编排&#xff1a;在单个主机上管理多个容器&#xff0c;适合本地开发、测试环境。单节点部署&#xff1a;所有容器运行在同一 Docker 引擎实例上。 Docker Swarm 集群管理工具&…...

Power BI Desktop开发——矩阵相关操作

本篇文章使用2025年5月17日从微软商店下载的最新版Power BI Desktop 目录 1.设置矩阵网格整体大小 2.设置矩阵网格行高 3.设置矩阵网格列宽 4.隐藏矩阵网格的某一列 5.隐藏矩阵网格的某一行 6.设置矩阵网格居中展示 7.号图表的显示设置 8.调整行标题的缩进 9.设置矩阵…...

系统架构设计(九):分布式架构与微服务

基础定义 架构类型定义分布式架构指将系统部署在多个服务器节点上&#xff0c;通过网络协作完成整体功能。强调物理上的分布与任务协作。微服务架构一种分布式架构模式&#xff0c;将系统按照业务维度拆分为多个小型自治服务&#xff0c;每个服务可独立开发、部署、伸缩。 核…...

Linux服务器安全如何加固?禁用不必要的服务与端口如何操作?

保护Linux服务器的安全性对于确保系统的稳定性和数据的保密性至关重要。加固Linux服务器的安全性包括禁用不必要的服务和端口&#xff0c;以减少潜在的攻击面。本文将探讨如何加固Linux服务器的安全性&#xff0c;具体介绍如何禁用不必要的服务和端口&#xff0c;从而提高服务器…...

AgentCPM-GUI,清华联合面壁智能开源的端侧GUI智能体模型

AgentCPM-GUI是什么 AgentCPM-GUI 是由清华大学与面壁智能团队联合开发的一款开源端侧图形用户界面&#xff08;GUI&#xff09;代理&#xff0c;专为中文应用进行优化。基于 MiniCPM-V 模型&#xff08;80 亿参数&#xff09;&#xff0c;该系统能够接收智能手机的屏幕截图&a…...

如何用AI优化简历:自动读取与精华浓缩

在求职过程中&#xff0c;一份出色的简历往往是成功的关键。然而&#xff0c;许多求职者在撰写简历时往往面临诸多挑战&#xff0c;比如如何让简历更突出、如何让招聘者快速了解自己的核心优势等。随着人工智能技术的发展&#xff0c;AI不仅可以帮助我们优化简历内容&#xff0…...

Jackson使用详解

JSON Jackson是java提供处理json数据序列化和反序列的工具类&#xff0c;在使用Jackson处理json前&#xff0c;我们得先掌握json。 JSON数据类型 类型示例说明字符串&#xff08;String&#xff09;"hello"双引号包裹&#xff0c;支持转义字符&#xff08;如 \n&a…...

Node.js 源码概览

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境&#xff0c;它的源码结构相当庞大且复杂。下面我将为你讲解 Node.js 源码的主要结构和关键组成部分。 源码结构 Node.js 的主要源码目录结构如下&#xff1a; node/ ├── lib/ # JavaScript 核心模…...

简单神经网络(ANN)实现:从零开始构建第一个模型

本文将手把手带你用 Python Numpy 实现一个最基础的人工神经网络&#xff08;Artificial Neural Network, ANN&#xff09;。不依赖任何深度学习框架&#xff0c;适合入门理解神经网络的本质。 一、项目目标 构建一个三层神经网络&#xff08;输入层、隐藏层、输出层&#xf…...

Conda 完全指南:从环境管理到工具集成

Conda 完全指南&#xff1a;从环境管理到工具集成 在数据科学、机器学习和 Python 开发领域&#xff0c;环境管理一直是令人头疼的问题。不同项目依赖的库版本冲突、Python 解释器版本不兼容等问题频繁出现&#xff0c;而 Conda 的出现彻底解决了这些痛点。作为目前最流行的跨…...

防范Java应用中的恶意文件上传:确保服务器的安全性

防范Java应用中的恶意文件上传&#xff1a;确保服务器的安全性 在当今数字化时代&#xff0c;Java 应用无处不在&#xff0c;而文件上传功能作为许多应用的核心组件&#xff0c;却潜藏着巨大的安全隐患。恶意文件上传可能导致服务器被入侵、数据泄露甚至服务瘫痪&#xff0c;因…...

CSS- 4.2 相对定位(position: relative)

本系列可作为前端学习系列的笔记&#xff0c;代码的运行环境是在HBuilder中&#xff0c;小编会将代码复制下来&#xff0c;大家复制下来就可以练习了&#xff0c;方便大家学习。 HTML系列文章 已经收录在前端专栏&#xff0c;有需要的宝宝们可以点击前端专栏查看&#xff01; 点…...

Face Over 84.0| 利用AI技术交换照片或视频中的面孔,制作有趣内容

Face Over是一款充满创造力和乐趣的应用程序&#xff0c;它利用AI技术帮助用户交换照片或视频中的面孔&#xff0c;预测未来宝宝的模样&#xff0c;并将照片制作成动画。无论您是想制作有趣的模因、口型同步视频还是探索未来家庭成员的模样&#xff0c;这款应用程序都能满足您的…...

怎么在excel单元格1-5行中在原来内容前面加上固定一个字?

环境&#xff1a; WPS 2024 问题描述&#xff1a; 怎么在excel单元格1-5行中在原来内容前面加上固定一个字&#xff1f; 解决方案&#xff1a; 1.在Excel中&#xff0c;如果您想在单元格的内容前面添加一个固定的字&#xff0c;可以通过以下几种方法实现&#xff1a; 方法…...

AI:人形机器人一定是人的形状吗?

本文将从技术角度分析人形机器人是否必须是人的形状&#xff0c;以及人形与非人形机器人在适用场合、优缺点上的差异。以下是详细解答&#xff1a; 人形机器人一定是人的形状吗&#xff1f; 不&#xff0c;人形机器人&#xff08;Humanoid Robot&#xff09;在技术上通常指外…...

26、思维链Chain-of-Thought(CoT)论文笔记

思维链Chain-of-Thought&#xff08;CoT&#xff09; **1、研究背景与核心目标****2、思维链提示的方法设计**2.1 COT方法2.2 传统方法 3、实验设计与关键数据集3.1 算术推理3.2 常识推理3.3 符号推理 4、关键实验结果1. 算术推理&#xff1a;思维链提示显著提升多步问题解决率…...

golang中的反射示例

文章目录 前言一、通过反射获取底层类型 reflect.typeOf()二、反射获取底层的值 reflect.ValueOf()三、通过反射设置底层值四 、进阶结构体反射示例 前言 反射就像是给程序装上了显微镜&#xff0c;运行时随时查看底层类型以及底层值&#xff0c;根据需要动态读写或调用方法。…...

NX二次开发——设置对象的密度(UF_MODL_set_body_density)

在前几篇博客中我们已经探讨了如何设置实体的密度。在装配环境中&#xff0c;同样可以为组件设置密度。虽然不能直接对组件进行密度设置&#xff0c;但可以通过一种间接方式实现&#xff1a;在装配环境下&#xff0c;利用 UF_ASSEM_set_work_part_quietly() 函数以静默方式将组…...

基于朴素贝叶斯与 LSTM 的假新闻检测模型对比分析

一、引言 在信息爆炸的时代&#xff0c;假新闻的传播对社会产生了诸多负面影响。如何快速、准确地识别假新闻成为了重要的研究课题。本文将对比传统机器学习算法&#xff08;朴素贝叶斯&#xff09;与深度学习模型&#xff08;LSTM&#xff09;在假新闻检测任务中的性能表现&am…...

共享内存【Linux操作系统】

文章目录 共享内存共享内存的原理共享内存相关函数和系统调用--systemV系统调用&#xff1a;shmget系统调用&#xff1a;shmctl系统调用&#xff1a;shmat系统调用&#xff1a;shmdt系统调用&#xff1a;ftok 共享内存相关函数和系统调用--POSIXshm_open-- 创建或打开共享内存对…...

Android核心系统服务:AMS、WMS、PMS 与 system_server 进程解析

1. 引言 在 Android 系统中&#xff0c;ActivityManagerService (AMS)、WindowManagerService (WMS) 和 PackageManagerService (PMS) 是三个最核心的系统服务&#xff0c;它们分别管理着应用的生命周期、窗口显示和应用包管理。 但你是否知道&#xff0c;这些服务并不是独立…...

arduino平台读取鼠标光电传感器

鼠标坏掉了&#xff0c;大抵是修不好了。&#xff08;全剧终—&#xff09; 但是爱动手的小明不会浪费这个鼠标&#xff0c;确认外观没有明显烧毁痕迹后&#xff0c;尝试从电路板上利用光电传感器进行位移的测量&#xff0c;光电传感器&#xff08;型号&#xff1a;FCT3065&am…...

EXO分布式部署deepseek r1

EXO 是一个支持分布式 AI 计算的框架&#xff0c;可以用于在多个设备&#xff08;包括 Mac Studio&#xff09;上运行大语言模型&#xff08;LLM&#xff09;。以下是联调 Mac Studio 512GB 的步骤&#xff1a; 安装 EXO • 从 EXO GitHub 仓库 下载源码或使用 git clone 获取…...

机器学习 KNN算法

KNN算法 1. sklearn机器学习概述2. KNN算法-分类1 样本距离判断2 KNN 算法原理3 KNN缺点4 API5 sklearn 实现KNN示例6 模型保存与加载葡萄酒(load_wine)数据集KNN算法(1)wine.feature_names:(2)wine.target_names(3)KNN算法实现 1. sklearn机器学习概述 获取数据、数据处理、特…...

强化学习赋能医疗大模型:构建闭环检索-反馈-优化系统提升推理能力

引言 人工智能技术在医疗领域的应用正经历前所未有的发展,特别是在大型语言模型(LLMs)技术的推动下,医疗大模型(Medical Large Models)展现出巨大的潜力。这些模型不仅能够理解复杂的医学术语和概念,还能通过自然语言与用户交互,为医疗专业人士和患者提供有价值的信息和建…...

深入解析Spring Boot与JUnit 5的集成测试实践

深入解析Spring Boot与JUnit 5的集成测试实践 引言 在现代软件开发中&#xff0c;测试是确保代码质量和功能正确性的关键环节。Spring Boot作为目前最流行的Java Web框架之一&#xff0c;提供了强大的支持来简化测试流程。而JUnit 5作为最新的JUnit版本&#xff0c;引入了许多…...

哈希的原理、实现

目录 引言 一、哈希概念 二、哈希函数 三、哈希冲突解决方法 四、unordered系列关联式容器&#xff08;以unordered_map为例&#xff09; 五、哈希的应用 完整代码 六、总结 引言 在计算机科学领域&#xff0c;哈希是一种非常重要的数据结构和算法思想&#xff0c;广…...

端口443在git bash向github推送时的步骤

端口443在git bash向github推送时的步骤 你的环境可能因防火墙限制无法使用默认的 SSH 端口&#xff08;22&#xff09;&#xff0c;因此需要改用 SSH over HTTPS&#xff08;端口 443&#xff09; 进行 Git 推送。 github与git bash绑定问题详见博主先前写过的参考博文&#…...

Ankr:Web3基础设施的革新者

在Web3技术蓬勃发展的今天&#xff0c;去中心化基础设施的重要性日益凸显。Ankr作为这一领域的佼佼者&#xff0c;凭借其强大的分布式云计算能力和创新的技术解决方案&#xff0c;正在成为推动Web3发展的关键力量。本文将深入探讨Ankr的技术亮点、应用场景以及其在区块链生态中…...

配置git从公网能访问-基于frp

git从公网能访问 一个小小的疏忽带来了一下午上午的工作量起因与上下文与结论主要收获1。公网主机的防火墙需要至少三条3。gitlab的http端口和ssh端口&#xff0c;需要分为两个3。不要用nginx来解析二级域名 测试指令最终的成功的指令是&#xff1a; 用到的指令ssh1. 生成 SSH …...

HarmonyOS:重构万物互联时代的操作系统范式

HarmonyOS&#xff1a;重构万物互联时代的操作系统范式 引言&#xff1a;操作系统的新纪元 在数字化转型的深水区&#xff0c;操作系统作为数字世界的基石正在经历前所未有的变革。当全球科技巨头还在移动终端操作系统领域激烈角逐时&#xff0c;华为推出的HarmonyOS以分布式…...

告别“知识孤岛”:RAG赋能网络安全运营

一、背景 在网络安全运营工作中&#xff0c;我们积累了大量的内部知识内容&#xff0c;涵盖了威胁情报、事件响应流程、安全策略、合规性要求等多个方面。然而&#xff0c;这些知识虽然数量庞大、内容丰富&#xff0c;却因形式多样、结构分散&#xff0c;难以让每一位成员真正…...

A级、B级弱电机房数据中心建设运营汇报方案

该方案围绕A 级、B 级弱电机房数据中心建设与运营展开,依据《数据中心设计规范》等标准,施工范围涵盖 10 类机房及配套设施,采用专业化施工团队与物资调配体系,强调标签规范、线缆隐藏等细节管理。运营阶段建立三方协同运维模式,针对三级故障制定30 分钟至 1 小时响应机制…...

C 语言学习笔记(数组)

C 语言基础&#xff1a;第 08天笔记 内容提要 数组 排序算法&#xff1a;冒泡排序二维数组字符数组 数组 冒泡排序 排序思想&#xff08;向前冒泡&#xff09;&#xff1a; 一次排好一个数&#xff0c;针对n个数&#xff0c;最差情况需要n - 1次就可以排好每次排序假定第一…...

jvm安全点(二)openjdk17 c++源码垃圾回收安全点信号函数处理线程阻塞

1. 信号处理与桩代码&#xff08;Stub&#xff09;​​ 当线程访问安全点轮询页&#xff08;Polling Page&#xff09;时&#xff1a; ​​触发 SIGSEGV 信号​​&#xff1a;访问只读的轮询页会引发 SIGSEGV 异常。​​信号处理函数​​&#xff1a;pd_hotspot_signal_handl…...

uni-app 开发HarmonyOS的鸿蒙影视项目分享:从实战案例到开源后台

最近&#xff0c;HBuilderX 新版本发布&#xff0c;带来了令人兴奋的消息——uni-app 现在支持 Harmony Next 平台的 App 开发。这对于开发者来说无疑是一个巨大的福音&#xff0c;意味着使用熟悉的 Vue 3 语法和开发框架&#xff0c;就可以为鸿蒙生态贡献自己的力量。 前言 作…...

【赵渝强老师】在PostgreSQL中访问Oracle

在PostgreSQL数据库中&#xff0c;oracle_fdw是PostgreSQL数据库支持的外部扩展。通过使用oracle_fdw扩展可以读取到Oracle数据库中的数据。它是一种非常方便且常见的PostgreSQL与Oracle的同步数据的方法。使用oracle_fdw扩展需要依赖Oracle的Instance Client环境。 视频讲解如…...