科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道J2EE平台介绍

J2EE平台介绍

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

今天,越来越多的程序设计人员希望借助服务器端技术的快捷、安全以及可靠性,为他们的企业开发分布式的交易应用系统。

作者:JavaFeng 来源:CSDN 2008年3月16日

关键字: 平台 J2EE java

  • 评论
  • 分享微博
  • 分享邮件
今天,越来越多的程序设计人员希望借助服务器端技术的快捷、安全以及可靠性,为他们的企业开发分布式的交易应用系统。如果你已经工作在这一领域,你将非常清楚,在今天这样一个电子商务和信息技术飞速发展、并充满需求的世界上,企业应用必须以更少的资金、更快的速度和比以往更少的资源来设计、建造和运营。

为降低成本、快速实现企业应用的设计和开发,J2EE平台技术为企业应用的设计、开发、集成以及部署提供了一条基于组件的实现途径。J2EE平台为您提供了一个多层次分布是应用设计模式,重用组件的能力,统一的安全模式,灵活的交易控制。你不仅可以把全新的客户解决方案,用比以往都快的速度推向市场,而且平台独立、基于J2EE组件的解决方案将使你的产品不绑定在任何一个厂商的产品和API上。

本文介绍J2EE 1.3平台并同时作为J2EE教程的概述章节。J2EE教程采用基于范例的方式,描述J2EE SDK 1.3版的特点和功能。无论你是新手还是有经验的企业应用开发人员,你都将发现J2EE教程中结合了文字的范例,是你创建自己企业的解决方案时,有价值的、唾手可得知识库。

如果你是刚刚开始接触J2EE应用开发,这个介绍是一个很好的起点。在这里你将学习J2EE架构,开始熟悉重要的术语和概念,找到如何开始进行J2EE应用程序编程,集成和部署。

分布式的多层次应用

J2EE平台采用一个多层次分布式的应用模式。这意味着应用逻辑根据功能被划分成组件,组成J2EE应用的不同应用组件安装在不同的服务器上,这种划分是根据应用组件属于多层次J2EE环境中的哪一个层次来决定的。图1展示了两个多层次J2EE应用划分成在下面的表中描述的不同层次。图1中表示的J2EE应用部分代表了J2EE应用组件。

运行在客户机器上的客户层组件

运行在J2EE服务器上的Web层组件

运行在J2EE服务器上的业务层组件

运行在EIS服务器上的企业信息系统层软件

如图1所示,J2EE应用可以由三或四个层次组成,J2EE多层次应用一般被认为是三层应用,因为它们是被分布在三个不同的地点:客户端机器、J2EE服务器和数据库或后端的传统系统服务器。三层架构应用是对标准的客户端/服务器应用架构的一种扩展,即在客户端应用和后台存储之间增加一个多线程应用服务器。


图1:多层应用

J2EE应用组件

J2EE应用是由组件组成的。J2EE组件是一个自我封装的功能软件单元,它将通过相关的类、文件和与其它组件的通讯,被集成进J2EE应用。J2EE规范定义了如下J2EE组件:

应用(Application)客户端和小程序(applet)是客户端组件

Java Servlet和Java Server Pages技术组件是Web组件

Enterprise JavaBeans(EJB)组件是业务组件

J2EE组件使用Java编程语言编写的,也向任何Java编程语言程序一样编译的。使用J2EE平台的不同之处是,J2EE组件是被集成到J2EE应用中的,是经过很好格式化的并经过J2EE规范兼容性验证的,而且在部署和正式运行时,是运行在J2EE服务器上,并且是在J2EE服务器的管理下运行的。

客户端组件

一个J2EE应用可以使基于Web的或不基于Web的。对于不基于Web的J2EE应用,一个应用客户端软件将运行在客户端机器上,而对于基于Web的J2EE应用,浏览器会下载Web页面和小程序(applet)到客户端机器上。

应用客户端

运行在客户端机器上的应用客户端软件,为用户提供一个途径,处理象J2EE系统或应用管理这样的工作。它通常由一个用Swing或AWT API开发的图形用户界面,但是也可以使用命令行接口。

应用客户端软件直接访问运行在业务层的企业Bean。当然,如果J2EE应用客户端允许,一个应用客户端也可以建立HTTP连接,与运行在Web层的Servlet进行通讯。

