Java EE体系架构及规范组成.docx

上传人:b****0 文档编号:9056280 上传时间:2023-05-16 格式:DOCX 页数:14 大小:26.94KB
下载 相关 举报
Java EE体系架构及规范组成.docx_第1页
第1页 / 共14页
Java EE体系架构及规范组成.docx_第2页
第2页 / 共14页
Java EE体系架构及规范组成.docx_第3页
第3页 / 共14页
Java EE体系架构及规范组成.docx_第4页
第4页 / 共14页
Java EE体系架构及规范组成.docx_第5页
第5页 / 共14页
Java EE体系架构及规范组成.docx_第6页
第6页 / 共14页
Java EE体系架构及规范组成.docx_第7页
第7页 / 共14页
Java EE体系架构及规范组成.docx_第8页
第8页 / 共14页
Java EE体系架构及规范组成.docx_第9页
第9页 / 共14页
Java EE体系架构及规范组成.docx_第10页
第10页 / 共14页
Java EE体系架构及规范组成.docx_第11页
第11页 / 共14页
Java EE体系架构及规范组成.docx_第12页
第12页 / 共14页
Java EE体系架构及规范组成.docx_第13页
第13页 / 共14页
Java EE体系架构及规范组成.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Java EE体系架构及规范组成.docx

《Java EE体系架构及规范组成.docx》由会员分享,可在线阅读,更多相关《Java EE体系架构及规范组成.docx(14页珍藏版)》请在冰点文库上搜索。

Java EE体系架构及规范组成.docx

JavaEE体系架构及规范组成

JavaEE体系架构及规范组成

JavaEE体系架构及规范组成2011-03-0700:

29JavaEE框架是Sun公司(如今已是Oracle了)在1997年度JavaOne大会上发布的。

J2EE定义了开发和部署企业级Web应用的标准。

通过J2EE,Java语言与工具得以延伸到那些复杂的、多层的电子商务和企业级应用当中。

J2EE对于组件模型的开发提供广泛的支持,且对以模块化、可重用、平台独立组件的方式构建业务逻辑方面提供相应的工具与服务。

1.1J2EE简介

J2EE是针对Web服务、业务对象、数据访问和消息传送的一组规范。

这组应用编程接口(API)确定了Web应用与驻留它们的服务器之间的通信方式。

J2EE注重两件事:

一是建立标准,使Web应用的部署与服务器无关;二是使服务器能控制组件的生命周期和其它资源,以便能够处理扩展、并发、事务处理管理和安全性等问题。

J2EE平台为设计、开发、安装和部署企业应用提供基于组件的方法。

这种方法不但能降低成本,还能快速跟踪设计和实施。

J2EE平台能提供多层分布式应用模型,重复利用组件,提供统一安全模式,并灵活地控制事务处理。

借助J2EE,不但能更快地将客户解决方案推向市场,还能使基于J2EE组件、不依赖于平台的解决方案不被锁定到任何厂商的产品和API上。

J2EE规范定义了以下几种组件:

应用客户端组件

EnterpriseJavaBeans组件

JMS组件

Servlets、JSF和JavaServerPages(JSP)组件(也称为Web组件)

小应用程序(Applet)

1.2J2EE体系结构概览

J2EE作为Sun公司所颁布的标准,已经为工业界广泛接受,J2EE的出现标志着用Java开发企业级应用系统已变得非常简单。

如图2-1所示,J2EE是多层的分布式体系结构,使系统的操作和运行具有很好的灵活性。

先进的Java计算方案如面向对象、独立于平台、快速集成、代码重用等,是实现这种结构的关键,并使系统具有良好的可移植性和可扩展性。

多层分布式应用模型意味着应用逻辑将根据功能分成几个部分,用户可以在相同或不同的服务器上安装由不同应用组件组成的J2EE应用。

应用组件的安装位置取决于应用组件在多层J2EE环境中属于哪一层。

参照上图,这些层次定义如下:

1.2.1.1第一层:

客户端层

可以是在客户端层内运行的浏览器、基于Java的程序或者其它Web类型编程环境--在公司防火墙内部或外部。

1.2.1.2第二层:

应用服务器层

一般情况下,此层包含支持客户端请求的表示逻辑和业务逻辑。

