EJB角色和职责
Bill:“我在公司工作,我开发了一个可重用的组件,可以卖给其他开发人员。”
EJB角色:Bean提供者
交付成果:文件(包括一个或多个和一个部署描述文件)主要职责:设计和编写企业。
换句话说,就是编写代码。特点:知道对于一个特定领域,一个特定类型的组件中应该有什么样的业务逻辑。
Annie:“我是一家大型网上书店的开发人员。我们从公司买了很多,不过除此以外,我自己也开发了一些Bean。我把买来的和自己开发的这些集成在一起,放到一个应用中去,这个应用是专门针对如何销售图书的业务规则而定制开发的。”
当心,考试会考到不同角色之间的微妙差别。对本书中提到的EJB角色要特别仔细,尤其是后面更详细地介绍部署描述文件时更要注意。考试时肯定会考哪个角色做什么工作,而且这些题目肯定会有些难度。应用组装人员和提供者在许多方面都存在重叠,另外部署人员和应用组装人员也不是泾渭分明的。对考试来说,你必须知道某个任务是哪个角色的主
要职责(通常与部署描述文件信息有关)。这些内容很是麻烦,这一页和下一页的介绍还只是个开头……
EJB角色:应用组装人员
交付成果:文件(包括一个或多个和一个部署描述文件,这个部署描述文件中不仅有提供者提供的信息,还包括应用组装信息)。还可能创建客户,或者定义与其他组件(如)之间的交互。主要职责:把一个或多个企业合并到一个更大规模的应用中。有时应用组装人员可能披着提供者的外衣,把新的和原有的集成在一起构建一个应用。定义应用的安全和事务行为。特点:绝对是领域专家。可能没有提供者编写的代码多。
Dick:“哇呜居然部署成功了。真是让人难以置信。我和应用组装人员在同一家网站书店工作,我拿到她的ejb-jar,研究其中的部署描述文件,让Bean真正在服务器上运行起来,等待客户的调用。我们的系统是怎么配置和运行的,我对此可谓了如指掌。”
EJB角色:部署人员
交付成果:针对一个特定操作环境进行定制的企业,而且已经部署到服务器上。主要职责:拿到应用组装人员交付的成果,研究中的部署描述文件,解析得出所有外部依赖关系。例如,如果依赖于一个特定资源,部署人员就必须把提供者指定的逻辑名映射为服务器上资源的实际名。要记住,写代码时并不知道这个代码最后要部署到的服务器上。必须为数据库建立一个则必须把这个自创的名字与一个真实的资源绑定起来。特点:他是特定操作领域的专家。他通晓这个系统的安全用户和角色,知道服务器上已经部署了什么东西,而且了解怎么解释提供者和应用组装人员提供的部署描述文件信息。
Carl:“我们为Server公司效力。我们最擅长的是底层服务,比如事务管理、池机制和安全。”
Sue:“由我们来完成这些棘手的服务,这样就能让你把精力集中在你的业务逻辑上。我们和IBM、BEA及Oracle可以说不相上下,总有一天我们会超越Larry Elision。”
EJB角色:容器和服务器提供者
交付成果:EJB 兼容服务器、部署工具、企业的运行时环境。主要职责:实现规范。特点:他们是分布式对象和事务以及其他底层系统服务领域的专家。
教程:
下面来建立、部署和测试AdviseBean。
我们会编写代码、进行编译、启动服务器、启动deploytool,再使用deploytool建立部署描述文件和ejb-jar,部署bean,创建一个客户,然后使用这个客户来测试前面部署的bean。我们惟一没有做的事情只是安装和配置服务器。这里假设你已经完成了服务器的安装和配置。如果你还没有把J2EE启动和运行起来,请访问java.sun.com/j2ee/,,下载J2EE的1.3版本,(其中包括安装说明),然后再回到java.sun.com/j2ee/,下载J2EE API 文档。
为什么我们要使用?为什么不能使用一个真正的应用服务器呢?
我要使用哪个服务器呢?在学习和实践中我们采用的是,因为对于你要使用哪一个服务器我们一无所知,而且是所有能免费得到的服务器中最简单的一个。我们希望服务器尽可能地容易,这样你就能把精力集中在技术上,而不是过多地考虑特定工具完成的任务。有一些开源产品(如)同时也是真正的成品服务器,所以如果采用这样一个服务器,需要处理的配置和管理任务就会多得多。使用的话,你就能把更多的时间用在你必须做的工作上,而不论服务器是什么,同时,只需花最少的时间来学习服务器是用什么方法来完成这些工作的。
要记住,这个考试是面向J2EE1.3而不是的不管你想怎么做,有一点绝对要避免,这就是千万不要使用规范来为考试做准备。那么为什么考试使用的是版条是呢?这个原因在引子中已经做过详细解释,简单地说可以总结为:如果一个人掌握的技术几乎没有人使用,这可不是我们想要认证的东西。认证不是说技术最新、最好的版…意义在于这项技术。这个技术我已经使用至少6个月了”。
考试中不会涉及有关J2EE RI的内容。也不会考有关其他应用服务器的内容。你不需要了解开发商提供的任何用开发或部署的工具(包括SUN提供的此类工具)。你要知道的只是每一个SJB兼容服务器都应该有的功能,而开发商特有的特性或配置细节你无需了解。
组织工程目录:
本书中所有的Bean都组在包里面,这说明在编译和运行中必须更仔细一些。这一章中我们给出了许多指令,每个指令都假设你的工程是按以下所示的方式来组织的。如果你没有采用这个结构,就必须根据你自己的目录结构对我们提供的命令和部署步骤自行调整。
整本书中就一个Project目录。书中的每个工程都有自己的工程组织 shopping advice 一个目录。这个目录对应的是advice工程。每个工程都有一个目录(放置源文件)和一个目录(存classes src classes src放字节码文件)。包目录结构从这里开始。大多数工程类都放在”说明这些类必须放在一个名为headfirst的目录中。
编译两个接口和Bean类:
到目前为止,我们已经编写了两个接口和一个Bean类,但是除此以外还需要对它们进行编译。在此之后,我们会建立ejb-jar(其中包括的是类文件,而不是源文件)。
我们使用了-d 编译标志,这样上面的命令行就表示“编译headfirst目录中所有的.java文件,编译后的.class文件放到classes目录里,从当前目录(src)向上一级就能找到classes这个目录。哦,对了,差点忘了,一定要把类放在正确的包目录中。在classes目录中查找包结构,这说明你应该能找到一个名为headfirst的目录,类文件就要放在这里……如果你在classes目录中没有找到headfirst目录,那么请为我建立这样一个目录,好吗?谢谢。”
启动服务器
为服务器打开一个新终端。让服务器一直运行着,我们希望服务器运行过程中能看到输出,所以不要用这个终端做其他的事情。设置目录为advice你的工作目录。
你会看到下面的输出
-verbose标志会在终端上打印一堆东西出来(这个标志并不是必要的,不过我们很喜欢用它)。
启动deploytool
为deploytool打开一个新终端。这个工具是J2EE的一RI部分,它提供了创建ejb-jar和部署描述文件所需的所有功能,并能完成最后的部署,即把部署到服务器上。
你会看到下面的输出
会弹出一个可爱的启动界面,应用加载时它会一直留在屏幕上。如果点击这个启动界面,它就会消失,所以如果看上去什么都没有发生,你也不要惊慌。耐心一点。
建立一个新应用
要记住,RI是一个服务器,它不只是一个EJB容器。所以在建立和部署应用之前,还需要做一些有关的工作。我们要在这一步创建一个新的J2EE应用,对现在来说,可以这样来看J2EE应用:它把Bean包起来,并为服务器稍微增加了一些信息。J2EE应用和EJB应用之间的主要差别在于,J2EE应用除了可以包括组件外还可以包括EJB组件(servlei和JSP),所有这些都可以作为一部分集成在一个应用中。
问:这是不是意味着,如果我想同时使用servlet和EJB,就必须有一个J2EE服务器?
答:并非如此。利用J2EE服务器的话,WEB组件和EJB组件
会集成得更紧密,这说明,所有组件都能考虑到彼此的事务和安全性。不过,你也完全可以用一个servlet作为企业bean的客户,即使这个bean不在同一个应用服务器上运行(甚至不在同一个物理主机上)也不碍事。J2EE服务器还有一个好处,这就是可以很容易地把两种组件(WEB组件和J2EE组件)都部署为一个企业应用的一部分。说了这么多,还需要知道,如果你在构建EJB2.0应用,极有可能是在J2EE服务器上运行这些应用。要记住,如今很少有独立的容器。几乎所有主要开发商都在一个J2EE服务器中运行自己的EJB容器。
J2EE服务器开发商必须通过大量的兼容性测试,才能称这个服务器是“J2EE兼容的”如,J2EE2.0服务器必须包括一个EJB2.0容器,而且这个EJB2.0容器必须实现规范。
给新应用取名并保存
这部分有点麻烦。可以使用浏览按钮在你自己的目录树中导航,不过,要给应用取名并保存起来,最容易的办法是键入你要创建的文件的完整路径。我们要建立的不是bean本身,更像是一个文档,其中包含了有关应用的所有信息。在这里有一个约定,我们会在对应于这个特定工程的project/某目录下保存应用。对于advice bean,这意味着要把应用保存在projects/advice目录中。如果从projects/advice目录启动服务器(换句话说,如果advice正是你的当前工作目录),就能默认地得到正确的名字和位置。
把应用取名为AdviceApp如果需要,要包括projects/advice/AdviceApp的完整路径点击 OK
创建应用并对应用命名之后看到的输出
现在,再回到dploytool的主界面。可能必须点击Files或Applications图标将其扩展,不过你会看到,工具已经创建了一个Applications目录,其中有一个名为AdviceApp的目录。点击AdviceApp图标,你会看到有关这个应用的信息,包括应用名、位置和当前内容。此时,除了一个目录外,这个应用中没有别的东西,目录保存了有关应用的更多信息,不过我们一般不需要了解这些额外的信息。
下面来建立新的企业bean(ejb-jar和部署文件)
这是我们真正要做的建立具体的。前面的各个步骤(建立J2EE应用)只是为了满足J2EE RI的要求,因为我们必须在一J2EE个应用中部署bean。
下面看到的是一个非常棒的NewEnterprise Bean(新建企业bean)向导工具
所有工作几乎都在deploytool的这一步完成!我们要做的几个关键事情是创建ejb-jar把bean类和两个接口放到ejb-jar中创建描述这个bean的部署描述文件
创建一个新的ejb-jar
现在,只需接受向导给出的默认选项就可以了。界面左上部的单选按钮显示出,你正在AdviceAPP应用中建立一个新JAR。需要注意AdviceAPP是一个下拉列表的一部分,如果应用中还有其他的ejb-jar,那么还可以选择把这个新bean放在某个已有的jar中。部署工具会选择一个很有帮助的显示名EJB
把三个类文件(包括其包目录)增加到JAR中
这是整个过程中最重要的部分!换句话说,千万别搞错了。关键是要把正确的类放到JAR中的包目录结构中,而且只能放在其包目录结构中。也就是说,如果把这三个类文件放到了没有headfirst目录的JAR中,你的bean将无法部署。或者,如果除了headfirst目录还包括了classes目录,你的bean也无法部署。要记住,ejb-jar还是一个jar文件,所以一般的有关包结构的JAR规则在此也适用。
确认只增加了包目录和类文件
这一步要做对。请看下面标题为“Contents of Ejb
确保类(和包目录)是正确的如果并非如此,从下面的窗口选择类和包目录,点击删除,再重新选择完成后点击OK,再点击 NEXT。
让它成为一个无状态会话bean
下面,要向工具提供bean的“结构”信息了。这是一种什么类型的bean,哪个类文件是它的HOME接口,等等。要记住,工具会使用这些信息来创建部署描述文件。而且EJB容器要使用部署描述文件来得出如何部署和管理这个bean。AdviceBean很简单,客户调用远程对象的一个方法,远程对象返回一个值,然后远程对象会忘记刚才发生的所有事情。故事到此为止。这种情况非常适合采用无状态会话bean解决方案。如果 需要记住它向客户给出的建议,这个客户以后再调用这个bean时,它要使用以前记住的这一信息,那就应该把这个建为一个有状态会话。不过既然不需要记住以前给的建议,所以我们不会让它作为有状态会话bean。随后你会了解到,让Advice Bean作为一个实体bean或消息驱动bean是没有意义的。不过,现在让它作为其他类型的bean(而不是会话bean)也为时过晚了,要知道,你的bean类实现的是SessionBean接口,所以实际上已经确定了bean的类型。不过,这个会话baen到底是有状态的还是无状态的,这一点确定起来可能有些难度。现在我们的做法是把它置为无状态的。