自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(83)
  • 资源 (6)
  • 收藏
  • 关注

原创 MySql支持Emoji表情

现在有一个需求需要存储微信用户名,微信用户名可能包含Emoji表情,我们一般建表都使用UTF-8编码。Emoji表情是4个字节而Mysql的utf8编码最多3个字节,所以数据插不进去。解决方案:需要将Mysql的编码从utf8转换成utf8mb4。单元测试一下报错只修改表的默认字符集不行那怎么办,难道需要mysql后缀配置把字符编码加上。?characterEncodi...

2020-01-03 15:07:31 487

原创 Docker新手教程

简单的Docker入门教程Docker是基于Go语言实现的开源容器项目,诞生于2013年年初,最 初发起者是dotCloud公司。Docker自开 源后受到广泛的关注和讨论,目 前已有多个相关项目(包括Docker三剑客、Kubernetes等),逐渐形成 了围绕Docker容器的生态体系。Docker项目已加入了Linux基金会,并遵循Apache2.0协议,全部开源代码均在h...

2019-09-10 17:27:14 1027

原创 限流算法和基本应用

简介令牌桶算法令牌桶算法最初来源于计算机网络。在网络传输数据时,为了防止网络拥塞,需限制流出网络的流量,使流量以比较均匀的速度向外发送。令牌桶算法就实现了这个功能,可控制发送到网络上数据的数目,并允许突发数据的发送。令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,...

2019-08-15 16:19:34 226

原创 Mysql锁基础

mysql架构图共享锁共享锁也称为读锁,读锁允许多个连接可以同一时刻并发的读取同一资源,互不干扰;排他锁排他锁也称为写锁,一个写锁会阻塞其他的写锁或读锁,保证同一时刻只有一个连接可以写入数据,同时防止其他用户对这个数据的读写。锁的开销是较为昂贵的,锁策略其实就是保证了线程安全的同时获取最大的性能之间的平衡策略。mysql锁策略:talbe lock(表锁)表锁是mys...

2019-03-03 15:07:15 191

原创 IO模型(Java)

io模型本是UNIX网络编程相关的内容。UNIX中IO模型有五种,包括阻塞 I/O、非阻塞 I/O、I/O 复用、信号驱动式 I/O 、异步 I/O 等。 阻塞 I/O 模型阻塞式IO模型,一般表现为进程或线程等待某个条件,如果条件不满足,则一直等下去。条件满足,则进行下一步操作。如下图:非阻塞 I/O 模型非阻塞式IO模型:进程或线程目的未达到时,不再一味的等着,而是直接返回...

2018-12-29 15:08:35 201

原创 Spring Boot AMQP+RabbitMq

主要解决两个问题:1如何发送/发布消息(将java对象序列化为json),通过使用RabbitTemplate2如何读取消费消息(json反序列化为java对象)使用@RabbitListener注解amqp是一个规范,一种定义了两个系统间通过消息进行交互的协议,而RabbitMQ则是实现了该规范的一个强大的中间件产物。我们通过设置两个监听队列分别演示通用消息的处理及自定义消息...

2018-09-04 17:20:18 267

原创 Java synchronized 锁升级全过程深度解析:从 Mark Word 到偏向锁、轻量级锁与重量级锁的 HotSpot 实现

本文深入解析Java中synchronized关键字的多级锁升级机制。从对象头Mark Word的位图结构入手,详细阐述了偏向锁(无竞争优化)、轻量级锁(CAS+自旋)和重量级锁(OS阻塞)的实现原理。重点分析了锁状态转换路径、偏向锁撤销的安全点机制、自适应自旋优化策略,以及ObjectMonitor的膨胀逻辑。通过HotSpot源码解析,揭示了synchronized从字节码到JVM底层的完整执行路径。文章还对比了不同JDK版本的锁机制差异,并给出编写锁友好代码的实践建议。最终总结了JVM锁优化的核心思想

2025-11-14 17:13:54 892

原创 深入理解缓存雪崩、缓存穿透与缓存击穿:原理、场景与应对策略