表示层由显示HTML页面的JSP页面和servlets实现。

业务逻辑通过RMI对象和EJB实现。

EJB依靠容器(Container)实现事务处理、生命周期和状态管理、资源池、安全等问题,简而言之,容器就是EJB依赖执行的运行环境。

1.2.1.3第三层:

后端层

此层是现有应用和数据仓库的组合,也称为企业信息系统(EIS)层,因为它可以包含企业资源规划(ERP)、大型主机事务处理、数据库系统及其它遗留下来的信息系统等许多系统。

1.3J2EE的优势所在

J2EE中强调的基于服务器端应用设计、分层体系结构设计、分布式组件、统一的标准及平台独立等等,使得J2EE的优点在开发企业级应用系统的时候,具有非常明显的优势:

集成了适合商务应用的EJB的Java平台,由于其简洁的结构和跨平台的特性,可以很好地支持快速开发和即时发布

使用Servlet,JSP和EJB做为可重用构件的应用结构使得容易集成和具有最大的生产能力。

在开发、发布、管理和重用应用逻辑等方面具有很大的灵活性。

基于工业标准保证数据交换的一致性和安全的安全网络架构,可以在应用和平台上达到高效的集成。

因此这种开放式结构特别适合于开发电子商务系统,理由如下:

分布式环境-可以保证系统的稳定性,同时拥有较高的性能。

面向对象的模块化组件设计-可以提高开发速度,降低开发成本。

基于开放的标准:

Java,XML,RMI,TCP/IP,JMS等协议、消息传递标准和中间件做为集成的方法

三层/多层体系结构-最适合Internet环境,可以使系统有很强的可扩展性和可管理性。

以应用服务器为中心-低成本,安全和高性能

可扩展-允许透明地扩展以适应电子商务爆炸式的增长

最大限度地利用现有的技术投资,采用Java技术-完全跨平台,适应Internet需要,并能得到大多数厂商支持,进而保护用户投资。

1.4J2EE的规范组成

下表显示的是JavaEE6版本的规范系列:

1.5显示逻辑

在J2EE应用中,显示逻辑用来负责将客户端应答交给某一请求的服务器端代码。

例如,您的显示逻辑简单的可以是"当请求收到时报告现在时间"一类。

编码服务器端显示逻辑可以采用JavaServlets、JSP、JavaBean以及标记(Tag)库。

1.5.1JavaServletsJavaServlets为接受来自于Web浏览器端的HTTP请求并且返回HTTP应答的服务器端技术。

Servlets可以是多线程的,比起CGI在编码对于Web客户端的显示逻辑方面有着显而易见的性能优势。

因为Servlets是以Java来书写,因此可以满足平台之间无缝兼容。

Servlets是一项定义显示逻辑开发方面的企业级Java标准。

Servlets从客户端接受请求,动态生成响应(可以通过查询数据库满足请求),然后将包含HTML或XML文档的请求发送到客户端。

Servlets类似于CGI,但更易于编写,因为Servlets使用Java类和流。

它们的执行速度也更快,因为Servlets可编译为Java字节代码,在运行时,Servlet例程驻留在内存中――每个客户端请求都生出一条新线程。

Servlets易于以动态形式向HTTP响应流产生数据。

Servlets面临的问题是无状态协议,这就是说,每个请求都作为新连接执行,因而请求之间无法实现自然的流控制。

对话跟踪或对话管理能保持请求间特定客户端的状态。

不过,使用HTTP会话(Session)对象可以保持方法请求之间的状态。

大多数通常使用的servlet类型为HTTPservlet,用来设计成面向HTTP协议(Web)的请求。

HTTPServlets提供以下几个核心功能:

HttpRequest:

对象捕获请求的详情,请求是由Web页面形式的表格所提交的,其中包括数据的可用性、协议类型、安全级别等等。

HttpSession:

对象特定于每个用户,以操作服务器中的用户会话信息。

Servlet开发者在servlet运行过程中可以添加和删除此用户的信息。

HttpResponse:

对象捕获应答的详情。

Servlet开发者可以输出任何信息传送给发出请求的那个客户端。

Servlet引擎处理余下的那些部分。

1.5.2Java服务器页面(JSP)

JSP技术给开发人员一个简单的,HTML类似的接口来创建servlets。

