自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(251)
  • 资源 (2)
  • 收藏
  • 关注

原创 ReentrantLock的公平锁和非公平锁

摘要:公平锁与非公平锁的核心区别在于获取锁的机制。公平锁严格按照FIFO顺序获取锁,通过hasQueuedPredecessors()检查队列情况;非公平锁会直接尝试抢占锁,提供两次抢占机会。非公平锁吞吐量更高但可能导致饥饿,是默认选择;公平锁保证顺序但性能较低,适用于需要严格公平的场景。ReentrantLock通过FairSync和NonfairSync两种同步器实现这一差异,体现了性能与公平性的平衡。

2026-01-08 14:00:00 793

原创 java CAS原理和用法

CAS(Compare-And-Swap)是一种无锁原子操作机制,通过比较内存值与预期值来决定是否更新,整个过程不可分割。Java通过java.util.concurrent.atomic包提供原子类实现CAS,如AtomicInteger和AtomicStampedReference(解决ABA问题)。其优点是高性能、避免死锁,但存在ABA问题和自旋开销。核心方法compareAndSet()保证了线程安全,适用于低竞争场景。

2026-01-08 07:00:00 938

原创 java synchronized 和 retrantlock 对比

场景推荐大多数标准同步需求需要高级功能(可中断、超时、公平锁、多个条件)简单来说,是“傻瓜相机”,简单可靠;是“单反相机”,功能强大但需要更多操作。在现代Java开发中,除非你有明确理由需要使用的高级特性,否则默认选择是更明智和安全的做法。

2026-01-08 07:00:00 1222

原创 源码解析-ConcurrentHashMap

摘要: JDK8中的ConcurrentHashMap通过CAS操作和细粒度锁(仅锁单个桶)实现高效并发,相比HashMap具有线程安全特性但不允许null键值。其核心设计包括:1) put操作采用CAS尝试无锁插入,冲突时仅同步单个桶;2) get操作完全无锁,保证弱一致性;3) 支持多线程协助扩容。与HashMap相比,ConcurrentHashMap在并发场景下性能更优,但迭代器是弱一致性的,且读写操作存在不同的同步策略。

2026-01-07 14:00:00 400

原创 从HashMap源角度解释一下为什么对象的hashcode()和equals()方法要一起重写

HashMap的核心机制依赖于键的hashCode和equals方法协同工作。hashCode用于定位键在数组中的桶位置,而equals用于确认键的逻辑相等性。若只重写equals而不重写hashCode,会导致逻辑相等的键被分配到不同桶中,使得HashMap无法正确检索。因此,必须同时重写这两个方法,确保语义相等的对象具有相同的hashCode值,才能保证HashMap的正确运行。这是Java对象契约的强制性要求。

2026-01-07 07:00:00 779

原创 java垃圾收集 minorgc majargc fullgc

摘要: JVM垃圾回收(GC)主要分为Minor GC、Major GC和Full GC三种类型。Minor GC仅回收年轻代(Eden+Survivor),触发于Eden区空间不足,速度快且频繁。Major GC回收老年代,触发于老年代空间不足,速度较慢。Full GC回收整个堆(年轻代+老年代+方法区),触发条件包括老年代不足、方法区不足等,STW时间最长,应尽量避免。三者关系形成对象生命周期:新对象在Eden分配→Minor GC存活后进入Survivor→年龄达标晋升老年代→老年代不足触发Major

2026-01-06 17:46:58 505

原创 java BIO、NIO、AIO用法样例

摘要: 本文介绍了三种Java网络I/O模型:BIO(同步阻塞)、NIO(同步非阻塞)和AIO(异步非阻塞)。BIO采用“一连接一线程”模式,简单但性能受限;NIO通过Selector单线程管理多路复用,减少线程开销;AIO基于回调机制实现真正的异步操作,适合高并发场景。每种模型均附有代码示例,分析其特点与适用场景,帮助开发者根据需求选择合适方案。

2026-01-06 17:34:48 592

原创 分布式系统中接口幂等性