在现代高并发系统中,缓存层(如 Redis、Memcached)是架构中至关重要的一环。它能极大地缓解数据库压力,提升响应速度。然而,随着系统规模增大与流量复杂化,缓存系统本身也可能成为“性能黑洞”。在实际业务中,缓存雪崩、缓存穿透与缓存击穿是最常见的三大问题,它们不仅可能导致缓存命中率骤降,更严重时甚至会让数据库被瞬间压垮。本文将从底层机制、触发原因、案例剖析、以及解决方案多个维度深度分析这三种问题。缓存雪崩。

2025-10-31 11:27:03 737

原创 KRaft 深度解析:Kafka 自主共识协议的崛起,终结对 ZooKeeper 的依赖

是 Kafka 自主实现的基于 Raft 协议思想的分布式一致性协议,专用于管理Kafka 元数据。控制器选举(Controller Election)元数据日志复制(Metadata Log Replication)集群状态维护(Broker Registration)配置变更、权限控制等一致性保障✅ KRaft 不用于 Kafka 的消息数据同步,而仅用于控制面(Control Plane)。

2025-10-17 13:20:37 1032

原创 RocketMQ 与 Kafka 架构与实现详解对比

需求推荐方案高吞吐量日志采集、流处理Kafka 更合适需要事务消息、Tag 消息过滤、低延迟RocketMQ 更合适跨地域异步复制、链路级流控 | RocketMQ 更擅长 || 和大数据生态紧密结合(Spark、Flink) | Kafka 优势明显 || 顺序消费、消息追溯能力强 | RocketMQ 表现更优 |

2025-10-16 11:25:57 460

原创 Netty线程模型与Tomcat线程模型对比分析

Netty是一个基于事件驱动和回调机制的网络通信框架,它以“异步、非阻塞、事件驱动”的模式进行设计,并且内部充分利用了Java NIO(New I/O)特性。Netty的线程模型非常灵活,能够根据业务需求调整不同的线程数量和线程池配置,确保高效的资源利用和线程调度。Tomcat作为一个Servlet容器,主要用于处理HTTP请求和响应,其线程模型相对于Netty而言较为传统,采用了基于线程池的模型。Tomcat的线程模型设计简单,主要基于Java Servlet规范,通过多线程的方式来处理每个HTTP请求。

2025-10-15 10:30:36 653

原创 Java 内存模型(JMM)概述

Java 内存模型(JMM)是一套规定了 Java 程序中各个线程如何交互和共享数据的规则。共享变量的可见性:多个线程间对共享变量的修改是否能被及时地看到。操作的有序性:多个线程对共享变量的操作执行顺序是否能够按照预期执行。原子性:线程对共享变量的操作是否是原子的。Java 内存模型的目标是让开发者不需要关心底层硬件和操作系统的细节,能够确保多线程环境下的程序行为是正确的。理解 JMM 的工作原理,特别是内存可见性和顺序性的重要性,能够帮助我们设计更加可靠的并发程序。合理使用volatile和。

2025-10-14 17:40:47 311

原创 HTTP 1.0、2.0、3.0 原理与优劣分析

特性HTTP/1.0HTTP/2.0HTTP/3.0协议类型文本协议二进制协议基于QUIC的二进制协议连接管理每次请求建立新连接单连接多路复用基于UDP的多路复用头部压缩无HPACK头部压缩QPACK头部压缩安全性无内置加密支持TLS加密内置TLS 1.3加密多路复用不支持多路复用支持多路复用改进的多路复用机制适应网络变化的能力不适应高延迟网络适应性较差对丢包和延迟具有较好容忍连接建立延迟高较低极低(0-RTT)

2025-10-14 13:42:45 1285

原创 深入理解设计模式:Java 实战解析

定义:提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定具体类。应用场景当一个系统需要处理多个产品族,并且每个产品族中的对象具有不同的具体实现时。Java 示例@Override@Override。

2025-10-14 11:19:42 526

原创 手把手实现 Raft 协议:日志复制与一致性篇