Web浏览器

用户端的Web浏览器从Web层下载HTML/WML/XML等静态或动态Web页面。动态页面是由运行在Web层的Servlet或JSP页面生成的。

Applet

一个从Web层下载的Web页面可以包含嵌入的applet。一个applet是一个用Java编程语言编写的小客户端应用,通过安装在Web浏览器上的Java虚拟机执行。然而,applet要在Web浏览器上成功运行,客户端系统还需要Java插件(Java Plug-in)和安全策略文件。

JSP页面是推荐的创建基于Web的客户端程序的API,因为在客户端无需插件和安全策略文件。而且,JSP页面支持清晰的、多模块应用设计,因为它提供一个途径,使应用程序编程和Web页面设计分离。这意味着参与Web页面设计的人员所要做的工作,不需要了解Java编程语言的语法。

运行在基于网络的系统,例如手持设备、汽车电话等上的Applet,可以执行运行在J2EE服务器上的JSP页面或Servlet生成的WML页面。WML页面是通过无线应用协议(WAP)传送的,网络配置需要一个网关,把WAP转换成HTTP,然后在转换回来。网关把从手持设备上来的WAP请求转换成J2EE服务器的HTTP请求,再把HTTP服务器的响应和WML页面转换成一个WAP服务器响应和WML页面显示在手持设备上。

JavaBeans组件架构

客户层也由一个基于JavaBeans组件架构的组件,用于管理应用客户端或applet 与运行在J2EE服务器上的组件之间的数据流。JavaBeans组件不是在J2EE规范中的组件。

为J2EE平台而写的JavaBeans组件,包含实例变量以及为访问实例变量的读取和设置方法。以这种方式使用的JavaBeans组件一般设计和实现起来非常简单,但是要遵循JavaBeans组件架构中的命名和设计规范。

J2EE服务器通讯

图2展示了组成客户层的不同组成部分。客户端与运行在J2EE服务器上的业务层之间的通讯,可以是直接的,或者是在客户端运行浏览器的情况下,通过运行在Web层的JSP页面或Servlet完成。


图2:服务器通讯


瘦客户端

J2EE应用使用瘦客户端。一个瘦客户端是与应用连接地轻负载接口,它不处理象查询数据库、执行负载业务逻辑、或域传统系统连接等工作。象这样的重负载被转移到运行在J2EE服务器上的Web或企业Beans上,这样可以借助J2EE服务器端技术的安全性、快速、服务和可靠性。

Web组件

J2EE的Web组件可以是JSP页面,也可以是Servlet。Servlet是Java编程语言的类,能够动态处理请求并生成响应。JSP页面是基于文本的文件,包含静态内容和小段的Java编程语言代码用以生成动态内容。当JSP页面被调用时,后台Servlet执行这小短代码,并返回结果。

静态HTML页面和applet在应用集成的时候是与Web组件捆绑在一起的。但是没有被J2EE规范最为Web组件处理。服务器端应用类也可以与Web组件捆绑,象HTML一样,没有作为Web组件。

如图3展示,向客户层一样,Web层有JavaBeans对象管理用户的输入,并把输入发送到运行在业务层的企业Bean处理。


图3:Web层和J2EE应用


业务组件

业务代码,用于解决或满足特定的业务领域的问题的逻辑,例如银行、零售或者金融等等,是在业务层,由企业Beans来处理的。图4展示一个企业Beans是如何接收客户端程序的数据,处理它(如果需要的话),并把它发送到企业信息系统层进行存储。企业Bean同样接收存储的数据,处理它(如果需要的话),在发送回客户端程序。

企业Beans有三类:Session Beans、实体beans(entity beans)和消息驱动Beans。一个Session Bean代表一个与客户的临时会话。当客户结束操作时,这个Session Bean和它的数据就消失了。相反,实体Bean表示一个永久存储在数据库的表中的数据。如果客户结束操作或服务器关机,后台操作保证实体Beans的数据存储下来。

一个消息驱动的Bean结合了Session Bean和Java消息服务(JMS)消息侦听器的功能,允许业务组件以异步的方式接收JMS消息。这里介绍实体Beans和Session Beans。想了解更多的关于消息驱动Beans,参加Java Message Service教程。


