循速渐进学用Session Bean(二)
副标题#e#
设置Bean
Enterprise JavaBean令人不太习惯的处所是你并不运行它,而是设置它。按照所利用的容器,用一个打包东西来建设一个JAR文件,内里包括EJB类,XML设置描写文件和helper类。
不外要真正领略EJB,最好本身实验一下。
每个EJB厂家都支持本身的设置东西。固然某些东西或者更好用,不外大部门都是利用一样的模式。本文中将利用Sun的Java 2 Enterprise Edition SDK(J2EE SDK)将bean打包并设置它。J2EE SDK设置东西叫deploytool,在SDK的bin目次中。
启动deploytool后,在文件菜单中选择New Application。在New Application对话框中,输入你想建设的EAR(Enterprise Archive)文件的名字(EAR文件是一个J2EE应用的JAR文件)。图6.1展示了Hello World session bean的对话框信息。
**************图6.1****************
然后在文件菜单中选择New Enterprise Bean。需要的话,可以修改JAR文件的显示名字。
在New Enterprise Bean领导中,按右下角的Add按钮(在内容区域四周)。将显示一个如图6.2所示的对话框,在对话框中选择组成EJB的class文件,选择HelloWorldSession.class, HelloWorldSessionHome.class和HelloWorldSessionImpl. class文件,点击Add按钮。
**************图6.2****************
接着,要汇报deploytool Enterprise Bean class、Home interface和Remote interface利用的类。可以配置bean的显示名字,该名字只在deploytool中利用,还必需汇报该东西设计的bean是session bean照旧entity bean,假如是一个session bean,那它是无状态的照旧有状态的。图6.3显示了Hello World bean的设置项目。
**************图6.3****************
#p#副标题#e#
指定实现EJB各个成果的类
由于Hello World的例子只是一个简朴的session bean,它没有任何其它的设置要求,因此你可以按Next,然后按Finish。此刻已经做好了设置bean的筹备事情。
在设置前,必需确定EJB处事器正在运行。还大概需要汇报deploytool利用哪一种处事器,这个配置可以通过Server菜单选项中选择Add举办。在处事器运行后,从Tools菜单上选择Deploy Application。将显示一个雷同图6.4中的对话框。
**************图6.4****************
在设置EAR文件可能JAR文件时,凡是还会获得一些特另外类,这些类在处事器处理惩罚bean的会见时需要用到。如BEA的WebLogic处事器,在建设JAR文件时,就会发生这些类。对付J2EE SDK来说,在设置JAR文件时就获得了这些类。很多EJB处事器还会发生一个客户端的JAR文件,它包括有客户端会见EJB时需要用到的类。不外并不是所有的处事器都需要发生一个客户端的JAR文件。譬喻WebLogic可以在运行时动态地载入重要的类,所以无需要一个出格的JAR文件。不外J2EE SDK需要一个客户端的JAR文件,需要汇报deploytool发生一个客户端的JAR文件。在这个例子中,客户端JAR文件的文字是helloClient.jar。
最后,要汇报EJB利用什么JNDI名字。在一些处事器中,可以配置在JAR文件中。J2EE SDK在设置时才会要求提供该名字,这样就可以用差异的名字设置沟通的bean到差异的处事器中。图6.5显示了答允配置bean名字的对话框。
**************图6.5****************
建设客户会见Session Bean
在实现和设置session bean,有人认为写一个客户端措施也长短常贫苦的,事实并不是这样,利用Enterprise JavaBean写一个客户措施是很简朴的。
利用EJB时,只需要获得EJB Home接口的一个引用。在获得Home接口的引用后,就可以通过个中的create要领来建设一个bean实例,然后挪用bean的Remote接口的要领。
虽然,首先做的第一件工作是获得JNDI naming context的一个引用,它是定名系统的一个接口,通过利用定名系统来找到EJB和其它工具。要获得naming context的一个引用,最简朴的要领是建设一个InitialContext工具,如下:
Context namingContext = new InitialContext();
按照利用的应用处事器,在运行客户端时, 大概需要提供一个带有特别信息的属性工具可能界说一个系统属性工具。需要特别信息的原因是JNDI API(Java Naming API)提供定名系统的一个接口,可是它本身没有提供定名处事。假如运行的是WebLogic,利用的就是WebLogic naming处事。同样,假如运行的是JRun,利用的就是JRun naming处事。JNDI利用context factory来建设Context工具,但需要汇报它的是利用哪个类作为context factory。
假如运行的是WebLogic,这个context factory就被称为weblogic.jndi.WLInitialContextFactory;譬喻:
java -Dnaming.factory.initial=weblogic.jndi.WLInitialContextFactory
还可以通过属性工具来指定context factory,如下:
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
Context context = new InitialContext(p);
#p#分页标题#e#
属性工具的长处是不需要在呼吁行做特另外指定。缺点是代码仅可以在WebLogic处事器下事情。固然大概只利用一个厂家的处事,可是在大概的环境下,将与特定厂家相关的信息从源代码中疏散出来是一个很好的主意。
此刻已经拥有了naming context,这样就可以利用lookup要领来找到需要的EJB。譬喻,假如利用“HelloWorld”的JNDI名字来设置HelloWorldSession bean,以下的代码可以找到该bean的Home接口:
HelloWorldSessionHome home = (HelloWorldSessionHome)
PortableRemoteObject.narrow(
context.lookup("HelloWorld"),
HelloWorldSessionHome.class);
利用EJB的时候,不能通过尺度的Java强制转换操纵符来转换长途的引用。必需利用PortableRemoteObject.narrow。EJB利用一个称为RMI-IIOP的非凡形式RMI,需要这个非凡的语法来作转换。
必需要记着的是无需找到EJB的Remote接口,只需要Home接口;然后就可以利用Home接口的create和find要领来获得Remote接口。
列表6.4显示了一个完整的客户端措施。
Listing 6.4 Source Code for TestHello.java
package usingj2ee.hello;
import java.util.*;
import javax.naming.*;
import javax.rmi.*;
public class TestHello
{
public static void main(String[] args)
{
try
{
/** Creates a JNDI naming context for location objects */
Context context = new InitialContext();
/** Asks the context to locate an object named "HelloWorld" and expects the
object to implement the HelloWorldSessionHome interface */
HelloWorldSessionHome home = (HelloWorldSessionHome)
PortableRemoteObject.narrow(
context.lookup("HelloWorld"),
HelloWorldSessionHome.class
);
/** Asks the Home interface to create a new session bean */
HelloWorldSession session = (HelloWorldSession) home.create();
System.out.println("The default greeting is: "+
session.getGreeting());
session.setGreeting("Howdy!");
System.out.println("The greeting is now: "+session.getGreeting());
/** Destroy this session */
session.remove();
/** Now create a session with a different greeting */
session = (HelloWorldSession) home.create("Guten Tag!");
System.out.println("Created a new session with a greeting of: "+
session.getGreeting());
/** Destroy this session */
session.remove();
}
catch (Exception exc)
{
exc.printStackTrace();
}
}
}
图6.6显示了TestHello 措施的输出。
**************图6.6****************
TestHello类测试了HelloWorldSession bean的成果