为了简化代码,我们假设所有节点都是在同一网络环境下的,日志条目由 Leader 节点生成,Follower 节点将按照 Leader 的指令复制日志。Raft 协议的目标是保证即使在节点故障的情况下,所有未提交的日志条目也能够保持一致,最终达成一致性。日志复制的目标是保证集群中所有节点的日志在相同位置有相同的条目,从而确保系统的状态一致性。的过程,展示了如何通过 Raft 协议将 Leader 节点的日志条目复制到 Follower 节点,并确保日志的一致性。Raft 协议中,日志是集群状态的一部分。

2025-10-13 20:57:06 667

原创 手把手实现 Raft 协议:Leader 选举篇

选举失败:如果在选举过程中出现冲突(比如有节点的日志更新失败),或者 Candidate 没有获得足够的选票,选举将失败,Candidate 将重新启动选举过程。Leader:在选举过程中,获得多数节点选票的节点将成为 Leader。选举超时:每个节点都有一个独立的超时计时器。选举超时:每个节点都有独立的超时计时器,这个超时时间是随机的,因此每个节点的选举超时时间不同。在实际实现中,节点通过定时器触发选举超时,发送投票请求,并处理来自其他节点的投票响应,最终决定是否成为 Leader。

2025-10-13 20:51:22 670

原创 深入浅出分布式一致性协议:Paxos、Raft、ZAB 全解析

分布式一致性是指多个节点在某一时刻观察到的数据是相同的。强一致性(Strong Consistency):在任何时刻,所有节点看到的都必须是同样的数据。最终一致性(Eventual Consistency):系统保证最终所有副本的数据将一致,但在短时间内可能由于网络延迟等原因,某些副本会与最新数据不一致。为了保证强一致性,分布式系统需要通过一致性协议来协调各个节点的操作。分布式一致性协议是支撑现代分布式系统的基石。

2025-10-13 20:39:25 554

原创 Redis集群架构详解:如何实现高可用和高性能

副本节点(slave / replica)不会主动持有槽,但会同步其主节点的整个数据集(包括属于这些槽的数据)。因为 Redis Cluster 在故障切换过程中采用异步复制机制,有一个时间窗口可能已确认写入在主节点,但还没复制到副本,且主节点宕机时该写入会丢失。在设计跨多个节点时,有时会创建一个不承担槽的“仲裁节点”(空主节点),用于提升选举票数以防止某一边失去多数票。如前所述,在槽迁移过程中如果目标节点或源节点宕机,可能造成一些节点对槽归属认知不一致,尤其是那些未及时收到 UPDATE 消息的节点。

2025-10-13 13:42:05 901

原创 特殊场景下的 TCP 优化

场景核心挑战常用优化策略高 BDP 链路窗口受限、恢复慢、重传代价大窗口缩放、激进拥塞控制(CUBIC / BBR 等)、初始 cwnd 提升、快速恢复 / 重传优化、精细 RTT / RTO 估算无线 / 移动网络丢包非拥塞、链路波动、切换中断链路层 ARQ / HARQ、交叉层反馈、丢包去耦、动态窗口调整、路径切换、无线专用 TCP 变体多路径 / 异构链路路径不一致、乱序、拥塞耦合MPTCP、路径调度、乱序容忍、拥塞耦合控制、连接迁移数据中心 / 云内部。

2025-10-10 10:34:07 717

原创 TCP 协议的初步探索

连接开始 / 超时后➝ 进入慢启动cwnd 增长至 ssthresh ➝ 切换到拥塞避免若发生三重重复 ACK➝ 触发快速重传 + 快速恢复若发生超时➝ cwnd 重置、ssthresh 更新,并返回慢启动在无丢包时按线性方式慢慢增长 cwnd在现代改进版本中,这些阶段可能有更多细分或替代策略。

2025-10-10 10:31:32 755

原创 你问的问题不是你真正的问题 —— 理解 X-Y Problem

你真正想解决的是问题 X,但你在问的是你为了解决 X 而尝试的某个方法 Y 的问题。于是你去论坛、问 AI、找同事讨论 Y,但其实 Y 并不是最优解,甚至根本不是解决问题 X 的正确方向。关键词解释X你的真实目标或问题Y你以为的解决方案用解决 Y 的问题代替了原本 X 的问题。

2025-10-09 17:45:30 938

原创 使用Java实现MCP(模型上下文协议)完整指南