JSP可以包含HTML代码、Java代码以及被称为JavaBean的编程模块。

JSP技术提供与servlets同样的功能,只不过开发接口更容易使用。

当JSP页面第一次被请求的时候,应用服务器将页面编译成servlet。

Servlet然后执行来服务进一步的请求。

用这种方法,servlet引擎和JSP引擎被紧密地捆绑在一起。

JSP页面的好处首先在于它们的简便性:

它们看起来很象典型的HTML页面。

实际上,您可以在一个标准的Web构建工具如MacromediaDreamweaver中编辑JSP页面。

其次,JSP页面提供Servlets的所有优点,如果与JavaBeans类结合在一起,可以容易地将内容和显示逻辑分开。

将内容和显示逻辑分开的优点是无需了解Java代码就能更新页面的外观,更新JavaBeans等级的人也无需深入了解Web页面的设计。

用户可以使用带JavaBeans的JSP页面定义Web模板,以便建立由外观相似的页面组成的Web站点。

应该说,JSP页面和Servlets都比通用网关接口(CGI)应用更为广泛,因为CGI依赖于平台,消耗资源更多,而且程序不能容易地访问参数数据。

1.5.3JavaBeans和标记(Tag)库

JavaBean(和EJB区分开)是Java组件(类),开发人员在J2EE应用中用它来封装来自于数据库中的数据,或者进行显示或者进行操作。

开发人员创建带有若干个方法的类文件,这些方法典型地用来获得或设置某些值。

JSP页面有一些特别的标记(Tags),其中包含JavaBeans并且自动用值来填充这些标记。

JSP页面调用那些JavaBeans中的方法来帮助创建它的HTML输出。

标记库提供JSP页面中使用的可定制HTML形式的标记(Tags)。

标记库抽象Java代码为标记,以便于由Web编辑和设计人员进行操纵。

为了建立一个标记库,开发人员创建类文件和一个称为标记库描述器的文件列出标记库中可用的那些标记。

JavaBeans与标记库管理那些通过JDBC访问的数据源和EJB进行互操作的数据与Java代码。

JavaBeans与标记库作为一项有价值的服务,使得Web应用开发人员可以将JSP页面和servlets中那些显式的Java代码单独拿出来。

这种模块化的方式可以将某一HTML编辑会话过程中对JSP页面偶然毁坏的机会最小化,并且可以允许显示逻辑可以独立于JSP页面进行修改。

1.6数据库和事务支持

数据库和事务支持由JDBC和JTA/JTS来"幕后"提供。

对数据库使用的高级别的接口由EJB来提供。

1.6.1Java数据库连接(JDBC)

JDBC数据库连接方面的Java标准。

JDBC规范由一系列标准的JavaAPI的集合来提供连接数据库所需要的所有事情。

厂商提供JDBC驱动器,映射标准JavaAPI集到底层数据库的那些特定的接口。

从编程的角度来讲,JDBC是连接J2EE应用服务器到数据库的一座桥梁。

此功能对编程人员来说是透明的:

它由EJB来提供。

开发人员除非在特别的情况下一般不直接用JDBC来编程。

典型的J2EE应用依赖于某一数据库来提供那些关键的电子商务应用功能比如事务支持、并发的数据访问支持以及数据完整性功能。

关系型数据库支持一种通用的访问语言称为SQL。

JDBC提供以下功能:

用来修改数据库的AP:

此类操作包括SQL更新和管理命令。

通过建立SQL查询语句从数据库中读取数据的API,此类查询返回ResultSetJava对象,返回JDBC数据库查询的结果。

这些对象使得J2EE开发人员可以编程访问(通过标准API)由某一给定的SQL查询返回的那些值。

支持基本的事务:

JDBC提供针对简单SQL语句的自动提交。

因此,一个简单的单个方法调用可以直接将一个SQL语句传递给数据库,并且修改自动提交到数据库中。

支持复杂的事务:

JEEE应用服务器提供一个称作JTA的服务,通过它来提供开始事务的能力且可以跨越J2EE服务和JEEE应用服务器之间进行传播。

JDBC驱动程序可以由数据库厂商或应用服务器厂商进行实现。

一般来讲,共有以下四种不同类型的JDBC驱动器:

第一种是JDBC-ODBC桥,与JDK一起配合。

