我用java的spring有一段时间了。学习应用过程中,查阅一些资料,或多或少都会提到J2EE,二者往往作为对比相提并论。其实没有使用Java以前,我也听说过这个J2EE。对于究竟什么是J2EE,我一直很糊涂,搞不清。

一、什么是J2EE

J2EE(Java 2 Platform Enterprise Edition,Java 2 平台企业版)

j2EE就是java的企业版。

听上去,这就好像一套俗气的商业软件,分什么体验版,标准版,豪华版,旗舰版之类。

Java的三个版本 : Java SE(标准版),Java EE(企业版),Java ME(微型版).

J2EE里面的2是什么意思

1998年Java 1.2版本发布,1999年发布Java 1.2的标准版,企业版,微型版三个版本,为了区分这三个版本,分别叫做Java2SE,Java2EE,Java2ME,简称J2SE,J2EE,J2ME。所以2的含义为1.2版本。java1.2是java中很重要的一站。之后的1.3,1.4与1.2相比,有一些变化,但不是特别大。所以在1.5推出以前一直在使用j2ee这个叫法,没有叫做j3ee,j4ee。2005年。java推出1.5版本,这又是java发展史上的一个里程碑,与之前的java版本有了较大的变化,所以sun决定不再使用这个j2ee这样的称呼,当然也没有使用j5ee。J2EE更名为Java EE,J2SE更名为Java SE,J2ME更名为Java ME。所以,现在的J2EE等叫法是05年以前老一辈的叫法。

原来如此。我还以为,这个2是to的意思。J2EE,就是java to 伊伊。伊伊是个人名。搞IT的人这一招泛滥成灾,比如写一本书,自序里必定要感谢全家。那么J2EE,就是向伊伊扯旗致敬的一个Java框架?

但是,J2EE是软件没有错,不过准确来说,它只是一组标准,是一组建立在JavaSE之上的标准,解决企业级开发中的一系列问题。它对一系列接口进行了约定,然后由众多厂商围绕这个标准做实现,如JBoss,WebSphere等。

二、J2EE体系结构

J2EE由一整套服务(services)、应用程序接口(APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持。它定义了动态Web页面功能(Servlet和Jsp)、商业组件(EJB)、异步消息传输机制(JMS)、名称和目录定位服务(JNDI)、数据库访问(JDBC)、与子系统的连接器(JCA)和安全服务等。

J2EE_j2ee


图1

J2EE_java bean_02


图2

J2EE_java_03


图3

一个完整的J2EE服务器应该包括Web容器和EJB容器。

J2EE的体系结构可以分为四层,如上图所示。

1)客户端层:负责与用用户直接交互,J2EE支持多种客户端,所以客户端既可以是WEB浏览器,也可以是专用的Java客户端。

2)服务器端组件层:本层是为了基于WEB的应用服务的,利用J2EE中的JSP与Java Servlet技术,可以响应客户端的请求,并向后访问封装有商业逻辑的组件。

3)EJB层:本层主要封装了商务逻辑,完全企业计算机,提供了事务处理,负载均衡、安全、资源连接等各种基本服务,程序在编写EJB时可以不关心这些基本的服务,集中注意力于商务逻辑的实现。

4)企业信息系统层:企业信息系统层包括了企业的现有系统(包括数据库系统、文件系统),J2EE提供了多种技术以访问这些系统,如JDBC访问DBMS。

J2EE中的主要技术规范有JDBC、JNDI、EJB、JSP、Servlet、JTS、JTA、JMS。。。,等等。

Servlet:定义了如何处理Web请求,这个相信大家最熟悉
Java Server Faces:定义了如何使编写Web界面
JAX-RS:定义了如何编写RESTFul的接口
EJB:定义了如何编写“企业Bean”
JPA:定义了如何编写ORM和数据存取
JTA:定义了如何编写事务相关的代码
JMS:定义了如何编写消息队列程序
CDI:定义了如何编写依赖注入
JAX:定义了如何编写XML程序
JAX-WS: 定义了如何编写基于XML的网络服务,即SOAP……

三、EJB

EJB(Enterprise JavaBean),又被称为企业Java Beans。

EJB技术是在Java Bean基础上开发的、面向服务器端、分布应用的组件技术。EJB是J2EE规范的一部分,得到了广泛的发展,已经成为应用服务器端的标准技术。EJB提供了一个开发和实施分布式商务逻辑的框架,大大地简化了具有可伸缩性、高度复杂的企业级应用的开发。

EJB运行于EJB容器。EJB容器负责提供公用服务,如目录服务、事务管理、安全性、资源缓冲池以及容错性等。EJB规范定义了EJB组件如何与EJB容器进行交互。

EJB并不是实现J2EE的唯一途径,由于J2EE的开放性,使得有的厂商能够以一种和EJB平行的方式来达到同样的目的。