图4:业务和企业信息系统(EIS)层


企业信息系统层

企业信息系统层处理企业信息系统软件,包括企业体系结构系统如企业资源规划(ERP),大型机交易处理,数据库系统,以及传统信息系统。J2EE应用组件需要访问企业信息系统,例如建立数据库连接等等。

J2EE架构

通常,瘦客户端多层次应用是很难编写的,因为它包括很多行非常难以理解的代码,以处理交易和状态管理,多线程,资源池管理,以及其他复杂的低层次细节问题。基于组件的、与平台无关的J2EE应用的开发是很容易的,因为业务逻辑被组织成可重复使用的组件,而且J2EE服务器以容器(Container)的形式为每种类型的组件提供后台支持。由于你不必自己开发这些服务,你可以专注于解决你面临的业务问题。

容器(container)和服务

组件在部署时被安装在容器之中,是组件和特定平台底层功能之间的接口支持着组件。在Web,企业Bean或者应用客户端组件能够被执行以前,它必须被组装到J2EE应用里,并且被部署到它的容器里。

组装流程包括设定J2EE应用中的每一个组件以及J2EE应用本身在容器之中的设置。容器的设置个性化了J2EE服务器对每个组件的后台支持,包括象安全性、交易管理、Java命名和目录接口查询,以及远程连接等等。这里是一些重点:

J2EE安全模式,使你能够配置Web组件或企业Bean,使系统资源只能被授权的用户访问。

J2EE交易模式,使你能够指定方法之间的关系,从而组成一个交易,这样交易中的所有方法将被作为一个单元对待。

JNDI查询服务,为企业中多种命名和目录服务提供统一的接口,这样应用组件就可以访问命名和目录服务了。

J2EE远程连接模式,管理客户端和企业Beans之间的底层通讯。在企业Bean被创建后,客户端调用它的方法,就象它在同一个虚拟机上一样。

实际上,J2EE架构提供可配置的服务,意思是在同一个J2EE应用中的应用组件可以根据他们部署的位置不同,表现不同。一个企业Bean可以通过不同的安全设置,是它在一个生产系统中获得一种层次的数据库数据访问,而在另一个生产系统中,则获得另一种数据库访问权限。

容器还管理着不可配置服务,如企业bean和Servlet的生命周期,数据库连接资源池,数据持续性(persistence),以及J2EE API中描述的访问J2EE平台的API。尽管数据持续性机制是一个不可配置服务,J2EE架构允许你在需要比缺省的容器管理的持续性机制更多的控制时,用你的企业Bean实现中的相应的代码覆盖原有的容器管理的持续机制。例如,你可以使用Bean管理的持续性机制来实现你自己的搜索方法,或创建个性化的数据库缓存。

容器类型

在部署过程之中,J2EE应用组件被安装在如下类型的J2EE容器中。本文中涉及的J2EE组件和容器参见图5。

企业JavaBeans(EJB)容器,为J2EE应用管理着所有的企业Beans。企业Bean和它们的容器运行在J2EE服务器上。

Web容器,为J2EE应用管理着所有的JSP页面和Servlet组件。Web组件和它们的容器运行在J2EE服务器上。

应用客户端容器,为J2EE应用管理着所有的应用客户端组件。应用客户端组件和它们的容器运行在客户端机器上。

applet容器,是Web浏览器和Java插件的组合,运行在客户端机器上。


图5:J2EE服务器和容器


包装

J2EE组件是单独包装的,为部署而捆绑到J2EE应用中。每个组件,其相关的文件如GIF和HTML文件,或者服务器端应用类,以及部署描述,被集成成一个模块并添加到J2EE应用中。J2EE应用是由一个或多个企业Bean,Web,或应用客户端组件模块组成的。最终企业解决方案可以使用一个J2EE应用或根据设计需要由两个或更多的J2EE应用组成。

一个J2EE应用以及它的每一个模块都有它自己的部署描述。部署描述是一个XML文本文件,带有.xml后缀,描述组件的部署设置。一个企业Bean的部署描述,例如,声明交易属性,和企业Bean的安全认证。由于部署描述的信息是可以声明的,这样它可以在无需修改Bean的源代码的情况下,进行修改。在运行时,J2EE服务器读取部署描述,并依次对组件进行操作。