本文介绍了使用Java实现MCP(Model Context Protocol)的完整方案。MCP是由Anthropic提出的标准化协议,用于连接大型语言模型与外部数据源和工具。文章详细讲解了项目架构设计,包括传输层、协议层、服务层和客户端的设计,并提供了Java实现的代码示例,涵盖消息基类、请求/响应模型、标准输入输出传输层以及服务器核心实现。通过Maven项目配置和Jackson库支持,开发者可以构建一个支持方法路由、工具调用和资源管理的MCP服务器。该实现遵循JSON-RPC 2.0规范,为AI应用提

2025-10-09 15:44:24 924

原创 如何做好一个Java架构设计:架构师的思路与实践

摘要:本文深入探讨Java架构设计的核心目标与关键实践。架构设计需平衡可扩展性、高可用性、性能、可维护性和安全性五大维度,采用微服务架构、分布式系统、事件驱动等方案应对业务增长。文章指出常见错误如过度设计、忽视技术债务等,强调架构师需基于团队能力做出合理技术选型。优秀的架构设计应立足全局视角,构建既能支撑业务发展又易于维护的系统。通过系统性思考和合理决策,架构师可带领团队打造高质量的企业级应用。

2025-10-09 14:20:51 622

原创 深入探索 AQS 内部工作原理:线程调度、挂起与唤醒机制全解析

本文深入解析AQS在Java并发包中的三大典型应用。首先剖析ConditionObject的条件等待机制,包括其与Object.wait的区别、await/signal流程及双队列设计。其次解读ReentrantReadWriteLock如何通过state位运算实现读写分离,分析其公平/非公平模式差异。最后阐述FutureTask的异步控制机制,包括状态转换、任务完成唤醒等实现原理。全文通过对比表格和代码示例,系统性地展示了AQS在不同并发场景下的核心设计思路与实现技巧。

2025-09-29 11:17:14 665

原创 深入理解 AbstractQueuedSynchronizer(AQS):构建高性能同步器的基石

摘要: AbstractQueuedSynchronizer(AQS)是Java并发包的核心基础类,为ReentrantLock、Semaphore等同步器提供底层支持。其核心设计围绕state状态变量和CLH队列,通过acquire/release方法实现独占/共享两种同步模式。开发者可通过继承AQS并重写tryAcquire等关键方法定制同步逻辑。AQS采用LockSupport实现线程挂起/唤醒,避免了传统wait/notify的缺陷。尽管功能强大,但存在非公平性导致线程饥饿、调试复杂等问题,建议优先

2025-09-29 11:05:16 851

原创 Java 架构师系列:JVM 与 AI 负载的优化策略

本文探讨了JVM在AI负载下的优化策略,重点分析了2025年Java系统面临的高内存消耗、长时计算等挑战。文章从JVM基础机制入手,详细介绍了针对AI场景的调优原则,包括内存管理、垃圾回收和性能优化等关键环节。通过代码示例和基准测试数据,提供了ZGC/Shenandoah等低暂停GC的选择建议,以及Vector API、虚拟线程等Java新特性的应用方案。文章还分享了内存监控、JIT编译优化等实用技巧,并针对不同AI负载类型给出了具体优化建议。这些策略能有效帮助架构师应对AI驱动系统的性能挑战,实现高效的J

2025-09-28 13:47:57 878

原创 Java 架构师系列:AI Agent 在微服务架构中的集成策略

本文探讨了AI Agent在微服务架构中的集成策略,重点分析了2025年技术趋势下Java架构师面临的挑战与机遇。文章提出将AI Agent封装为独立微服务("AI as a Service")的核心原则,并详细介绍了五种关键架构模式,包括Agent as Microservice和Event-Driven Agent等。通过Spring Cloud+LangChain的示例,展示了从设计、实现到部署的全流程方案,特别强调了Kubernetes编排、服务网格安全和性能监控等关键技术要点。

2025-09-28 13:44:26 687

原创 Java 架构师系列:LangChain 是否适合开发 AI Agent?