EJB提供了基于Java二进制字节代码的重用方式。EJB技术的推出,使得用Java基于组件技术开发服务器端分布式应用成为可能。从企业应用多层结构的角度来看,EJB是业务逻辑层的中间件技术。与JavaBeans的关键不同是它提供了事务处理的能力。

J2EE_java bean_04


EJB中定义了三种bean,分别是会话bean ,实体bean,和消息驱动bean。

四、EJB vs Java Bean

1、什么是Java Bean

Java Bean是符合一定技术规范的Java类。

Java 1996年发布,同年12月即发布了Java Bean1.00-A。通过统一的规范可以设置对象的值(get,set方法),这就是最初的Java Bean。但在实际企业开发中,需要实现事务、安全、分布式,javabean就不好用了。于是sun公司就开始往上面堆功能,这时Java Bean就复杂为EJB。然而EJB功能强大是强大,但太重了,此时又出现了DI(依赖注入)、AOP(面向切面)技术,通过简单的Java Bean也能完成EJB的事情,这时Java Bean简化为POJO,于是Spring诞生了。

一个Java类算不算Java Bean,需要满足至少三个条件:

1)有一个public默认构造器(例如无参构造器)。

2)属性使用public 的get,set方法访问,也就是说设置成private,同时get,set方法与属性名的大小也需要对应。例如属性name,get方法就要写成

public String getName(){
return "zhang3";
}

3)支持序列化。

2、EJB与Java Bean的区别
这里说的EJB是指EJB组件,它跟Java Bean一样,都是Java编写的组件。

但Java Bean是本地进程内组件,不能被跨进程访问;EJB组件是分布式组件,基于Java的远程方法调用(RMI)技术,可以被远程访问(跨进程、跨计算机);

Java Bean可以在程序中直接调用,但EJB组件不能直接访问,要通过EJB容器(诸如Webspere、WebLogic,JBoss)间接访问,EJB容器是EJB组件的代理。

对于简单的服务器端应用来说,使用JavaBean是很不错的选择。如果是复杂的服务器端应用,使用JavaBean虽然也可以达到相同的效果,但这么做的话,所有底层的实现都必须手工来重新编写。而EJB不必用户关心它的底层操作,因为这些都已经由容器提供,而只要关心它的外部实现即可。

3、EJB 约等于 SSH/SSM
与其将 EJB与JavaBean 比较,不如将EJB和SSH或者SSM比较,因为它们解决的目标是一致的。

SSH:Struts2为控制器(controller) ,spring 为事务层(service), hibernate 负责持久层(dao)

SSM:springMVC为控制器(controller) ,spring 为事务层(service), MyBatis 负责持久层(dao)

一个完整的J2EE服务器应该包括Web容器和EJB容器。EJB运行于EJB容器,而SSH或者SSM运行于Web容器。以体量而论,EJB是大型的,SSH/SSM是轻量级的。

五、J2EE vs Spring

如上所述,J2EE是一套标准,它对一系列接口进行了约定,然后由众多厂商围绕这个标准做实现。Spring框架就是一个开源的J2EE应用程序框架。(搞了半天,原来Spring也算是J2EE一分子)

早期的Spring定位于解决J2EE在实际使用上的一系列问题,因为J2EE的API实在是太难用了。Spring框架的发起人Rod估计是趟了不少大坑,于是总结了一套最佳实践,并总结到了一套框架里。其中最重要的,就是所谓IoC(控制反转)。

Spring大量使用或者实现了J2EE标准。比如spring-mvc是在servlet基础之上的封装;spring本身并不提供容器,而是支持使用任何支持servlet标准的容器(如tomcat,jetty等);spring-data也实现了JPA,通过标准接口对进行CRUD等。归根到底Spring只是想更好的解决实际问题。J2EE的实现做得好的就用,做得不好的,用比较恰当的方式独立实现或者封装。

随着时间的发展,J2EE已经越来越落后,这是由于它的体制造成的。J2EE的制定是由几大巨头定期开会协商通过,发布。然后由大容器实现厂商跟进。但这样太慢了。互联网的发展速度已经远不是这样一个僵化的体制能够适应的。反观Spring相对就快速的多。Spring自己就是一家公司,觉得整个社区什么东西最前沿,最急缺就立刻响应去做了。比如,Restful刚流行,你是愿意等一年半载出JAX-RS标准,然后再出Jersey,才能用;还是选择直接用Spring MVC直接就把事办了?结果不言而喻。对解决问题的态度是二者目前境遇不同的主要原因。最早期J2EE是领导者,所有的技术厂商要想在这个圈子里混,必须跟着标准走。而Spring逐渐占据领导地位之后,J2EE的一些标准反而要跟着Spring走。

J2EE_ejb_05


详见Spring

参考文章:

​关于J2EE和Spring目前到底是怎样的关系,以及未来这两者的发展是怎样的,是否存在竞争市场的情况?​

​JAVA开发与J2EE开发区别是什么?​

​图解EJB的体系结构​

J2EE基础之EJB

​Java bean 是个什么概念?​