J2EE应用以及相关的模块是在一个Enterprise Archive(EAR)中发送的。EAR文件是一个标准的JAR文件,以.ear后缀结尾。在GUI版的J2EE SDK应用部署工具集中,你先创建一个EAR文件,在添加JAR和WAR到EAR中。如果你使用命令行打包工具,则先创建JAR和WAR文件,然后创建EAR文件。J2EE SDK工具:

每个EJB JAR文件包含它的部署描述,相关文件和企业Bean的.class文件

每个应用客户端JAR包含它的部署描述,相关文件和应用客户端的.class文件

每个WAR文件包含它的部署描述,相关文件和servlet的.class文件以及JSP页面的.jsp文件

使用模块和EAR文件使使用一些相同的组件组装多个不同的J2EE应用成为可能。无需额外的编程,只是把不同的J2EE模块组装到J2EE EAR文件中。

开发的角色

可重用模块使把应用开发和部署过程分成截然不同的角色成为可能。这样不同的人或公司能够在整个过程中实施不同的部分。

最开始的两个角色包括购买和安装J2EE产品和工具。当软件采购的并且安装了, J2EE组件可以由应用组件提供商开发,由应用组装商组装,由应用部署商部署。在一个大的机构中,每一个角色由不同的个人或小组完成。这种劳动力的分割是可行的,因为每一个先前的角色输出一个可移植的文件,这个文件可以作为后续角色的输入。例如,在应用组件开发阶段,一个企业Bean软件开发商提交EJB JAR文件。在应用组装角色中,另一个开发商把这些EJB JAR文件与J2EE应用相结合,并存放在一个EAR文件中。在应用部署角色中,系统管理员在客户现场,使用EAR文件,把J2EE应用安装到一个J2EE服务器中。

不同的角色并不是总是由不同的人来执行的。如果你为一个小公司工作,或者你在构建一个测试应用,你可能要执行每一个阶段的工作。

J2EE产品供应商

J2EE产品供应商是设计和制作能够用于销售的J2EE平台、API和J2EE规范所定义的其他特性的公司。产品供应商一般是操作系统、数据库系统、应用服务器或Web服务器厂商,他们根据J2EE规范实现J2EE平台。

工具供应商

工具供应商是个人或公司,他们提供组件开发商、组装商、部署商等使用的开发、组装和包装工具。参见工具信息提供的J2EE SDK 1.3兼容的工具。

应用组件供应商

应用组件供应商是公司或个人,他们制作Web组件、企业Beans、applet或应用客户端,这些组件可用于J2EE应用。

企业Bean制作

软件开发者完成以下工作,以提供包含企业Bean的EJB JAR文件:

编写并编译源代码

定制部署描述

捆绑.class文件和部署描述到一个EJB JAR文件

Web组件制作

Web开发者(JSP页面)或软件开发者(servlet)完成以下工作,以提供包含Web组件的WAR文件。

编写并编译servlet源代码

编写JSP和HTML文件

为web组件定制部署描述

捆绑.class,.jsp,.html和部署描述文件到WAR文件

J2EE应用客户端制作

软件开发者完成以下工作,以提供包含J2EE应用客户端的JAR文件。

编写并编译源代码

为客户端定制部署描述

捆绑.class文件和部署描述文件到JAR文件

应用组装商

应用组装商是一些公司或个人,他们从组件供应商那里得到应用组件的JAR文件,并组装成J2EE应用的EAR文件。组装商和部署商可以直接编辑部署描述或者使用工具,根据交互方式的选择,正确的增加XML标签。软件开发商完成以下工作,以提供包含J2EE应用的EAR文件。

组装EJB JAR和前一阶段开发的Web组件(WAR)文件,生成新的J2EE应用(EAR)文件。

为J2EE应用定制部署描述

检查EAR文件的内容是否是很好格式化的并符合J2EE规范

应用部署商和管理员

部署商和管理员是公司或个人,他们配置并部署J2EE应用,管理J2EE运行的计算和网络架构,并监视运行环境。责任包括设置交易控制,安全属性,并设定与数据库地连接。

在配置过程中,部署者遵循由应用组件供应商提供的指南,解决外部依赖关系,设定安全框架,设置交易属性。在安装过程中,部署商将应用组件转移到服务器上,并生成容器专用的类和接口。