它更象一种概念证明,还不能用于正式的生产环境。

借助它,可以将应用与任何ODBC源连接在一起。

.

第二种驱动程序借助本地库与关系数据库通信,例如在Oracle中是OCI库。

这意味着必须在客户端上提供本地库。

第三种驱动程序是多层的,即驱动程序位于客户端和RDBMS中间。

它建立与RDBMS的连接,是所有请求和响应的通道。

客户端只需加载纯Java就能与第三种驱动程序通信。

第四种驱动程序与第二种驱动程序相似,但它不使用本地库,而是借助专用协议直接与RDBMS通信。

1.6.2Java事务API(JTA)/Java事务服务(JTS)

J2EE事务处理模型可以在部署过程中定义组成一个事务处理的方法之间的关系,以便事务处理中的所有方法可以作为一个整体存在。

用户一定希望完成这一任务,因为事务处理是一系列步骤,要么全部执行成功,要么全部回滚。

例如,EJB中可能有一系列方法,其作用是将资金从一个帐户转移到另一个帐户,方法是借记第一个帐户和贷记第二个帐户。

用户可能希望将全部操作作为一个整体,这样,如果借记之后、贷记之前出现故障,借记将滚回。

事务处理属性在应用组件的集成过程中上确定。

它可以将各种方法组合成应用组件间的事务处理,即用户可以在J2EE应用中容易地重新分配应用组件的事务处理属性,无需修改代码和重新编译。

Java事务处理API(JTA)和Java事务处理服务(JTS)形成J2EE中事务处理支持的基础,而且更适合EJB和JDBC。

JTS是低级事务处理管理API,主要作用是将Java映射到对象管理组(OMG)的对象事务处理服务。

JTA给于Web应用开发人员访问数据库系统或任何遗留数据存贮中的事务功能。

事务协调单个数据库和多数据库操作来确保所有的数据资源保持精确型和一致性,并且那些对数据库的操作是可以重复和持久的。

事务管理对于那些面向Web和容错性的企业级电子商务应用来说是最基本的。

JTA定义了一个对于分布式应用的资源管理器的高级别事务管理规范,包括两个部分:

事务处理接口:

允许事务处理定界。

完成工作的方式是分布式组件由全局事务处理登记。

这种方法可以使多组操作组成一个事务处理。

XA资源接口:

基于能处理分布式事务处理的X/Open/XA接口,有时也称为两阶段提交事务处理,需要多种资源之间的协调,如数据库或序列。

应用服务器应能支持多种事务处理,包括EJB、JMS和JDBC操作。

分布式事务处理由两阶段提交协议协调,可跨越用XA兼容的JDBC驱动程序访问的多个数据库。

EJB规范定义了Bean管理的事务处理和容器(Container)管理的事务处理两种事务处理方式。

当EJB用容器(Container)管理的事务处理部署时,J2EE应用服务器将自动协调事务处理。

如果EJB由Bean管理的事务处理部署,EJB参数必须提供事务处理代码。

基于JMS或JDBCAPI的应用代码可以启动事务处理,或参与先前启动的事务处理。

一个事务处理联系与执行应用的J2EE应用服务器的线程相关,所有事务处理操作都在参与当前事务处理的线程上执行。

多数情况下,用户无需担心用JTA编写明确事务处理的问题,因为此项工作由JDBC完成,EJBAPI由容器(Container)处理,并由应用部署说明符来配置。

这样,用户就可以将精力集中在事务处理设计而非实施上面。

1.6.3对象注册和远程方法调用(RMI)

JNDI和RMI支持命名服务与远程方法执行。

1.6.4Java命名和目录接口(JNDI)

由于J2EE应用的组件可以独立运行,而且通常是在不同设备上运行,因此客户端和应用服务器层代码必须以某种方式查找和参考其它代码和资源。

JNDI就是一项用来中心注册命名和目录服务的Java标准。

JNDI管理创建分布式应用中所需要的那些核心组件的引用,当一个开发人员创建一个访问远程对象的应用时,JNDI提供给应用一种途径来定位对象。

JNDI技术是命名和目录服务的接口,用来对那些命名的应用与数据对象进行中心注册。

JNDI服务帮助确保应用组件名字的唯一性,并且帮助预防、诊断和处理可能引起的命名冲突。