分布式系统中接口幂等性至关重要,指同一请求执行一次或多次的结果一致。其核心在于防止网络超时重试、用户误操作等场景导致的重复扣款、重复下单等问题。常见实现方案包括:1) Token机制,通过唯一标识拦截重复请求;2) 数据库唯一索引,防止数据重复插入;3) 乐观锁/悲观锁控制并发修改;4) 状态机机制校验业务流转状态。这些方案能有效避免资金损失、数据混乱等后果,是设计写操作接口时的关键考量。

2026-01-04 16:30:00 548

原创 软件架构-互联网大厂应对流量洪峰(如双十一、春晚红包、明星官宣、突发新闻等)

互联网大厂应对流量洪峰的核心策略可概括为"分流、削峰、限流、扩容、降级"五大原则。通过构建弹性基础设施(负载均衡、CDN、数据库扩容)、优化应用架构(多级缓存、消息队列异步化)、实施防御机制(限流熔断、服务降级)以及完善的监控演练体系,形成从底层资源到上层应用的全方位防护。这套技术体系结合严密的运营流程,使系统能够平稳应对双十一、春晚红包等高并发场景,保障核心业务链路的稳定性。

2026-01-04 07:00:00 851

原创 数据库分库分表能解决什么问题?会带来哪些新的挑战

分库分表能有效解决单库性能瓶颈,提升查询效率和系统吞吐量,支持水平扩展。但也带来跨库查询、分布式事务、全局ID生成等复杂问题,大幅增加开发和运维难度。建议优先优化SQL、引入缓存,仅在数据量和并发量极大时采用分库分表,并借助成熟中间件降低复杂度。过早分库分表会增加系统不必要复杂性。

2026-01-03 19:00:00 977

原创 软件架构-解决数据库数据快速增长问题

本文系统阐述了应对互联网项目数据库快速增长问题的分层解决方案。从短期见效的基础优化(数据归档、硬件升级、索引优化)到中期架构演进(读写分离、缓存引入、垂直分库),再到长期战略(水平分片、NewSQL数据库)。强调需结合监控告警与数据治理,采取渐进式优化策略:先实施高性价比的数据归档和缓存,再根据业务规模逐步升级架构,最终采用分布式方案应对海量数据。整个方案注重成本效益平衡,为不同阶段的数据库性能问题提供完整解决框架。

2026-01-03 07:15:00 1737

原创 计算机中的 DMA是什么技术

DMA(直接内存访问)是一种允许外部设备绕过CPU直接与内存交换数据的技术。它通过专用DMA控制器实现,工作流程包括CPU初始化、DMA接管总线、直接传输数据和完成后中断通知CPU。DMA技术解放了CPU资源,提升系统效率,降低延迟和功耗,广泛应用于磁盘、网卡、显卡等需要高速数据传输的场景。这项技术是现代计算机提升性能的关键基础之一。

2026-01-02 16:30:00 818

原创 举例说明java中wait()是可响应中断是什么意思

摘要: “可响应中断”指线程在阻塞等待时(如调用wait()、sleep()等方法),若被其他线程interrupt(),会立即退出阻塞并抛出InterruptedException。这是一种协作机制,允许安全终止线程任务。典型流程为:线程A阻塞时,线程B调用A.interrupt()触发中断,A捕获异常后执行清理逻辑。相比Thread.stop()更安全,适用于任务取消、优雅关机等场景。Condition.await()同理,而awaitUninterruptibly()则不可中断。处理Interrupt

2026-01-02 15:00:00 451

原创 java线程的不同状态下调用interrupt()方法后的行为及注意事项

摘要:Java线程中断机制仅在特定阻塞状态下有效。线程状态分为NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED六种,其中WAITING和TIMED_WAITING状态可被interrupt()立即中断并抛出InterruptedException,而RUNNABLE状态仅设置中断标志需线程主动检查。BLOCKED状态不可中断,NEW和TERMINATED状态无效。中断本质是协作机制,需结合异常处理或标志检查实现线程终止。

2026-01-02 10:25:15 392

原创 java并发编程condition 的用法

Condition是Java并发包中与Lock配合使用的线程协调接口,提供比synchronized更灵活的等待/通知机制。它允许一个锁关联多个条件队列,实现选择性通知,解决了传统wait()/notify()无法区分等待条件的问题。核心方法包括await()、signal()等,使用前必须持有锁。典型应用如生产者-消费者模型,通过notFull和notEmpty两个条件实现高效线程协作。相比synchronized,Condition支持更精细的线程控制、多种超时机制和公平唤醒,适合复杂同步场景,但需要手