部署商/系统管理员完成以下工作,已安装并配置J2EE应用。

增加在前一阶段制作的J2EE应用(EAR)文件到J2EE服务器上

为运行环境配置J2EE应用,即修改J2EE应用的部署描述

检查EAR文件的内容是否是很好格式化的并符合J2EE规范

部署(安装)J2EE应用的EAR文件到J2EE服务器

参考实现软件

J2EE SDK是由Sun公司提供的J2EE平台和规范的非商业用途的实现,适用于示范、原形制作和教学环境。包含J2EE应用服务器、Web服务器、关系型数据库、J2EE API等,是一套完整的开发部署工具。你可以从网上下载J2EE SDK。

产品开发商使用J2EE SDK确定在一组给定应用条件下必须组那些实现,并且运行J2EE兼容性测试包,以检测它们的产品测试包是否完全符合J2EE规范。

应用组件开发商在J2EE SDK上运行他们的J2EE应用,以验证这些应用是否适用于所有J2EE产品和工具。

Web服务器

Web服务器提供一个或多个Web容器。例如,Web容器一般依赖于Web服务器提供HTTP消息管理。J2EE实现不是必须支持某个特定的Web服务器,这意味着不同的J2EE产品对Web服务器的支持是由变化的。

数据库访问

关系性数据库对应用数据提供持久的存储。J2EE实现不是必须支持某一特定类型的数据库,这意味着不同J2EE产品对数据库的支持是变化的。参见J2EE SDK下载文件中的版本说明,提供了参考实现目前支持的数据库清单。

J2EE API

Java 2平台标准版(J2SE)SDK在运行J2EE SDK时是必需的,它为编写J2EE组件提供核心API,核心开发工具,以及Java虚拟机。J2EE SDK提供下列API供J2EE应用使用。

企业JavaBeans技术 2.0

一个企业Bean是一段包含域和方法的代码体,用于实现业务逻辑的一个模块。你可以认为企业Bean是一个构建模块,可以单独使用或与其他企业Beans一起在J2EE服务器上执行业务逻辑。

由三种类型的企业Bean:Session Bean,实体Beans,和消息驱动Beans,这些在业务组件中描述过。有了实体Beans,你无需编写任何SQL代码或直接使用JDBC API执行数据库访问操作。EJB容器替你处理这些。当然,如果你不管因为任何原因,覆盖了却省的容器管理持续性机制,你将需要使用JDBC API。同样,如果你选用Session Beans访问数据库,你必须使用JDBC API。

JDBC 2.0 API

JDBC API是你可以从Java编程语言的方法中,调用SQL命令。你在覆盖了却省的容器管理持续性机制,或选用Session Beans访问数据库,则企业Bean中访问数据库必须使用JDBC API。有了容器管理持续性机制,数据库访问操作由容器来处理,你的企业Bean的实现中不包含JDBC代码或SQL命令。你也可以从servlet或JSP页面中直接使用JDBC API访问数据库,而不通过企业Bean。

JDBC API由两个部分:一个适用于应用组件访问数据库的应用驱动接口;一个是隶属于J2EE平台的服务提供接口。

Java Servlet技术2.3

Java Servlet技术为你定义HTTP专用的servlet类。一个Servlet类扩展了服务器的能力,这个服务器存放着应用,而应用是以请求-响应编程模式被访问的。尽管Servlet可以响应任意形式的请求,但是它通常被用于扩展Web服务器存放的应用。

JavaServer Pages(JSP)技术 1.2

JSP页面技术是你能够在基于文本的文件中结合小段的Java编程语言代码和静态内容。一个JSP页面是一个基于文本的文件,它包含两种类型的文本:静态模板数据,它可以表示为任何基于文本的格式,如HTML、WML和XML;JSP元素,决定这个页面如何构造动态内容。

Java Messaging Service 1.0

JMS API是一种消息标准,允许J2EE应用组件创建、发送、接受和读取消息。它是松散耦合的、可靠的,异步地进行分布式通讯。有关JMS的更多信息参见Java消息服务教程。

Java Transaction API(JTA) 1.0