JNDI的使用模板相对简单。

应用开发人员在应用服务器(如WebLogic)部署环境中通过初始化的lookup来查找到所需要的对象。

应用服务器中的JNDI服务将返回应用所需要的访问该对象的所有内容。

1.6.5远程方法调用(RMI)

RMI是Java应用用来调用远程对象的方法一项Java标准。

RMI使得远程对象虚拟成就好象它们对应用来说在本地一样。

RMI为您的分布式应用提供与远程客户端通过远程方法和服务进行操作的框架。

允许RMI调用的远程主机公布远程对象的那些方法。

对象可以定位在跨越网络或可能跨越您的J2EE应用服务器(如WebLogic)群集中的另一应用服务器的实现之上。

1.7企业级Java组件(EJB)

EJB是以Java来创建服务器端业务逻辑的企业级Java标准。

与显示逻辑自动处理将要显示给客户端的类型和格式信息相对应,业务逻辑用来操作诸如基金转帐、产品定单等等。

开发人员可以充分利用J2EE应用服务器作为EJB容器所提供的服务来创建EJB。

EJB组件用于封装业务逻辑,使得开发人员无需再担心数据访问、事务处理支持、安全性、高速缓存和并发等琐碎任务的编程。

在EJB规范中,它们由EJB容器(Container)来负责。

EJB容器提供给开发人员创建如基金转帐、雇员记录管理或其它功能等的业务逻辑所需要的任何事情。

EJB包含接口和类。

客户端通过EJB的本地接口和远程接口访问EJB方法。

本地接口提供的方法可用于生成、删除和查找EJB,远程接口则提供业务方法。

部署时,容器(Container)从这些接口生成类,这些类使客户端可以访问、生成、删除、查找EJB和调用EJB上业务方法。

EJB类为业务方法、生成方法和查找方法提供实施,如果Bean管理自己的存储,还得提供生命周期方法的实施。

有以下四种基本类型的EJB:

实体

消息驱动

有状态会话

无状态会话

1.7.1实体EJB(EntityEJB)

实体EJB(entitybeans)为代表数据的企业级Java标准。

它们是驻留在EJB容器中的标准Java语言对象。

大多数情况下,实体beans代表从数据库中来的数据,尽管它们也可以代表存贮在其它位置的数据。

在J2EE应用服务器部署环境中,beans代表存贮在某一关系型数据库中的数据,比如Oracle、IBM的DB2、Informix等等。

象实体beans之类的对象需要映射到某一关系型数据库管理系统(DBMS)的关系结构。

在针对员工信息表的关系数据库中,表中的每一行就是一个Bean的实例。

实体EJB是事务处理型和持久的。

只要数据存在于数据库中,实体EJB就存在。

这种模式可容易地用于关系数据库,而且不限于对象数据库。

用容器(Container)管理的持久性访问关系数据库的EJB不需要为数据库访问使用任何JDBCAPI,因为容器(Container)可以负责完成这项任务。

但是,如果使用Bean管理的持久性或想访问关系数据库以外的企业信息系统,就需要提供相应的代码才能完成。

如果EJB使用由Bean管理的持久性访问数据库,用户必须借助JDBCAPI实施Bean生命周期方法,这样才能加载和保存数据,并保持运行和持久数据库存储之间的一致性。

Web层使用HTTP或HTTPS在各层之间传输数据,EJB层则使用RMI-IIOP。

RMI-IIOP是一种完全可扩展的分布式计算协议,使访问EJB的任何客户端或Web层程序能直接访问EJB层中的服务。

这些服务包括用于查阅和参考EJB的JNDI、用于发送和接收异步消息的Java消息服务(JMS),以及用于关系数据库访问的JDBC。

EJB规范定义了针对开发人员创建、部署和管理跨平台、基于组件的企业级应用的一个API。

EJB组件模型支持以下三种类型的组件:

会话beans,用来捕获会话持续过程中的业务规则和方法;

实体beans,封装来自于某一数据库的特定数据项;

消息驱动beans,集成EJB和Java消息服务(JMS)

J2EE应用服务器自动地处理某些活动诸如管理事务、并发问题、安全及其它功能,因为EJB容器提供了这些服务。

