J2EE是一个标准,包含一系列基于Java的技术规范以及相关的接口定义,能够更统一、有效的进行企业应用开发。
遵循J2EE标准的框架,是指实现了J2EE包含的技术规范和接口,能够按照J2EE规定的方式工作。
I. 客户端层组件
应用客户端程序和浏览器是客户端层组件。客户端层组件可以是基于Web方式的即作为Web服务器的浏览器,也可以是基于传统方式的(非基于Web方式)即独立的应用程序,可以完成瘦客户机无法完成的任务。
II. Web层组件
Java Servlet和JavaServer Pages(JSP)是Web层组件。如图2所示的客户层那样,Web层可能包含某些 JavaBean 对象来处理用户输入,并把输入发送给运行在业务层上的Enterprise Bean 来进行处理。按照J2EE规范,静态的HTML页面和Applets不算是Web层组件。这里的JavaBean和EJB(Enterprise JavaBean)除了共用“JavaBean”这个名字外,这两种组件模式完全没有关系。许多文章把EJB作为原始的“JavaBean”的扩展,这是错误的。EJB并没有扩展或使用JavaBean组件模式。最初的JavaBean(java.beans包)在进程内部(intraprocess)使用,而EJB(javax.ejb包)是在进程间(interprocess)使用的组件。即最初的JavaBean不是为分布式组件而设的。它是最好的组件模式,可能是至今发现的最好的过程内部开发的组件模式,但它不是一个服务器端的组件模式。EJB则能解决在三层结构中由管理分布式商务对象多带来的问题。
III. 业务层组件
Enterprise JavaBeans(EJB)是业务层组件。业务层代码的逻辑用来满足银行,零售,金融等特殊商务领域的需要,由运行在业务层上的EJB 进行处理。图3表明了一个EJB是如何从客户端程序接收数据,进行处理(如果必要的话), 并发送到企业信息系统层(EIS) 层储存的,这个过程也可以逆向进行。
有三种企业级的Bean: 会话(Session)Beans, 实体(Entity) Beans, 和 消息驱动(Message-driven) Beans。 会话Bean 表示与客户端程序的临时交互。 当客户端程序执行完后, 会话Bean 和相关数据就会消失。相反, 实体Bean 表示数据库的表中一行永久的记录。 当客户端程序中止或服务器关闭时, 就会有潜在的服务保证实体Bean 的数据得以保存。消息驱动Bean 结合了会话Bean 和 JMS的消息监听器的特性, 允许一个业务层组件异步接收JMS 消息。
IV. 企业信息系统层组件
处理企业信息系统软件包括企业基础建设系统例如企业资源计划 (ERP), 大型机事务处理, 数据库系统,和其它的遗留信息系统组成了企业信息系统层。 例如,J2EE应用组件可能为了数据库连接需要访问企业信息系统。
Web容器和EJB容器具有明显的区分——这意味着他们彼此相对独立,一个企业的Web容器和EJB容器可以是来自不同厂商的产品。
两个容器都可以享受企业服务。换句话说,Web容器内的组件和EJB容器内的组件一样可以进行数据库访问,使用电子邮件和目录服务,发送消息等。
组件只有通过以驱动程序和适配程序形式存在的企业服务才能访问EIS资源
所有的应用服务器环境都有Java虚拟机——即所有的应用服务器上都有Java运行时环境。
在项目实施过程中,一般说来,把应用组件经常需要用到的自定义服务和库单独列开来是非常有必要的。在上述模型中,这些服务被称为“自定义组件库”。
“自定义组件库”根据具体项目的需求而开发,并非是J2EE应用服务器标准的组成部分。通常这些库会随着项目的进展而趋向于越来越大。
另外一个现象也很典型,那就是开发人员在访问企业服务时,会发现总有一些核心服务是最常用到的。把这些服务列开,固化为单独的一层在实践中值得一试,这一层对应于图1中的“服务访问库”。
简而言之,“服务访问库”应该是J2EE API的一个子集,因企业项目的不同而不同。需要指出的是这里的“自定义组件库”和“服务访问库”并未见于Sun公司正式发布的J2EE应用编程模型中,但在实际开发中,这两个库的存在是必要的。
J2EE应用组件
在看过了组件和服务的关系之后,接下去我们再来对它们进行逐一考察,理解在一个复杂的企业计算方案中它们各自扮演的角色。
Web容器组件
·Java Servlet
servlet是在服务器一端,运行于Web容器内的表示逻辑组件。正如applet扩展了Web浏览器的基本功能一样,servlet扩展了Web服务器的功能——提供编程能力以及动态生成Web页的能力。
servlet的主要功能是接收来自客户端Web浏览器的HTTP请求,处理输入参数,再把结果以浏览器可以显示的HTTP方式进行回传。
例如,我们可以用servlet开发一个简单的基于Web的认证系统。该servlet接收来自客户端浏览器的用户名和口令字;处理认证请求;再将认证结果发送回去。
除了接收来自客户端浏览器的请求外,servlet之间也可以相互调用。
·Java Server Page(JSP)
虽然servlet可以产生HTTP输出,但显示处理结果的更好的办法还是使用JSP组件(Java server page,Java服务器页面)。JSP和servlet一样,也是运行在Web容器内的表示逻辑层组件,两者在功能上略有不同。
JSP结合了HTML和Java,也就是说,JSP既可以包含HTML代码也可以包含Java代码。其中HTML代码直接发送给浏览器,而Java代码则在剥离之后,留由服务器解释执行。因此JSP对于提高HTML标签的智能化非常有用。
在JSP内添加可重用的Java代码块的最好办法就是使用JSP标签库。JSP标签库开发简单,它既方便了在HTML标签内增加Java代码,又可以使得HTML代码和Java代码能很好地隔离开,易于维护。
在Web容器内,JSP常常作为servlet的补充,用于显示servlet的处理结果。此外,JSP和Javabean的结合使用也非常典型。
·Javabean
Javabean是基本的数据模型组件,早在J2EE技术出现之前就出现了。在J2EE体系结构中,Javabean常见于客户层和表示逻辑层,和applet或JSP结合使用。
bean组件构造容易, 只要为一段Java代码定义些适当的属性即可。例如,一个带有少量变量的简单Java类,再添加些为变量定义的get_attribute()和set_attribute()等方法,就是一个标准bean组件了。
除了命名上的相似外,Javabean和企业Javabean(即EJB)没有什么大的关联。EJB完全是另一种类型的企业Java应用组件。
EJB容器组件
·Enterprise Javabean(EJB)
企业Javabean或EJB是J2EE中间件中的分布式、可伸缩业务逻辑组件。在企业Java项目中,EJB组件用于封装核心业务逻辑和数据模型元素。
EJB组件的运行环境就是EJB容器,J2EE在规范中定义了应用EBJ代码和容器环境两者的关系(contract)。
在企业应用开发过程中,开发人员编写EJB时需要符合一定的接口规范。接口中定义的方法,部分由开发人员自主实现,部分由EJB容器供应商(或应用服务器开发商)提供。通过这种机制,EJB实现了业务逻辑实施(开发者编写的方法)和基础设施供应(容器提供的方法)之间的隔离。
一个EJB组件可以和另一个EJB组件进行会话,后者既可能与前者在同一容器中,也可能位于远程服务器的另一个容器中。如上图1所示,EJB组件可以使用所有的企业服务,以及自定义组件库和服务访问库。
EJB规范定义了以下四种类别的EJB,以满足不同应用场合的需要:
· 无状态会话Bean
· 状态会话Bean
· 实体Bean
· 消息驱动Bean
综上所述,J2EE各组件——EJB、servlet、JSP等等的结合,最终构成了基于MVC,具有高度灵活性和可重用性的企业应用体系。
前面已经提到过,J2EE企业服务是提供给Web容器和EJB容器的应用组件使用的。组件通过企业服务访问EIS资源。访问需求多种多样,可能简单如数据库操作,或复杂如消息传递/CICS环境下的大型机通信。
J2EE服务API为诸如数据库访问和目录访问等特定的服务提供一个标准Java接口,该接口完全隐藏具体实施细节。因此,程序员只需面对标准API,而不必和特定资源打交道,这有助于他们轻松使用各种不同的服务。
例如,从J2EE应用组件的角度来看,访问Sybase数据库和访问Oracle数据库没什么两样。所有的不同只在于需要选择不同的JDBC驱动程序和不同的数据库文件。由于几乎不需要做任何代码级修改,程序员可以毫不费力地访问各种不同的数据库。
JDBC (Java Data Base Connectivity)
与 ODBC类似,JDBC提供了一个标准、透明的数据库连接的公共编程接口,各开发商根据JDBC的标准来实现其底层的驱动程序。J2EE组件通过统一的接口访问不同种类的关系型数据库。由于应用代码独立于特定的数据库调用,因此当需要从一个数据库转到另一个数据库时,代码修改开销可以降到最低。
JNDI(Java Naming and Directory Interfaces ,Java命名/目录接口)
在分布式环境中,命名和目录服务使得资源在全网络范围内的合理分布成为可能。每个资源在分布式层次树形结构中都具有唯一的名字。客户程序通过访问目录服务获得所需资源的句柄。 JNDI为企业命名/目录服务调用制定标准,提出了一些统一的接口,由各开发商对这些接口加以实现。当前市场上目录服务产品主要有LDAP、Novell 目录服务和Active目录服务等,JNDI在这些开发商产品之上定义了一个服务层,这样,使用者就可以通过统一的界面去访问底层的各种服务。
JMS(Java Messaging Services,Java消息服务)
消息服务在异构环境下扮演着重要角色。企业大型机信息系统或其他旧有遗留系统与J2EE中间件组件这样的全异构系统之间的通信连接,就是靠在两端安装消息服务实现的。通信时,两端应用程序各自与本端的消息服务进程进行会话,网络内消息服务进程之间则通过点到点或异步方式依次传递消息。
JMSAPI 实现了消息服务产品调用的标准化,目前市场上此类产品主要有IBM的MQ series、微软的MSMQ、TIBCO的Rendezvous。JMS在这些产品各自的消息API调用之上附加定义了一层,将所有这些产品统一于一个接口。这样,J2EE应用就可以与特定的开发商产品实施保持相对独立。
Javamail/JAF(JavaBeans Activation Framework)
正如名字所示,Javamail API为J2EE组件提供e-mail服务。它位于SMTP和POP3之类特定邮件服务实施上层,为所有公共服务如电子邮件格式识别、邮件收发和判断是否有附件等,提供统一访问接口。
Javamail API与JAF(Javabean Activation Framework)同步工作。
RMI(Remote Method Invocation,远程方法调用)—IIOP/Java IDL
这两种技术实现J2EE组件和CORBA组件之间的双向通信。Java IDL是推荐使用的在J2EE环境中访问CORBA对象的方法;反之,RMI—IIOP则是在CORBA客户程序中调用J2EE组件的方法。
JAX (Java API for XML)
Java XML API方便使用者在J2EE环境中调用XML文档。JAX API提供的服务包括XML语法分析(SAX和DOM),XML与Java对象的绑定,XML消息发送和XSLT转换等。
JAX支持Web服务,方便J2EE业务逻辑组件适用于各种不同环境中。
JCA (Java连接器)
JCA 用来连接J2EE应用程序和EIS体系结构,如ERP、大型机事务处理、数据库以及其他遗留信息系统等,帮助开发者进行不同种类的EIS之间的无缝集成。 JCA连接器一方面与J2EE应用服务器建立系统级连接,另一方面与访问EIS资源的应用组件建立应用级连接。和其他服务API类似,JCA API在统一接口的同时,为开发商开发各具特色的资源适配器产品提供空间。
JTA(Java Transaction API,Java事务接口)
JTA为 J2EE 平台提供了分布式事务服务
J2EE的四种类型应用:
A.具有商务组件接口的Web应用 (最常见的web应用)
这种情况下,应用的web层和中间层运行在同一个JVM上,这种应用的关键在于区分开UI组件和商务逻辑组件的职责。商务接口层将由普通java类实现的java接口组成。
B.可访问本地EJBs的Web应用
在这种架构中,web层就是和A一样,但商务接口是由EJB层实现,两部分都运行在同一JVM之上。
C.访问远程EJBs的分布式应用
这就是被广泛接受的经典J2EE架构,它从物理上和逻辑上把EJB和web组件区分开,分别运行在不同的JVM上,它是复杂的结构,并且性能相当好。
D.使用Web Services接口的Web应用
web services的standards出现意味着J2EE应用不再要求使用RMI和EJB支持远程客户,他能够支持非-J2EE客户如微软应用。
Structs、Spring MVC都是web层的框架,是基于servlet的web层组件,需要部署到servlet服务器上运行,这两个框架都采用MVC设计模式。
而Spring Framework 是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,
参考文档:
http://blog.csdn.net/welcomejzh/article/details/4096856#t2
http://www.2cto.com/kf/201110/107130.html