2026-01-02 10:10:39 592

原创 Netty与Linux的零拷贝技术,为何它能大幅提升性能?

零拷贝技术是提升数据传输效率的关键技术。传统方式中,数据在用户空间和内核空间之间频繁拷贝,导致4次上下文切换和4次数据拷贝,极大浪费CPU资源。Linux的sendfile系统调用通过减少拷贝次数和上下文切换,实现高效文件传输。Java NIO通过FileChannel.transferTo()封装该功能,而Netty进一步优化,提供组合缓冲区、内存切片和直接内存等零拷贝技术。零拷贝通过多层次的优化,显著提升系统吞吐量并降低延迟,是现代高性能网络编程的核心技术之一。

2026-01-02 07:00:00 1317

原创 Linux内核和发行版的的区别、职责

Linux内核与发行版的区别 Linux内核是操作系统的核心,负责硬件管理、进程调度等底层功能,相当于汽车的发动机。而Linux发行版是基于内核构建的完整操作系统,包含图形界面、软件包和工具集,如同整辆汽车。内核提供基础服务,用户不直接交互;发行版则提供用户友好的操作环境。常见发行版如Ubuntu、Fedora等,它们在相同内核基础上添加了不同的软件和界面。简言之,内核是系统的"心脏",发行版是"成品操作系统"。

2026-01-01 20:59:30 537

原创 Linux第一个用户空间进程init进程的演进过程

Linux系统中的init进程是内核启动后创建的第一个用户空间进程(PID 1),承担祖先进程、守护进程管理、初始化脚本执行等核心功能。其实现经历了从传统SysVinit(基于运行级别)到事件驱动的Upstart,再到现代主流的Systemd的演进。Systemd通过并行化启动、单元文件管理和日志整合等特性,显著提升了系统效率,已成为当前Linux发行版的标准。尽管存在复杂性争议,Systemd仍是现代Linux系统管理的核心组件,掌握其基本操作(如systemctl和journalctl命令)是运维必备技

2026-01-01 20:41:00 796

原创 top 命令中的 wa (IO wait) 指标,理论上几乎完全是由磁盘IO(包括swap)引起的,而不是网络IO

摘要:wa指标反映磁盘而非网络IO等待,因为磁盘IO是阻塞式的,会使进程进入不可中断睡眠状态(D),此时CPU空闲等待磁盘操作完成,统计为wa时间。而网络IO是异步的,通过中断处理机制完成,相关时间计入hi/si指标。高wa值表明存在磁盘瓶颈,可通过iotop工具定位高IO进程。网络请求虽不直接导致wa升高,但可能间接引发磁盘IO压力,如Web服务器处理大量文件请求或内存不足触发Swap交换时。

2025-12-30 21:07:09 461 1

原创 Linux 系统 I/O 监控命令大全

本文介绍了Linux系统中常用的I/O监控命令及其功能特点,帮助用户快速定位系统I/O性能问题。主要工具包括:iostat(设备级I/O统计)、iotop(进程级实时监控)、vmstat(系统资源综合报告)、dstat(多功能资源监控)、ioping(磁盘延迟测试)、lsof(文件占用排查)、pidstat(进程资源统计)以及/proc文件系统(底层数据接口)。每个命令都配有典型用法示例和输出解析,涵盖IOPS、吞吐量、延迟等关键指标。这些工具从不同维度(系统/设备/进程/文件)提供I/O性能数据,适用于各

2025-12-30 20:43:57 1034

原创 大模型AI时代,程序员为何“哀鸿遍野”?

AI时代下程序员职业的变革与机遇 当前关于"AI取代程序员"的讨论持续升温,但实际情况更为复杂。从技术层面看,AI主要替代重复性编码工作,反而提升了程序员效率,使其转向架构设计和复杂问题解决。资本逻辑也从"囤人"转向"囤算力",促使岗位需求向复合型人才倾斜。面对变革,程序员应提升架构能力、深耕业务理解、培养管理协作等软技能。AI本质上是编程增强工具,淘汰的不是程序员,而是不会使用AI的人。未来属于能驾驭AI、专注创造性工作的新一代技术人才。