在进行EJB编程的时候,开发人员无需担心这些低级别的问题:

容器来负责这些事情。

1.7.2会话EJB(SessionEJB)

会话beans代表与客户端的短暂对话,可以执行数据库读写。

会话beans可以请求JDBC调用本身,也可以使用实体beans执行调用,这时会话beans是实体beans的客户端。

会话beans的字段包含对话的状态,是短暂的。

如果服务器或客户端出现故障,会话beans将消失。

这种模式一般用于PL/SQL等数据库编程语言。

企业级Java标准定义了两种类型的会话beans:

有状态和无状态。

无状态beans接受由RMI方式送过来的请求但是内部并不保存它所服务客户端相关的任何数据。

它们一般提供不保留任何状态的服务器方行为。

无状态会话beans需要的系统资源较少。

提供通用服务或表示共享数据视图的业务对象适合作为无状态会话beans。

有状态beans,另一方面,保存它所服务的特定于客户端的数据。

对话状态是无状态beans实例的字段值加上可以从无状态beans字段阅读的所有对象。

有状态的无状态beans不表示持久数据库中的数据,但能够以客户端的名义访问和更新数据。

从开发人员的角度来看,这两种类型的会话beans在创建时相类似。

不过,EJB容器对待它们的处理方式却是截然不同的。

会话beans处理由RMI方式递送来的请求。

典型地,它们为其它的Java对象提供服务。

这一点与servlets和JSP相对应,因为它们主要聚焦在应答那些由如Web浏览器等Web客户端发出的请求(这些请求是以HTTP方式到达的)。

发出请求到会话beans的对象可以是任一对象,只要它能够访问合适的RMI客户端的类。

在J2EE应用服务器部署的环境中,这些Java对象典型地是那些应用客户端。

然而,servlets与JSP也有可能成为会话beans的RMI客户端。

使用会话beans为您的应用客户端、servlets或JSP来实现服务器端的业务逻辑

1.7.3消息驱动Bean(MessageDrivenBean)

通过版本2.0的EJB规范,在企业级Java应用中增加了一个完全新的类型的EJB及使用一种完全新的执行机制的选择。

在实体beans和会话之间,使用一种异步的编程模型。

客户建立到EJB的请求然后从它的需要出发等待工作的完成。

使用消息驱动beans(MDB),EJB并不附着到某一客户端,而是附着到JMS中定义的某个消息队列(messagequeue)或话题(topic)。

当某个消息到达时,EJB的某个方法即被执行。

MDB对于企业级Java应用引入了一种异步处理机制。

任务可以进行排队然后在资源可用时进行处理。

当您的应用需要对任务的异步处理如发送email应答或列表当月彩票的赢家时,使用消息驱动beans就是当然的选择。

1.8Java消息服务(JMS)

JMS规范为开发人员针对企业级Java消息服务如可靠队列、发布和订阅通讯及各种目的的推/拉(push/pull)技术等提供一系列的标准JavaAPI。

JMS是针对消息方面企业级Java标准。

它使得Java类应用和组件发送和接收消息。

换言之,JMS是支持Java程序间消息交换的J2EE机制。

这也是Java支持异步通信的方法――发送者和接收者无需相互了解,因而可以独立操作。

JMS中的消息有几种机制,其中包括:

队列模型

队列模型使得JMS客户端可以将消息放到JMS队列中。

客户端然后取出这些消息。

具体的过程是:

消息产生者将消息发送到队列中。

消息消费者可以将自身与队列连接,以倾听消息。

当消息到达队列时,客户可以从队列中取走,并给出响应。

消息只能发送到一个队列,只能由一位消费者使用。

消费者可以过滤消息,以便获得希望获得的消息。

基于主题(topic)的,发布-订阅系统

基于话题的模型使得发布者发送消息给某一JMS话题(topic)的注册过的那些订阅者。

这种情况下,许多消费者都能接收到同样的消息。

1.9Java接口定义语言(IDL)

CORBA对象使用IDL确定接口(怎样与其它对象交互)。

借助JavaIDL,可以定义Java应用和CORBA应用之间的合同。

为使用JavaIDL,应使用可以产生便携客户端存根(Stub)和服务器骨架(Skeleton)的idltojava编译器,此编译器可以与任何CORBA兼容型对象请求

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2