JTA API为分段交易提供标准的分段接口。J2EE架构提供一个缺省的自动确认来处理交易的确认和回滚。一个自动确认意味着任何其他查询数据的应用,在每次数据库的读写操作以后,将看到最新的数据。然而,如果你的应用执行两个独立的相互依赖的数据库访问操作,你将希望使用JTA API来划分,使整个交易同时含有开始、回滚和确认。

JavaMail技术1.2

很多互联网应用需要发送邮件进行确认,所以J2EE平台包含了与JavaMail服务提供商配合使用的JavaMail API,这样,应用组件可以使用它发送邮件。JavaMail API包含两个部分:一个是应用层接口,应用组件使用它发送邮件;一个服务提供商接口。

JavaBean Activation Framework 1.0

JavaBeans激活框架被包含是因为JavaMail要使用它。它提供标准的服务,以确定专用数据的类型,对它的压缩访问,发现对它可以使用的操作,并创建相应的JavaBean组件来执行那些操作。

Java API for XML(JAXP) 1.1

XML是一种语言,用于表示和描述基于文本的数据,这样数据可以被使用XML API的程序或者工具所读取和处理。程序和工具可以生成XML文件,另一些程序和工具可以读取和处理。

例如,一个J2EE应用使用XML制作报表,不同的公司收到这个报表,可以用最符合他们需要的方式处理这些数据。一个公司可能把XML数据通过程序转换成HTML格式,这样它可以把报表放在Web上,另一个公司可能把XML数据通过工具生成市场演讲稿,再有另一个公司可能把XML数据读到J2EE应用中进行处理。

J2EE Connector API 1.0

连接器API被J2EE工具厂商和系统集成商用于创建资源适配器,使企业信息系统可以嵌入一些J2EE产品。一个资源适配器是一个软件组件,它使J2EE应用组件可以与后台资源管理器进行访问和交互。因为资源适配器是他的资源管理器专用的,所以每个类型的数据库或信息系统有它不同的资源适配器。

Java授权与认证服务(JAAS)1.0

Java授权与认证服务(JAAS)提供一个途径,使J2EE应用可以授权并认证一个用户或一个用户组使用它。JAAS是标准的嵌入式认证模块(PAM)框架的一个Java编程语言版本,使Java 2平台安全架构可以支持基于用户的授权。

工具

J2EE参考实现提供一个应用部署工具和一组脚本,用于组装、验证和部署J2EE应用并管理你的开发和生产环境。参见J2EE教程以全面了解这些工具。

应用部署工具

J2EE参考实现提供一个应用部署工具,用于组装、验证和部署J2EE应用。它由两个版本:命令行和GUI。

GUI工具包含有Wizards用于:

打包、配置和部署J2EE应用

打包、配置企业Beans

打包、配置Web组件

打包、配置应用客户端

打包、配置资源使配器

另外,配置信息可以在表格化的检验图框中为每一个组件和模块类型进行设置。

脚本

表1列出了J2EE参考实现中包含的脚本,你可以在命令行中执行这些操作。

脚本

描述

j2ee

启动和停止J2EE服务器

cloudscape

启动和停止缺省数据库

cloudIJ

运行交互式SQL工具,这是一个不支持的工具

j2eeadmin

为不同的资源增加JDBC驱动,JMS目标,和连接工厂

keytool

创建公开的和私有的密钥,生成X509自己签署(self-signed)的证书

realmtool

输入证书文件。为J2EE应用在认证/授权列表中,增加、删除J2EE用户

packager

包装J2EE应用组件到EAR,EJB JAR,应用客户端JAR和WAR文件中。

verifier

验证EAR、EJB JAR、应用客户端JAR和WAR文件是否是很好格式化的,以及是否遵从J2EE规范

runclient

运行J2EE应用客户端

cleanup

从J2EE服务器上清除所有部署的应用

结论

J2EE平台提供了你设计、建造、测试、部署分布式多层次应用所需要的所有内容。J2EE教程对平台特性、API和工具进行了有深度的介绍。如果你需要J2EE应用设计方面的帮助,J2EE BluePrints Digest对在J2EE平台上,开发多层次、瘦客户应用,提供了高层次的描述。

应用编程模式由技术主体和原则组成,指导J2EE应用开发人员确定最合理的实施选择、最有效的使用JSP和Servlets,在实现业务逻辑时选择好的设计、有效的把J2EE安全模型映射到企业计算环境和体系结构。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章