2025-12-21 09:28:22 869 1

原创 websocket为什么需要在tcp连接成功后先发送一个标准的http请求,然后在当前tcp连接上升级协议成websocket

摘要:WebSocket协议采用HTTP升级机制设计,主要解决三大问题:(1)兼容现有网络基础设施,通过"伪装"成HTTP请求穿透防火墙和代理服务器;(2)防止跨协议攻击,通过严格的握手验证确保安全;(3)无缝集成Web生态,复用HTTP端口、安全模型和认证机制。这种设计既实现了全双工通信的创新,又兼顾了与现有网络环境的兼容性,使WebSocket得以广泛应用。

2025-12-19 15:00:00 996

原创 websocket 协议升级过程中客户端和服务器在背后都干了些啥

WebSocket协议建立连接分为三个阶段:握手阶段、数据交换阶段和连接关闭阶段。在握手阶段,客户端通过HTTP升级请求发起WebSocket连接,服务器验证后返回101状态码确认升级。数据交换阶段采用精简帧结构实现全双工通信,支持文本/二进制数据传输。最后通过关闭帧优雅终止连接。整个过程依赖底层TCP连接,HTTP仅用于初始握手,WebSocket协议则负责高效实时通信。关键点包括安全验证、数据帧封装和全双工交互。

2025-12-19 10:51:38 687

原创 springmvc websocket 的用法

WebSocket 是一种网络通信协议,它实现了客户端(通常是浏览器)与服务器之间的**全双工、双向、长连接**的通信通道。它解决了传统 HTTP 协议在实时通信场景下的痛点:* **HTTP 的短板**:HTTP 协议是**无状态、单向**的。客户端发起请求,服务器响应后连接就关闭。要实现实时数据推送(如聊天消息、实时行情),只能通过低效的“轮询”(客户端不断向服务器发送请求询问是否有新数据),这浪费了大量带宽和服务器资源。* **WebSocket 的优势**:WebSocket 在初次握

2025-12-19 10:36:40 1239 1

原创 sshd除了远程shell外还有哪些功能

SSH(Secure Shell)是一种加密网络协议,主要用于远程登录和安全管理。其核心功能包括:1)交互式Shell访问,通过ssh user@host登录远程服务器;2)远程命令执行,直接运行单条命令;3)SFTP安全文件传输,支持上传下载等操作;4)本地端口转发(-L),将本地端口映射到远程网络;5)远程端口转发(-R),让外部访问本地服务;6)SSH代理转发(-A),安全地通过跳板机连接内网服务器。这些功能通过加密隧道保障数据传输安全,是系统管理和网络运维的重要工具。

2025-12-18 15:58:38 841

原创 go为什么设计成源码依赖,而不是二进制依赖

摘要:Go语言采用源码依赖而非二进制依赖,主要基于以下设计原则:1) 追求简单性和可重复性,确保构建一致性和环境无关;2) 实现强大跨平台编译能力,无需管理多平台二进制文件;3) 提升安全审计透明度,所有依赖源码可见;4) 支持全程序优化和死代码消除;5) 统一依赖管理,避免"依赖地狱"。虽然源码依赖存在首次编译耗时等缺点,但通过缓存机制等优化,其带来的开发效率、可靠性和跨平台优势显著。这一设计体现了Go语言"工程优先"的理念,权衡运行时性能换取开发体验的提升。

2025-12-18 14:50:47 961

原创 不懂数据库索引原理?你写的SQL跑的慢如老牛,就等着挨骂吧

本文深入解析数据库索引原理与优化实践。B+树因其平衡多路搜索特性,在范围查询和排序上完胜哈希表,通过减少磁盘IO显著提升性能。文章提出索引四大原则:最左前缀、避免失效、选择性和覆盖索引,并给出六大优化技巧,包括EXPLAIN分析、联合索引设计、分页优化等。通过血泪案例警示常见错误,如隐式转换、索引顺序错误等。最后强调优化索引是提升数据库性能的关键,建议通过慢查询日志和EXPLAIN持续优化。掌握这些技巧可大幅提升查询效率,从初级迈向高级开发。