在讨论 LangChain 的适用性前,先澄清 AI Agent 的概念。AI Agent 是一种自主智能系统,能感知环境、推理决策并执行行动,而非简单响应查询。它通常基于大型语言模型(LLM)如 GPT-4o 或 Claude,但添加了工具集成、记忆和多步推理能力。核心特性自主性:能独立规划任务,如“搜索天气,然后生成报告”。工具使用:调用外部 API、数据库或浏览器。记忆与上下文:保留历史交互,实现多轮对话。类型。

2025-09-28 13:40:35 837

原创 Java 架构师系列:探索 LangChain – LLM 应用开发框架及其学习路径

LangChain 是 AI 时代开发者必备的框架,它将 LLM 从“玩具”转化为生产级工具。作为 Java 架构师,学习它能拓宽视野,实现跨语言集成(如 Java + Python 微服务)。从官方快速入门开始,逐步实践,你将快速上手。在下一篇文章中,我们将探讨“LLM 在 Java 架构中的集成策略”。如果你有 LangChain 项目经验或疑问,欢迎评论分享!

2025-09-26 13:32:07 1102

原创 Java 架构师系列:微服务架构设计与实践

微服务架构是 Java 架构师的必备技能,但成功在于平衡拆分与复杂性。从一个小项目起步,应用这些原则,你将构建出高效的企业系统。在下一篇文章中,我们将探讨“性能优化与调优策略”,包括 JVM 深度和分布式缓存。如果你有微服务实践经验或疑问,欢迎评论分享!

2025-09-26 10:44:55 847

原创 如何成为一名合格的Java架构师

在很多人的认知中,架构师 = 高级程序员 = 会用更多框架的人。但这是极大的误解。成为Java架构师,不是一场短跑,而是一场持续学习、不断实践、反复反思的马拉松。有目标:知道自己要成为什么样的人有路径:清楚每一步该学什么有行动:每天进步1%,一年后就是质变🌟记住:每一个架构师,都曾是一个问“下一步该学什么”的程序员。

2025-09-25 16:10:55 826

原创 Java 架构师入门指南:从设计原则到企业级实践

成为 Java 架构师是一个持续迭代的过程,需要结合理论、实践和反思。从今天起,选择一个原则或模式应用到当前项目中,并记录心得。这篇文章基于 2025 年最新趋势,如 Java 23 的预览特性(Pattern Matching)和 Spring 6.1 的虚拟线程支持。如果你正面临具体架构挑战,如迁移到云原生或优化高并发,欢迎在评论区分享,我们将在后续文章中深入探讨,如“微服务治理策略”或“企业级性能调优”。保持好奇,持续演进!

2025-09-25 16:02:44 914

原创 深入理解Java AQS机制:从原理到源码解析

本文深入解析了Java并发框架的核心组件AbstractQueuedSynchronizer(AQS)的设计原理与实现机制。AQS通过分离同步状态管理与线程等待队列,支持独占和共享两种资源获取模式。文章详细剖析了AQS的核心数据结构(同步状态state、CLH队列节点Node)、线程争抢与释放流程、阻塞唤醒机制(基于LockSupport),并对比了公平锁与非公平锁的实现差异。此外,还探讨了Condition条件队列以及线程取消与超时处理机制。AQS作为Java并发包的基础框架,为ReentrantLock

2025-09-24 19:39:42 443

原创 深入理解Java线程池

通过剖析源码,我们看到其精巧的设计:原子 CTL、AQS-based Worker、CAS 驱动的动态调整。这些与 OS 线程管理的深度集成,使线程池成为高效并发工具。建议阅读 OpenJDK 源码实践。如果你有疑问,欢迎讨论!参考:OpenJDK 源码、Oracle API 文档、Doug Lea《Java Concurrency in Practice》。

2025-09-24 19:25:16 425

原创 Spring Cloud Gateway:构建智能API网关的终极指南

它基于Spring 5、Spring Boot 2和Project Reactor(WebFlux)构建,提供了强大、高效且易于扩展的方式来路由到API,并为它们提供横切关注点(Cross-Cutting Concerns)的支持,如:安全性、监控/指标和弹性。: 它与服务发现(如Eureka、Nacos、Consul)和配置中心(如Spring Cloud Config、Nacos)无缝集成,可以轻松实现基于服务名的动态路由,无需硬编码服务实例的地址。一旦找到匹配的路由,请求就会经过该路由指定的所有。

