J2EE的客户端
王晓强(forff@sina.com)
2001年12月
这篇文章试图从J2EE客户端的角度出发来介绍J2EE体系。将介绍J2EE的客户端如何对EJB进行访问。J2EE的客户端分类。最后重点分析J2EE中两种相似的客户端Stand
aloneClient与J2EEApplicationClient。并会给出针对同一个StatelessSessionBean的这两种不同客户端的实现实例来具体说明它们的异同。
本文的所有实例都基于SUN的J2EESDK进行发布。附录中也会对SUN的这个非常方便我们学习J2EE的开发工具集进行介绍。
J2EE客户端简介
J2EE的客户端,简单的说就是所有针对EJB而言都处于客户调用逻辑的组件与程序。因为J2EE结构的复杂性,J2EE客户端也比较多,一般分为以下五种。Stand
AloneClient,J2EEApplicationClient,JSP,Servlets,其它EntERPriseJavaBeans(处于客户逻辑的EJB)。
这其中,大家对JSP与Servlets可能是比较熟悉的,因为现在基于J2EE的应用开发大部分是Broswer/Server模式,所以它们也是最常用的J2EE的客户端。而EJB本身起到客户端作用,我们也会经常碰到,比如在Session
Bean中调用EntityBean中的商业方法,那么SessionBean就是这个EntityBean的客户端。
谈到J2EE就不能不提到EJB。EJB是J2EE结构的核心,我们在它里面实现商业逻辑,而由实现J2EE结构的服务平台提供商为我们提供J2EE
Server、EJBContainer、WebContainer,从而为我们提供诸如安全控制、事务处理、客户连接、以及数据库访问这些服务。这样通过对整个体系划分出不同的角色(如应用开发者,J2EE服务器提供商等等),让我们这些开发者可以专心于商业逻辑的实现,并能最大限度的实现代码的可复用性。
在EJB1.1规范中有两种EJB,一种是SessionBean另一种是EntityBean。这两种EJB也是我们最常用到的。不论是Session
Bean还是EntityBean它们在实现上都是由三部分组成。首先是RemoteHomeInterface,在这个远程接口中定义的是可由客户端调用的创建、查找(对Entity
Bean而言)EJB的方法。然后是RemoteInterface,这个远程接口中定义的是可供客户端访问的商业方法。最后是BeanClass,这个类对客户端而言是不可访问的,在这个类中我们要具体实现相应的商业方法,以及一些供EJB
Container调用的方法。对SessionBean与EntityBean,以及对EntityBean中的bmp模式以及cmp模式而言,这个类会有很大的不同。但这不是这篇文章要重点介绍的,你只要记住对J2EE的客户端,能看到的只是Remote
Interface与RemoteHomeInterface这两个接口而已。下面让我们看看客户端是如何具体完成对EJB的访问的。
客户端如何访问EJB
不论是那种J2EE的客户端,它要调用一个EJB的相应商业方法都要经过以下这三步:
1、通过JNDI定位EJB的RemoteHomeInterface
创建JNDI名称环境,通过在发布时你给EJB定义的JNDI名称找到该EJB的RemoteHomeInterface。
2、创建EJB的实例,得到RemoteInterface
调用上一步得到的RemoteHomeInterface中的create()方法,EJBContainer会创建相应EJB的实例。而你得到的就是一个定义了EJB要实现的商业方法的Remote
Interface。(EJBContainer创建EJB实例的基本过程如下:客户端调用create()方法-'EJBContainer实例化相应的EJB
BeanClass'EJBContainer调用BeanClass中的ejbCreate方法'最后返回给我们的是EJB的Remote
Interface)
3、调用RemoteInterface中的商业方法
客户端调用上一步创建的RemoteInterface中的商业方法,EJBContainer就会调用相应BeanClass实例中的相应方法。
下面让我们通过具体的代码来说明这个过程。首先我们先来创建一个StatelessSessionBean。这个SessionBean实现的功能很简单,在其中的商业方法只有一个sayHello方法,打印一句"Hello