2025-12-16 19:30:00 846

原创 不会数据结构?你写的代码正在背后偷偷骂你蠢!

数据结构不是八股文,是内功心法:堆排序能优化TOP-K查询并查集能搞定社交网络关系跳表能在Redis里替代平衡树现在省下的学习时间,将来都会变成:凌晨3点的紧急告警绩效谈话时的尴尬沉默面试时被挂掉的羞辱

2025-12-16 14:58:07 535

原创 vscode是js开发的,为什么能支持golang java等各种语言开发

VS Code通过客户端-服务器架构实现对Java等语言的支持:VS Code作为客户端提供界面交互,而独立的语言服务器(如Java语言服务器)负责深度代码分析。两者通过标准化的语言服务器协议(LSP)通信,使编辑器无需内置语言知识即可获得智能功能。这种架构实现了语言无关性、资源隔离和生态繁荣,调试功能也采用类似的调试适配器协议(DAP)。不同语言社区可开发专属服务器,所有支持LSP的编辑器都能共享这些语言服务。

2025-12-16 14:49:48 625

原创 Linux系统中的socket激活:先创建监听端口,后启动程序

本文深入探讨了Linux系统中systemd的Socket激活特性,详细解析其颠覆传统服务启动模式的核心理念:由systemd预先监听端口,在首个连接请求到达时才启动服务进程,实现按需启动和资源优化。通过配置Python HTTP服务的实战示例,展示了.service和.socket单元文件的创建方法及交互机制。与传统端口绑定方式相比,Socket激活具有启动速度快、资源占用低、可靠性高等优势,特别适合不频繁访问的服务,但也带来配置复杂度增加的代价。文章最后强调该技术将服务提供与端口监听解耦,为系统管理带来

2025-12-14 20:35:16 929

原创 排查java应用内存溢出的工具和方法

Java OOM 错误排查指南 OOM 错误排查需先确定错误类型(堆内存、Metaspace、线程数等),再使用相应工具分析。关键步骤包括:添加JVM参数自动生成堆转储文件,使用MAT分析内存泄漏,检查GC日志。常见原因有内存泄漏、堆设置过小或代码问题。建议配置-XX:+HeapDumpOnOutOfMemoryError参数,这是排查的核心。

2025-12-14 15:26:50 963

原创 深入理解 Linux Namespace:隔离技术的基石

Linux容器技术的核心是Namespace机制,它通过隔离系统资源实现轻量级虚拟化。Linux内核提供8种Namespace类型,分别隔离文件系统、主机名、进程间通信、进程ID、网络、用户权限等资源。系统启动时为每种资源创建初始命名空间,所有进程默认共享这些全局视图。运行时通过clone()、unshare()等系统调用创建新Namespace,使容器进程获得独立资源环境。这种机制让容器既能保持高性能,又具备良好的隔离性和安全性,是理解容器技术的基础。

2025-12-14 10:16:14 626

原创 容器 的 cpu request limit 与 linux cgroups 的关系

Kubernetes 通过对 Cgroups 的精细控制来实现其requests和limits机制。requestslimits下面我们进行详细的分解和解释。

2025-12-14 10:14:29 570

原创 为什么容器镜像通常需要一个操作系统,只打包进去一个可执行文件可以吗

摘要: 容器镜像通常需要基础操作系统(如Ubuntu、Alpine)来提供依赖库、系统工具和标准文件布局,确保应用在隔离环境中正常运行。虽然理论上可以仅打包静态链接的可执行文件(如使用FROM scratch),但这会导致调试困难、构建复杂且缺乏运维工具。基础镜像在易用性、安全性和功能性之间取得平衡,而极简镜像(如Distroless或Scratch)更适合特定场景,需权衡体积与运维成本。推荐折中方案(如Alpine)以兼顾效率与实用性。

2025-12-13 17:17:25 1138

原创 linux用户配置.profile 和 .bashrc 的区别

Linux中profile和bashrc文件的主要区别在于Shell启动模式。profile系列文件(如/etc/profile、~/.bash_profile)在登录Shell时执行,用于设置环境变量和一次性命令;而bashrc文件(如~/.bashrc)在交互式非登录Shell时加载,用于定义别名、函数和Shell选项。最佳实践是将环境变量放在profile文件中,将交互式设置放在bashrc中,并通过在profile中加载bashrc来确保所有设置生效。