2025-09-24 19:20:20 714

原创 熟练使用Java 线程池

本文深入解析了Java线程池的核心原理与实现细节。首先阐述了线程池的必要性,包括减少资源消耗、简化线程管理等优势。重点剖析了ThreadPoolExecutor的7个核心参数:核心线程数、最大线程数、存活时间、任务队列等,并详细说明了线程池的工作流程和任务处理机制。文章还介绍了线程池的生命周期状态转换,以及Executors提供的几种预配置线程池类型。最后给出了参数调优建议和常见避坑指南,强调生产环境应自定义线程池参数而非直接使用默认配置。通过本文可全面掌握Java线程池的实现原理与最佳实践。

2025-09-24 19:17:32 658

原创 ConcurrentHashMap详解

ConcurrentHashMap是Java中的线程安全哈希表实现,在JDK 1.8进行了重大优化。它采用Node数组+红黑树+CAS的混合结构,通过细粒度锁(synchronized桶头节点)和无锁操作(CAS)实现高并发。读操作无锁,写操作仅锁定单个桶,支持并发扩容和多线程协同迁移数据。当链表长度超过阈值(默认8)时会转为红黑树,提升查询效率。相比JDK 1.7的分段锁设计,1.8版本锁粒度更细,性能更高,适合高并发场景下的缓存、计数器等应用。

2025-09-16 21:27:29 1127

原创 深入解析 IO 模型:从阻塞到异步的演进

本文深入解析了五种IO模型:阻塞IO(进程阻塞等待数据)、非阻塞IO(轮询检查数据)、IO多路复用(单线程监控多个连接)、信号驱动IO(内核信号通知)和异步IO(内核完成全部操作)。通过对比各模型的原理、优缺点和适用场景,指出随着并发需求增长,IO模型从简单阻塞向高效异步演进。高并发场景推荐使用IO多路复用或异步IO,而新技术如io_uring正进一步提升IO性能。理解这些模型有助于设计更高效的系统架构。

2025-09-12 16:51:42 625

原创 JAVA IO

#JAVA IOIO基础知识I(Input 把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作)O(Output 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作)我们把这两种操作成为IO.以输入为例,我们可以粗略画个草图IO操作有多种方式,不同的实现方式性能上面表现也不一样。我们从内存复制,阻塞时间来分析不同的IO模型的差异,可能更好理解。常见IO模型分类及对比:我们按照次序从左到右 来介绍这几个IO模型:首先我们要知道一个基础共识:所有的系统

2020-09-16 16:30:04 261

原创 单元测试

单元测试相关为什么要单元测试首先我们了解下概念,什么是单元测试?单元测试是由开发者编写的一小段代码,用于检验被测代码一个很小的,很明确的功能是否正确。用于判断某个条件(或特定场景下)的某个特定函数的行为是否正确。执行单元测试,是为了证明某段代码的行为和开发者所期望的是否一致。因此,我们要测试的是规模很小的,非常独立的功能片段。通过对所有单独的部分行为建立起信心,确信他们都和我们期望的一致,然后我们才能开始组装和测试整个系统。单元测试目的其实只有一个目的,提高代码健壮性,减少bug率,减少线上故障

2020-08-12 13:01:30 361

yum安装mysql官方文档(支持各个版本)

cetnos或者其他linux发行版支持yum方式,通过修改yum源安装mysql,十分详细,官方教程,支持各个mysql版本

2018-11-16

netty开发实战

netty性能实战,初学者必读的netty教程,基于netty4.x

2018-12-13

eclipse Mac安装

mac下的exlipse安装包,直接下载解压即可安装。最新的exlipse版本

2018-10-27

springboot+springmvc+mybatis+druid整合

基于springboot(2.0版本),整合了mybatis及druid,配置好了监控中心。可以直接下载用

2018-07-18

jsp+servlet+jdbc原生实现增删改查两张表

原生实现jsp+servlet的增删改查,通过JDBC连接数据库。没有框架内容,适合初学者使用。代码结构清晰注释很详细,直接下载就可以放到环境中跑起来

2018-07-04

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除