自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(135)
  • 资源 (1)
  • 收藏
  • 关注

原创 十分钟学懂Java并发

事实上,虽然看似是两种方式实现线程,实际上却是一种。因为Thread类的run函数的默认源码实现就是调用了一个包含在Thread对象内部的Runable实现对象。= null) {我们可以为我们的自定义Runable实现类提供一个取消标记成员,然后在run方法的执行过程中不断去检查这个标记来判断是否需要提前终止任务。// 执行任务的代码// 检查是否取消任务。

2024-04-14 16:03:22 1054

原创 Spring之IoC源码分析及设计思想(一)——BeanFactory

Spring的IOC实际上是由两个部分组成的,以Regisrty结尾的接口赋予了类缓存Bean以及其他需要用到的对象的缓存能力,也就是容器的能力。而本文谈到的BeanFactory及其以BeanFactory结尾的子接口则赋予了实现类访问容器的能力,使得我们可以通过这些接口完成Bean的构建和获取等操作。因此对于IOC的认识需要分为BeanFactory和Registry两个脉络去了解,两条脉络最终在DefaultListableBeanFactory这个类上完成交汇,从而提供真正的IOC功能。

2023-07-29 13:05:00 195

原创 Redis实现分页和多条件模糊查询方案

本文将基于Redis提供条件查询+分页的技术解决方案。

2023-02-25 14:33:28 6645 9

转载 算法复杂度分析中的符号(Θ、Ο、ο、Ω、ω)简介

算法复杂度分析中的符号(Θ、Ο、ο、Ω、ω)简介

2022-08-14 16:09:36 4027

原创 JVM参数、JDK常用监控指令和监控工具使用教程,非常实用!

本文主要讲述JVM参数的介绍以及虚拟机内存的监控与管理,方便读者针对自己的项目进行分析,进一步实现项目的优化

2022-06-08 15:18:08 1316

原创 Java虚拟机的垃圾回收器以及内存分配策略详解

概述垃圾回收器(GC)是什么以及为什么我们需要垃圾回收器??垃圾回收是Java语言区别于其他语言的一种最为重要的特性之一, 通过垃圾回收器(Garbage Collection)来实现对我们Java虚拟机中内存的自动回收,即将一些我们不再需要的对象所在的内存进行回收。正是这种特性,使得我们的Java程序员在进行开发工作时不再像C/C++程序员一样需要关心对象的释放和内存的回收。这为我们的开发带来了极大的便利。虽然在这种便利下,势必需要付出一些额外的性能消耗。但是这种消耗在多数情况下所带来的收益也是远超

2022-05-25 17:14:14 438

原创 关于引用计数法的循环引用问题

关于引用计数法,我们可以先看一段wiki上的描述:As a collection algorithm, reference counting tracks, for each object, a count of the number of references to it held by other objects. If an object’s reference count reaches zero, the object has become inaccessible, and can be d

2022-05-24 18:36:04 196

原创 Java的单分派与双分派以及访问者模式的关系

引言在学习访问者模式的过程中了解到了单双分派这一词,本文将重点为大家解释Java中的单分派与双分派到底是什么,以及为什么会与访问者模式扯上关系首先,我们给出一个定义:“Java是一种支持双分派的单分派语言”。那么我们必须知道什么是分派,我所理解的分派对要执行的方法的确定,用通俗的话来说就是我需要知道我执行的是哪个对象的哪个方法。那么为什么会出现单分派以及多分派?我们不是可以通过方法名来确定我们要调什么方法吗?是的,若要调用一个方法,方法名是最关键的一个标识,这是基础,总不能我们不用知道我们要调

2022-01-10 00:02:31 694 5

原创 代理模式及Java两种动态代理JDK动态代理和CGLIB动态代理

代理模式什么是代理模式代理模式是设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式。他在对象B的基础上提供了一层访问控制,当你需要访问对象B时,你需要经过对象B的代理对象A来实现访问。因此代理模式也被称为委托模式,他能够提供非常好的访问控制。对象A并不提供真正的执行逻辑,而是通过组合B去调用B的目标方法来实现目标逻辑。而A的作用则是在调用B方法的前后提供一些准备和善后的工作。即A虽然是“伪军”,但它可以增强B,在调用B的方法前后都做些其他的事情。Spring AOP就是使

2022-01-05 11:24:45 1528

原创 B树和B+树详解

B树、B+树看这一篇就够了@[TOC](B树、B+树看这一篇就够了)引言B树什么是B树以及B树是怎么来的B树的基本性质B树的新增和删除B树的插入B树的删除B+树什么是B+树以及为什么要有B+树B+树的基本性质B+树的查找B树与B+树的比较B+树的优势B树的优势两者的细节对比B树与B+树在实际代码中的应用总结引言在实际的编程学习中我们经常可以在各种框架、算法中看见B树、B+树的身影。特别是在数据库的数据库引擎中,它们更是占据着重要的地位。 下面我将通过B树、B+树的由来、作用、操作以及它们在实际中的应用

2021-12-10 16:45:40 11343 5

原创 TCP/IP协议之常见的应用层协议——DNS域名系统

DNS域名系统概述域名系统DNS(Domain Name System)是互联网使用的命名系统,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的系统,搭载域名系统的机器称之为域名服务器,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP地址数串。那为什么不叫名字而是叫域名呢?因为在这种命名系统中使用了许多的“域”(域名(英语:Domain Name),简称域名、网域,是

2021-02-28 15:50:04 2523

原创 TCP/IP网络协议之传输层TCP

概述运输层的功能运输层向上面的应用层提供通信服务,确保网络中两个不同应用进程之间的可靠通信连接运输层与网络层的区别网络层为主机之间提供逻辑通信,它只负责将某台主机发送的分组运送到其目的IP对应的主机上。在网络层,通信的两端的主体对象是主机。运输层为进程之间提供逻辑通信,它需要在数据到达主机后,根据其报文段上的目的端口号将数据交付到具体的进程中。在运输层,通信的两端主体对象是不同的进程。运输层提供的功能运输层提供的主要功能如下:为进程之间提供逻辑通信对收到的报文进行差错检测运输

2021-02-22 18:10:31 2124 1

原创 JVM虚拟机之栈帧与以及方法调用

简介执行引擎是Java虚拟机最核心的组成部分之一。虚拟机与物理机都具有执行代码的能力。区别在去物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统层面上的,而虚拟机的执行引擎则是自己实现的,可以自行定制指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式。本章主要从虚拟机执行引擎的概念模型上来学习和讲解虚拟机的方法调用和字节码执行栈帧栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,他是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态

2020-12-28 13:44:00 373

原创 JVM虚拟机之类加载机制

概述我们的java类都会在编译器编译之后变成一个class文件,我们需要通过虚拟机加载这个class文件才能够使用我们编写的类。本章主要讲述的内容分为以下几点:虚拟机什么时候会加载这些Class文件虚拟机如何加载这些Class文件Class文件中的内容进入到虚拟机后会发生什么变化虚拟机将描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化。最终形成可以被虚拟机直接使用的Java类型。这就是虚拟机的类加载机制。本文参考 《深入理解Java虚拟机》 一书中关于类加载机制的内

2020-12-25 14:49:15 165 1

原创 Java虚拟机JVM之类文件结构解析(常量池)

简介在java的学习过程中,关于Class的文件结构一直困扰着我。比如像常量池,它是类文件中最为重要的一部分之一,但是网络上关于常量池的说话五花八门,因此我决定参考《深入理解Java虚拟机》一书去对Class文件以及常量池等重要知识进行学习和梳理。Class类文件的结构Class文件是一组以8位字节为基础单位的二进制流,文件中各个部分严格按照规则顺序紧凑地排列在Class文件之中,中间不存在任何间隔符号。如果遇上8位以上的数据时,会分割成若干8位字节进行存储。下面是一个简单个class文件的十六进

2020-12-17 17:09:38 300

原创 TCP/IP协议之IP协议

简介IP相当于OSI参考模型中的第三层——网络层网络层的主要作用是实现终端节点之间的通信。从前面的章节可知,数据链路层的主要作用是在互连的节点之间进行包传递,而一旦跨越多种数据链路,就需要借助于网络层。网络层可以跨越不同的数据链路,即使是在不同的数据链路上也能实现两端节点之间的数据包传输。IP基础知识IP地址属于网络层的地址,为了识别通信对端,我们需要有一种类似于地址的识别码进行识别,我们前面提到过,MAC地址就是这种用于在同一个链路中标识不同计算机的一种识别码。但这只能为我们提供一种识别方式而

2020-12-03 17:28:50 621

原创 TCP/IP协议之MAC地址

简介MAC地址用于识别数据链路中互连的节点,也就是同个网段中使用网线直接连接的机台计算机节点。MAC地址相当于计算机的身份证ID,是由厂商在出场时直接焊入网卡中的。MAC地址在网络中的作用我们前面提到mac地址用于师表数据链路中互联的节点那么它究竟是如何识别的,既然mac地址是唯一的,那为什么不通过mac地址去寻址,而是同个ip地址呢。首先我们知道MAC地址是固定的,但是我们的电脑所在位置却不是固定的,假设我们需要向某台计算机发送一封邮件,那么我们如何通过一段固定的mac地址去将邮件发送到目标

2020-12-01 15:01:19 3149

原创 TCP/IP学习之网络基础知识

简介为了学习TCP/IP相关的知识,我们必须对网络有一个基础的了解。本文只介绍关于OSI参考模型和网络基本构成的内容。OSI参考模型OSI(Open System Interconnect),即开放式系统互连。 一般都叫OSI参考模型,是ISO组织在1985年研究的网络互连模型。该体系结构标准定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层和应用层),即OSI开放系统互连参考模型。OSI参考模型分工明确、责任清晰但却是一种理想型的网络结构模型,由于分层过于细致,所

2020-12-01 14:00:57 243

原创 Java学习之多线程并发

简介到此为止,我们学到的基本上都是有关顺序编程的知识,即程序中所有事物在任意时刻都只能执行一个步骤。编程问题中相当大的一部分都可以通过使用顺序编程来解决。然而,对于某些问题,如果能够并发地执行程序中的多个部分,则会变得非常方便。并发编程可以使得程序的处理速度得到极大的提高。但是在得到提高的同时,并发也会带来一些问题,当并行执行的任务彼此开始互相干涉时,时机的并发问题就会接踵而至。了解并发可以使我们意识到明显正确的程序可能会展现出不正确的行为。并发的多面性更快的执行现在的计算机基本上都是

2020-11-24 14:18:03 403 3

原创 ORACLE数据库根据字段类型去遍历所有表

我们可以通过user_tab_column这张表来获取数据库中所有列对应的信息包括列对应的精度、类型以及表名select utc.TABLE_NAME,utc.COLUMN_NAME,utc.DATA_TYPE,utc.DATA_LENGTH,utc.DATA_PRECISION,utc.DATA_DEFAULT,utc.NULLABLE from user_tab_columns utc WHERE utc.DATA_TYPE = 'NUMBER' ...

2020-11-23 13:58:26 587

原创 Java学习之注解元数据

简介注解也被称为元数据,它为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。注解一定程度上是把元数据和源代码文件结合在一起,而不是保存在外部文档中这一大的趋势之下所催生的。在Java中,有一些内置的注解,比如:@Override:表示当前的方法顶柜将覆盖超类中的方法,如果拼写错误或者覆盖不符合标准,编译器就会发出错误提示。@Deprecated:表示被修饰的元素已经被弃用,不建议程序员使用。@SuppressWarnings:关闭不当的编译器警告

2020-11-18 10:44:10 471

原创 Java学习之枚举类型

简介关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用。这是一种非常有用的功能。基本enum特性通过values()方法可以遍历enum实例,而且该数组中的元素严格保持在enum中声明时的顺序。创建enum时,编译器会生成一个相关的类,这个类继承自java.lang.Enum,下面例子中演示了Enum提供的一些功能:public class EnumDemo1 { public static void main(String[]

2020-11-17 15:14:47 152

原创 Java学习之容器深入研究

简介我们以往经常使用数组来存储对象,数组虽然具有很高的效率,但是同样的,数组也具有一个致命的缺陷,那就是无法动态扩容。一个数组在其生命周期中,它的大小是不会发生变化的。同时,为了实现多种堆栈队列等高效的数据结构,我们需要借助于容器。集合容器的用途是保存对象,但是被分为两个不同的概念:Collection:一个独立元素的序列,这些元素都服从一条或多条规则List:按插入顺序保存元素Set:不能用重复元素Queue:先进先出的排队规则Map:一组成对的键值对注意,这里并没有提到像Vec

2020-11-15 15:56:03 210

原创 Java学习之数组

简介Java中有大量其他方式可以持有对象,但是在很多时候我们还是会去使用数组。数组和其他种类的容器之间的区别有三个方面:效率类型保存对象在Java中,数组是一种效率最高的存储和随机访问对象引用序列的方式。数组就是一个简单的线性序列,这使得元素访问非常快速。但是代价是数组对象的大小被固定,并在其生命周期内是不可改变的。数组的使用无论哪种类型的数组,数组标识符其实只是一个引用,指向在堆中创建的一个真实对象,这个对象保存指向其他对象的引用。可以作为数组初始化语法的一部分隐式地创建此对象,或用n

2020-11-12 16:07:54 56

原创 Java学习之反射(RTTI)

简介运行时类型信息使得我们可以在程序运行时发现和使用类型它使得我们从只能在编译期执行面向类型的操作和禁锢中解脱出来有人会对标题上的RTTI感觉到陌生,RTTI的全名时Run-Time Type Identification,表示运行时类型识别。但是学过C++或者看过Thinking in Java的同学们都应该对此有些熟悉,我在看Thinking in Java这本书时,其实抱有很大的疑惑,因为我没有办法很清晰地清淅的区分出RTTI和反射的概念,在区分两者上,总是会存在一些疑惑。但是后来查阅各方资

2020-11-11 23:29:48 302

原创 Java学习之字符串和正则表达式

简介可以证明,字符串操作是计算机程序设计中最常见的行为不可变StringString对象是不可变的,通过JDK文档可以发现,每一个看似会修改String值的操作,实际上都是创建了一个新的String对象,以包含修改后的字符串内容,而最初的String对象则丝毫未动。重载"+" 与StringBuilderString对象是不可变的额,你可以给String对象加任意多的别名。因为String具有只读特性,所以指向它的任何引用都不可能改变它的值,因此,也就不会对其他的引用有什么影响。不可变性会

2020-11-11 10:25:05 1661 1

原创 Java学习——通过异常处理错误

简介Java的基本理念是“结构不佳的代码不能运行”发现错误的理想时机是在编译阶段,也就是在我们试图运行程序前。但是编译期并不能找出所有的错误,有些问题需要在运行期得到解决。这就需要错误源能够通过某种方式把适当的信息传递给某个知道如何处理这个问题的接收者。基本异常异常情形是指阻止当前方法或作用域继续执行的问题,当我们在运行程序中,遇到了一个意料之外的错误时,我们就需要抛出异常,而不是顺着原来的路执行下去。当抛出异常后,有几件事会随之发生。首先,与Java中其他对象的创建一样,将使用new在

2020-11-09 20:58:51 341

原创 Java学习之接口

简介接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方式抽象类和抽象方法在学习到抽象类之前,我们实现多态的方式就是通过实现一个基类,然后在不同的导出类中重写基类的方法以及进行一些个性的拓展来实现多态。在这种关系中,基类的目的是为它的所有导出类创建一个通用接口。但是,纯粹作为接口而言,普通的类显得有些多余。因为它会要求基类同样实现接口方法。但实际上对于这些方法的实现有时候并不是必须的。因此我们引入了抽象类和抽象方法的概念这种方法是不完整的,仅有声明而没有方法体。下面是抽象方法声明采用的语

2020-11-07 13:34:13 142

原创 JAVA学习之多态

简介向上转型转机构造器和多态协变返回类型

2020-11-06 17:06:09 146

原创 Java学习之复用类

简介复用代码是Java众多引人注目的功能之一,通过复用代码,我们可以极大地降低我们的工作量,以及提升我们代码的简洁程度。这种方法的窍门在于使用类而非破坏现有程序。复用代码的方式有两者:第一种叫做组合,该方法比较直观,只是单纯调用了现有的程序代码。第二种则细致一些,也是我们经常使用到的,叫做继承。该方法按照现有类的类型创建新类。无需改变现有类的形式,采用现有类的形式并在其中添加新代码。组合语法组合只需要将对象引用置于新类中即可。也就是说,如果我们创建的类中需要使用到某个其他的类型,我们可以在我们的新

2020-11-02 17:15:41 129

原创 Java学习之什么是泛型的擦除

序上一章讲了泛型的基本使用方式,但是在上一章中提到了擦除这一概念。我们都知道Java一开始并没有泛型这一语言特性,泛型这一特性是在JavaSE5出现的,也就是说,在该版本以前,所有的库都是以原有的语言特性进行设计,如果我们在java代码中使用了新的语言特性,那么编译出来的代码是不被低版本的jre进行兼容的。换句话说,如果泛型以新语言特性的形式出现,那么所有需要使用到泛型的类库都需要在新版本的编译器上进行重新编译,而原来的老的类型会因为低版本jre不兼容这些新的语言特性而无法使用这些类库,那么我们这时候必

2020-10-26 17:07:50 606

原创 Java学习——泛型的介绍和基本使用

介绍一般的类和方法,只能使用具体的类型,要么是基本类型,要么是自定义类型。如果要编写可以应用于多种类型的代码,就需要借助于多态和泛型实现。多态勉强算是一种泛化机制,比如你可以将方法的参数类型设置为基类或者接口,那么该方法就可以接受从这个类中导出的任何类作为参数。这种方式使我们相当常见也是相当方便的。但是这种方式必须要求你的代码必须实现特定的接口,这样对程序的约束性太大了。那么我们如何实现一个更通用的代码使得代码能够应用于某种不具体的类型。因此再JavaSE5中引入了泛型的概念。事实上,于C++相

2020-10-23 13:31:16 179

原创 设计模式——桥梁模式

定义将抽象和实现解耦,是两者可以独立变化抽象定义了要做什么,而实现定义了如何去做。如果是继承结构,抽象发生变化时需修改抽象方法,违背了开闭原则。而桥接模式由于分离了抽象和实现,使得抽象方法可以通过拓展抽象来实现拓展结构和实现抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。实现化(Implementor)角色:定义实现

2020-10-15 13:51:44 143

原创 设计模式——享元模式

定义使用共享对象可有效地支持大量细粒度的对象在享元模式中可以共享的相同内容称为 内部状态(Intrinsic State),而那些需要外部环境来设置的不能共享的内容称为 外部状态(Extrinsic State),其中外部状态和内部状态是相互独立的,外部状态的变化不会引起内部状态的变化。由于区分了内部状态和外部状态,因此可以通过设置不同的外部状态使得相同的对象可以具有一些不同的特征,而相同的内部状态是可以共享的。也就是说,享元模式的本质是分离与共享 : 分离变与不变,并且共享不变。把一个对象的状态分

2020-10-15 10:34:08 166

原创 设计模式——解释器模式

定义给定一门语言,定义它文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子解释器这个名词想必大家都不会陌生,比如编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。诸如此类的例子也有很多,比如编译器、正则表达式等等。如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子,这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。就比如正则表达式,它

2020-10-15 10:03:14 142

原创 设计模式——状态模式

定义状态中封装了该状态所能做的行为,不同的状态对应不同的行为。通过改变状态来实现行为的变化。将状态与行为耦合,分离了行为与执行者间的关系也就是说,状态模式将行为的实现与状态对象进行绑定,执行者通过执行状态下对应的方法来实现对应状态下的行为结构和实现结构上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的

2020-10-15 09:26:28 93

原创 设计模式——访问者模式

定义封装一些作用于某种数据结构中的各个元素的操作,它可以在不改变数据结构的前提下定义作用于这些新元素的新的操作简单来说,我们让目标对象接纳一个访问者,通过这个访问者将自身实例放入访问者中,因此,在外部的访问者就可以独立获取到目标对象内部的数据接口,这种模式分离了数据的结构和操作。适合数据结构稳定但数据表现容易出现变化的场景比如我们现在有一组对象,被放置在某个数据结构中,但现在不同的人无需要的数据重点不同,但是,不管重点在哪,他们需要的东西都在这组数据中。但是我们不可能将数据的全貌全部表现给使用者看

2020-10-14 19:25:46 182

原创 设计模式——备忘录模式

定义在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态换句话说,当我们正常需要将一个对象恢复到前者的状态时,我们必须要直到该对象内部封装的细节。但是这样很明显会使得两个对象之间的耦合过高,是不可取的,因此我们需要一个备忘录来对数据的状态进行记录,从而降低对象之间的耦合关系结构和实现结构发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的

2020-10-14 18:39:27 91

原创 设计模式——观察者模式

定义观察者模式也叫发布订阅模式,该模式定义对象间一种一对多的依赖关系,使得没当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新观察者一般可以看做是第三者,比如在学校上自习的时候,大家肯定都有过交头接耳、各种玩耍的经历,这时总会有一个“放风”的小伙伴,当老师即将出现时及时“通知”大家老师来了。再比如,拍卖会的时候,大家相互叫价,拍卖师会观察最高标价,然后通知给其它竞价者竞价,这就是一个观察者模式。结构和实现结构Subject被观察者:定义被观察者必须实现的职责,它必须能够动态

2020-10-14 18:13:58 84

原创 设计模式——面门模式

定义要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用对一些固定顺序的方法进行整合,由某个函数获取必要的参数来完成执行。避免了方法的顺序错误调用,我们可以直接认为这是对多个函数的封装,由一个公开的接口来收集被封装函数所需的必要参数。可以参考下图结构和实现结构​​角色定义:Facade门面角色客户端可以调用这个角色的方法。此角色知晓子系统的所有功能和责任。一般情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去,

2020-10-14 17:28:40 208

struts2包.rar

struts2的jar文件能满足基本开发的需求,没有遗漏,找了我很久

2019-09-08

空空如也

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

TA关注的人

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