2. J2EE与.NET的分析比较与互操作性
2.1 互操作性概要说明
Java EE平台能够与建立在.NET框架上的应用协同工作,它有许多互操作性技术提供了消息传送、分布式对象和Web服务。
Servlet、JSP、EJB和JSF都是能够用来建立用于与.NET或其他平台互操作的可重用组件的程序语言要素。Servlet和JSP通常归类为Web组件,因为它们由Web容器来管理。比方说创建能与.NET应用同步或异步交换业务数据的Web服务。EJB归类为EJB组件,因为它们由EJB容器来管理。例如EJB能够通过RMI——IIOP桥接实现与.NET应用的互操作。基础的Java EE服务为Web(或Web容器)或业务层(或EJB容器)组件提供与.NET应用实现互操作的基础系统服务和基本功能。例如,当使用RMI-IIOP桥接集成策略时,就需要RMI-IIOP通信服务。
2.2 J2EE介绍
J2EE 的全称是Java 2 Enterprise Edition,它是由SUN公司来领导,各厂商共同制定,并得到广泛认可的工业标准。业内许多大的应用服务器厂商如IBM、BEA、Oracle等都积极地参与J2EE标准的制定和实施工作。因此J2EE从一开始走的就是开放路线,由众多厂商共同提交方案和制定规范,这也使得J2EE很容易就可以吸收这些厂商多年来在应用开发、系统设计和集成方面的经验。当然,这些厂商对市场的需求和新技术发展的预测,以及各自独到的观点,都会在J2EE的规范中不断体现出来。有了这样的土壤,J2EE产品完全可以满足当前不断变化和日趋复杂的商业应用需求,也很快变成了企业构建新系统和集成、扩展已有系统的首选技术。而因此带来的巨大商机和利润又使得各厂商更加努力的去完善J2EE,从而造就了J2EE强大的生命力。
J2EE平台是由一整套服务(Services)、应用程序接口(APIs)和协议(例如RMI-IIOP协议)构成:
(1)JDBC(Java DataBase Connectivity,Java数据库连接接口)
JDBC API是Java访问数据库的一种途径和接口,它为不同数据提供了一个统一的访问方法,屏蔽了底层不同数据的不同实现细节,对于企业信息的集成具有重要意义。
(2)JNDI(Java Name and Directory Interface,Java名字和目录接口)
JNDI用于支持Java的名字和目录服务,它提供了一致的模型来存取和操作企业级的资源,例如ERP、LDAP、应用服务器中的对象(Objects)等。
(3)EJB(Enterprise JavaBeans,企业JavaBeans)
EJB不同于JavaBeans,是面向企业级业务逻辑处理的构件技术,而JavaBeans则更侧重于简单代码的复用以及表示层的接口设计(例如控件)上。它是J2EE的核心所在,提供了一个框架来开发和实施分布式商业逻辑,提高了企业计算的可伸缩性和复用性等。EJB容器定义了EJB构件容器对EJB构件的管理和各种公共服务等。
(4)RMI(Remote Method Invoke,远程方法调用)
RMI是Sun公司自己定义的解决分布式对象互操作的一组标准规范,它使用了序列化方式在客户端和服务器端传递数据,RMI是一种被EJB使用的底层的协议。由于RMI只能访问由Java语言写的对象,因此,在实际的应用中受到一定的限制,在这种情况下,Sun与OMG组织联合发布了一种新的互操作协议,RMI-IIOP,通过这个协议,Java可以直接访问一般的CORBA对象,因此,扩展性能得到了很大的提高。
(5)Java IDL
通过Java IDL,开发人员可以将Java和CORBA有机的集成起来,实现与CORBA对象的互操作,这是Java实现分布式对象互操作的又一种途径(前面的RMI/IIOP也是一种)。
(6)JSP(Java Server Pages)
它也是J2EE的一个组件模型。它在系统开发中得到了应用。
(7)Java Servlet
同样,作为J2EE的一个构件模型,在系统开发中我们进行了应用。
(8)XML
J2EE提供了对XML的全面支持,体现在JAXP接口上。XML是一种可以用来定义其它标记语言的语言,被用来在不同的商务过程中共享数据,它在平台独立性方面与Java正是利益共同,通过将Java与XML结合,能够构建一个更加完美的商务系统,这也是今后互联网信息业发展的一面旗帜。
(9)JavaMail API和JAF(Java Activation Frameworks)
JavaMail接口主要用于存取邮件服务器,它提供了一套邮件服务器的抽象类,不仅支持SMTP,也支持POP3和IMAP服务器。
JAF通常与JavaMail接口一起使用,用于处理MIME编码格式的邮件。
(10)JMS(Java Message Service)
JMS用于和面向消息的中间件(MOM)进行通信。
(11)JTA(Java Transaction Architecture)
JTA定义了一套标准的API,应用系统可以通过该API来访问各种事务监控中间件(TP Monitor)。
(12)JTS(Java Transaction Service)
JTS是CORBA OTS事务监控的基本实现,规定了事务管理器的实现方式,该事务在高层支持JTA规范,为应用服务器、资源管理器等提供了必要的事务服务。
目前,J2EE的重点集中在Web Services 和JCA 方面。通过标准Web Services 模型,提供一套标准的方法在JAVA 中实现Web Services。在Web Services 的安全方面,利用OASIS 的SAML 标准提供安全Web Services 方面的功能。在JCA 中加入异步消息模式,增加后台系统的连接方式。当然在其它方面如JSP 和EJB 也会不断完善。JSP 将在浏览器端支持标准Tag Library,提高模型-视图-控 制架构,达到ASP.NET 的水平。而在EJB 上,对于异步消息和Web Services 的支持将是不久的方向。另外随着Liberty Alliance 的成立,J2EE 也会在互联网的认证、授权上找到解决方案(类似于微软的Passport 服务)。对于多媒体的支持和JAVA Swing 的丰富都在制定之中。
2.3 Microsoft .NET
Microsoft.NET的前身是微软的DNA(Distributed Network Architecture),在2000年中的时候被.NET所取代。.NET在诞生之初就秉承了微软一贯的文化和战略:帮助客户加快对市场反应、提供完整、集成的解决方案和缩短客户投资回报的时间。NET Framework是在Microsoft .NET平台上进行开发的基础,.NET Framework以及针对设备的.NET Framework简化版为XML Web服务和其他应用程序提供了一个高效安全的开发环境,并全面支持XML。从.NET框架角度看,所有组件都可以是Web服务,而Web服务也仅是一种组件,.NET框架提取出微软组件对象模型(COM)的精华,将它们与松散联接计算的精华有机地结合在一起,而生成强大、高效的Web组件系统。.NET Framework简化了程序员的“管道”操作,深入地集成了安全性,引进了基于互联网的操作系统,极大地改善应用程序的可靠性和可扩展性。
图3-2显示了Microsoft.NET框架的体系结构。建立在操作系统最上层的服务,是管理运行代码需求的公共语言运行时(Common Language Runtime),这些代码可以用任何现代编程语言所编写。Runtime提供了许多服务,这些服务有助于简化代码开发和应用程序的开发,同时也将提高应用程序的可靠性。.NET Framework包括一套可被开发者用于任何编程语言的类库。在此之上是许多应用程序模板,这些模板为开发网络站点和网络服务提供了高级组件和服务,下面将会逐层描述。
图3-2 Microsoft.NET的架构
(1)公共语言运行时。除了公共语言运行时的字面含义外,公共语言运行时在组件的开发及运行过程中,都扮演着非常重要的角色。在组件运行过程中,运行时负责管理内存分配、启动或删除线程和进程、实施安全性策略、同时满足当前组件对其它组件的需求。在开发阶段,运行时的作用有些变化:与现今的COM相比,运行时的自动化程度大为提高(比如可自动执行内存管理),因而开发人员的工作变得非常轻松。尤其是,映射功能将锐减开发人员将业务逻辑程序转化成可复用组件的代码编写量。对编程语言而言,运行时这个概念并不新奇:实际上每种编程语言都有自己的运行时。Visual Basic开发系统具有最为明显的运行时(名为VBRUN),Visual C++跟Visual FoxPro、Jscript、SmallTalk、Perl、和Java一样有一个运行时,即MSVCRT。.NET框架的关键作用在于,它提供了一个跨编程语言的统一编程环境,这也是它能独树一帜的根本原因。
(2)统一的编程类。.NET框架为开发人员提供了一个统一、面向对象、层次化、可扩展的类库集(API)。现今,C++开发人员使用的是Microsoft基类库,Java开发人员使用的是Windows基类库,而Visual Basic用户使用的又是Visual Basic API集。只是简单地一用,.NET框架就统一了微软当前的各种不同类框架。这样,开发人员无需学习多种框架就能顺利编程。远不止于此的是,通过创建跨编程语言的公共API集,.NET框架可实现跨语言继承性、错误处理功能和调试功能。实际上,从JScript到C++的所有编程语言,都是相互等同的,开发人员可以自由选择理想的编程语言。
(3)活动服务器页面(ASP.NET)。ASP.NET是使用.NET框架提供的编程类库构建而成的,它提供了Web应用程序模型,该模型由一组控件和一个基本结构组成。有了它,Web应用程序的构建变得非常容易。开发人员可以直接使用ASP.NET控件集,该控件集封装了公共的、用于超文本标识语言(HTML)用户界面的各种小器件(诸如文本框、下拉菜单等等)。实际上,这些控件运行在Web服务器上,它们将用户界面转换成HTML格式后再发送给浏览器。在服务器上,控件负责将面向对象的编程模型提供给Web开发人员,这种编程模型能提供面向对象编程技术的丰富功能。ASP.NET还提供一些基本结构服务(诸如会话状态管理和进程重启服务),这些服务大大减少了开发人员要编写的代码量,并使应用程序的可靠性得到大幅度提高。ASP.NET还允许开发人员将软件作为一项服务来提供。通过使用ASP.NET Web服务功能,ASP.NET开发人员只需进行简单的业务逻辑编程,而由ASP.NET基本结构负责通过简单对象访问协议(SOAP)来提供服务。
(4)ADO.NET。ADO.NET由ADO发展而来,为基于网络的应用程序和服务提供数据访问服务。ADO.NET的一个主要创新是引入了数据集(Dataset)。一个数据集是内存中提供数据关系图的高速缓冲区。数据集对数据源一无所知,它们可以由程序或通过从数据仓库中调入数据而被生成、填充。不论数据从何处获取,数据集都是通过使用同样的程序模板而被操作的,并且它使用相同的数据缓冲区。使用.NET平台的开发人员能够用数据集代替传统ADO中无连接的记录集。从而使用户能快速地创建出高性能、可靠的XML Web服务和现在流行的n层应用程序(N-tier applications)。
(5)Enterprise Services。由于建立在Windows 2000的Application Services上,并包括了微软COM+服务和消息队列服务,.NET Framework Enterprise Services的可扩展性和可靠性都相当出色,而这对企业级程序(比如事务处理)而言是非常重要的。此外,Windows 2000 Application Services和.NET Framework的深层整合,使得用户可以将现在通行的基于COM的程序转化为XML Web服务,而且整个转化根本不用写一行代码,只需通过一个管理接口(administrative interface)就能轻而易举地实现。
(6)Windows Forms。编写Windows客户应用程序的开发人员可使用Win表单应用程序模板以利用Windows丰富的用户接口特点,包括现在的ActiveX控件和Windows 2000的新特点,如透明的、分层的浮动窗口。开发人员会发现Win表单可编程模板和对设计阶段的支持非常直观。
2.4 J2EE和.NET比较
(1)主要技术概述
●J2EE平台的构成。
EJB:J2EE中间层,完成商业逻辑;
JAAS:J2EE处理认证和授权的API;
Java Connectors:J2EE用于连接异种数据源的API,对上层来讲是透明的;
JSP,Java Servlets:J2EE的表示层技术,用于生成用户界面;
JAVA Virtual Machine:JAVA语言运行环境;
JDBC:J2EE数据库访问;
JMS:J2EE的异步消息队列;
JNDI:J2EE的名字查找API,独立于目录服务器;
JTS:J2EE用于处理交易的API;
RMI/IIOP:J2EE的分布式对象的通讯API,提供了和CORBA交互的能力。
●.NET平台构成。
.NET Framework:.NET 应用运行的基础;
IL( Intermediary Language ):所有的.NET语言首先被编译成该中间语言,然后在CLR中运行;
SOAP:用于服务访问的工业标准;
DCOM:组件间通信协议;
MS-DTC:用来在.NET平台上使用两阶段提交协议来处理分布式交易;
CLR:.NET应用的运行环境;
COM+:.NET的中间层模型,用于构建商务逻辑;
ADO.NET:.NET对数据访问的API。
(2)架构比较
在表现形式上,J2EE是一组规范,而.NET更象是一组产品。但它们的目的都是为企业应用提供分布式的、高可靠性的解决方案。它们在架构上有着很多的相似之处,下面是J2EE和.NET的一个简单对照表。
表3-1 J2EE和.NET比较
| J2EE | .NET |
通信协议 | Remote Method Invocation-Internet Inter OPB Protocol (RMI-IIOP),XML |
|
编程语言 | Java | C#,VB.NET,COBOL |
运行时环境 | JAVA Virtual Machine (JVM) | Common Language Runtime(CLR) |
胖客户端 | JAVA Swing | Windows Forms |
目录服务 | Java Name and Directory Interface(JNDI) | Active Directory Services Interface(ADSI) |
数据访问 | JDBC,Java Connectors | ADO.NET |
异步消息处理 | Java Message Service(JMS) | Microsoft Message Queue |
表示层技术 | Servlet,Java Server Pages(JSP) | ASP.NET |
中间层组件模型 | EJB,JavaBeans | COM+,COM |
安全访问 | JAAS | COM+ Security |
事务处理 | Java Transaction Service(JTS) | Microsoft Distributed Transaction Coordinator(MS-DTC) |
开发工具 | Jbuilder,IBM Visual Age等(第三方提供,规范本身没有定义) | Visual Studio .NET |
(3)对分布式技术的支持
●对旧有分布式技术的支持:
●对新一代Web Services的支持:
(4)语言安全性
虽然微软与SUN公司都在鼓吹开放框架和跨平台的兼容性,但每个平台背后最富生命力的还是基本编程语言,C#是一个,JAVA是另一个。两种产品在设计这些语言时都考虑了安全性问题,并且保证安全的方法也近似,包括自动垃圾收集和命名空间。不过两者之间仍存在很大的差别,主要是分别支持的其余平台和协议不同,Java的ByteCode运行在虚拟机(VM)或是JIT(just-in-time)编译器上,而C# 捆绑在媒介语言(Intermediate language - IL)的语言运行库(CLR)上。
虽然Microsoft面临开放IL运行库环境核心组件的压力,其结构只由第三方Foundstone进行检查,C#总是在机器上运行。可以编译成本地代码或编译到IL中,而在执行时解释为本地代码。一般通过解释ByteCode或JIT 编译器运行java。当然这两种模式具有可靠性和力量。此处最重要的是,Java仍然依靠“沙箱(sandbox)”安全模型以保证Java代码安全。然而Microsoft已经从“沙箱”模式转移到代码-设计范例,通过“基于证据”系统加强安全,该系统确定基于代码来源而不是运行库安全检查。
从安全立场考虑,Java已经在互联网上经历了将近十年的风雨,并且在不断的测试和bug修正过程中获益。C# 仍然不成熟。
最后,一个关键的差别在于SUN已经成为开放源代码的倡导者,Java VM 规范可以在线或是以出版物的形式获得。虽然对于Microsoft已经面临开放IL运行库环境核心组件的压力,其结构只由第三方Foundstone进行检查。当然,这是两个公司的核心前提,“隐藏式安全”对“开放资源安全”模式。
(5)数据访问
J2EE 和.NET以不同的形式支持数据的访问。JDBC和ADO一样与所连接的数据库无关,并且通过连接命令语句和结果集来对数据进行操作。所以属于中间层次的API。更高一级的数据封装和数据管理是通过实体EJB(entity EJB)来完成的。基于容器管理的实体EJB 使开发更快捷,管理更方便。事实上,由于实体EJB 的load()和store()方法的同步机制,将大大缓解因并发而使数据库产生的瓶颈。也可以采用不属于J2EE 规范的第三方数据访问工具,象WebGain 的TopLink。而微软的.NET的数据访问工具则由基于XML的ADO.NET 代替了基于COM 组件的ADO。任何以XML 为输出的数据源都可以作为ADO.NET的数据源。相应的结果集升级为数据集(DataSets),命令语句则升级为数据集命令(DataSetsCommands)。从形式来看,微软的ADO.NET更新潮和时髦一些,基于XML 的特性使其可以处理极其丰富的数据源,并且,因其构架在HTTP 协议之上,易于穿透防火墙,使沟通更为便利。但由于XML本身的基于标记的特性,很明显限制了在有超大数据量和有网络瓶颈的应用中的使用。而J2EE 的数据访问规则则显得略有单薄,但同时却更简单,更有效。并且通过对应用程序有效的层次的设计,对于数据库和基于XML的数据源的访问,也是可以无缝地整合的。