2025-12-13 16:48:32 1297

原创 kubectl exec 的底层原理

当你使用 kubectl exec 时,可以这样理解:你不是在启动一个“容器内的进程”,而是在启动一个“拥有容器视角的宿主机进程”。Kubernetes 和容器运行时通过 Linux 命名空间这面“镜子”,让这个外部进程看到了一个完全不同的、属于容器内部的世界。这种基于命名空间的“附身”能力,正是容器技术轻量、高效和可调试性的完美体现。它模糊了容器内外的边界,让我们能从一个更高的维度去观察和管理这些被隔离的环境。

2025-12-13 16:27:24 1004

原创 揭秘Kubernetes Pod网络:从veth pair到跨节点通信

本文深入解析了Kubernetes Pod网络通信原理。重点介绍了veth pair作为Pod网络基础组件的作用,它连接Pod与宿主机网络命名空间。同一节点Pod通过网桥实现高效二层通信,跨节点通信则采用Overlay隧道或BGP路由方案。文章详细阐述了两种场景下的数据流转过程,包括路由判断、ARP解析、网桥交换等关键步骤,为理解K8s网络模型和故障排查提供了理论基础。

2025-12-13 16:07:07 492

原创 Docker和容器OCI规范的关系

Docker是容器技术的先驱,推动了容器技术的普及。为避免生态碎片化,Docker牵头成立了OCI组织,制定容器格式和运行时的开放标准。OCI维护镜像规范(image-spec)和运行时规范(runtime-spec),确保不同容器实现的兼容性。如今的Docker完全遵循OCI标准,底层使用runc运行时,成为符合标准的上层产品。这种关系类似于Chrome浏览器遵循W3C标准,OCI标准保障了容器生态的互操作性和健康发展。

2025-12-08 16:49:04 528

原创 通过一个golang简单Demo,彻底搞清楚linux网络隧道通信

本文介绍了如何使用Go语言实现一个基于TUN设备的简易Linux网络隧道。该隧道由服务端和客户端两部分组成,通过TCP连接建立隧道,将TUN设备捕获的网络流量进行转发。实现步骤包括:创建TUN虚拟设备、配置IP地址、通过TCP连接传输数据包,以及双向数据转发功能。服务端监听TCP端口接收客户端流量,客户端则通过隧道将流量路由到服务端网络。该示例需要Linux环境和root权限,可作为点对点VPN的基础实现。文章提供了完整的服务端和客户端代码框架,并说明了运行测试方法。

2025-12-02 10:48:51 858

原创 docker 镜像和分层文件的关系

Docker镜像采用分层文件系统设计,由多个只读层堆叠而成,每个层对应Dockerfile指令。容器运行时会在镜像层之上添加可写层,所有修改通过写时复制机制实现。这种架构通过存储驱动(如overlay2)物理实现,具有三大优势:共享层节省空间、缓存层加速构建、增量传输优化网络。实践验证可通过docker命令查看分层结构,关键要注意大文件处理和跨层删除问题。性能测试显示分层系统可使容器启动速度提升10倍、存储空间节省85%。本质上,Docker镜像=只读层+元数据,容器=镜像层+可写层,实现高效存储、快速部署

2025-06-25 10:27:11 528

基于java jdbc 的数据库表结构生成工具 源代码

传统软件项目交付给客户的时候一般需要提供软件所有的设计文档,其中包括数据库设计文档。 数据库设计文档生成工具有很多,但很多时候格式不一定能满足自己项目方的要求,生成后需要自己微调,比较麻烦。 本文介绍一款基于java jdbc 的数据库表结构生成工具,代码简单, 生成文档的原始模板自己可以用word 灵活调整,自主可控。

2024-12-20

java 设计模式(简体中文版)

这是一本chm 格式的java设计模式的简体中文电子书,分类清楚,附有代码

2009-06-05

dwr 入门例子(eclipse 工程)

这个eclipse 中的一个dwr 无刷新图片显示的例子,属于入门及例子,可以方便的将此例子集成到自己的项目中。

2009-06-05

空空如也

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

TA关注的人

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