无忧公告:  建站无忧一号群开放:群号:46305815 一起讨论建站时所遇到的问题。   
内容搜索: 标题内容作者
背景: #EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  
阅读新闻

编写Enterprise bean的客户端(二)

[日期:2008-01-17] 来源:互联网  作者:无忧站长整理 [字体: ]

使用bean的句柄:

  句柄是用来引用enterprise bean的另一种方法。句柄相当于bean的一个较长的指针。你可以从remote接口获得句柄。一旦你拥有了句柄,就可以将它写入到文件或其它的持久存贮器里面。便于以后可以重新得到句柄,用它来重新建立enterprise bean的引用。

  但是,你只能用remote接口的句柄来重新建立bean的引用。你不能用句柄来创建bean本身。如果另一个进程删除了bean,或者系统崩溃或关闭,删除了bean的实例,则当应用程序试图用句柄重新建立对bean的引用时会抛出异常。

  当你不确定bean的实例是否依然存在的时候,你可以不用remote接口的句柄。而是保存bean的home接口的句柄,在以后要用的时候再通过调用create方法或finder方法重新创建bean对象。

  在客户创建了bean的实例以后,就能够用getHandle()方法来获得实例的句柄。一旦拥有的句柄,就能够将它写到文件里面去。在以后的时间,客户可以读这个文件,将读出来的对象转化为句柄类型。然后,就可以在句柄上调用的getEJBObject方法来获得bean的引用。最后再将getEJBObject方法返回的值转化为合适的类型。

使用句柄来引用一个Bean

Import java.io;

Import javax.ejb.Handle;

……

Cart cart;

……

cart = home.create(cartHolderName,creditcartNumber,expirationDate);

//在cart对象上调用getHander方法来获得它的句柄。

CartHander=cart.getHandler();

//将hander写到文件中去。

FileOutputStream f = new FileOutputStream(“carthandle.ser”);

ObjectOutputStream o = new ObjectOutputStream(f);

o.writeObject(myHandle);

o.flush();

o.close();

……

//在以后的某个时间,可以从文件中读出handle

FileInputStream fi = new FileInputStream(“carthandle.ser”);

ObjectInputSteam oi = new ObjectInputStream(fi);

//从文件中读出对象并将它转化为Hander类型。

CartHanle = (Handle)oi.readObject();

Oi.close;

……

//使用handle来引用bean的实例

try{

Object ref = context.lookup(“cart”);

Cart cart1 = (Cart)javax.rmi.PortableRemoteObject.narrow(ref,Cart.class);

……

}catch(RemoteException e){

……

}

……

  当用完会话bean的句柄以后,客户将使用javax.ejb.EJBHome.remove(Handle handle)方法来删除句柄。


二、管理事务:

  客户程序能够管理它自己的事务,而不是让enterprise bean或者是容器来管理。客户管理自己事务的时,就好象会话bean管理它自己的事务一样。

  当客户管理自己的事务的时候,需要自己来描述事务的分界线。这也就是说,它必须明确的开始一个事务和终止(提交或回滚)一个事务。

  客户使用javax.transaction.UserTransaction接口来管理它自己的事务。它必须首先用JNDI来获得UserTransaction接口的引用。一旦有了UserTranscation的上下文,就可以用UserTransaction.begin()方法来开始一个事务(后面用UserTranscation.commit()方法提交或Usertransction.rollback()方法回滚这个事务)。这之间客户做有关的查询和更新操作。

  如下代码演示了客户如何实现管理它自己的事务。客户管理的属于协议的那部分用粗体显示:

客户管理事务:

import javax.naming.initialContext;

import javax.transcation.UserTransaction;

……

public class clientTransaction{

public static void main(String[] argv){

UserTranscation ut=null;

InitialContext initContext = new InitialContext();

……

ut = (UserTransaction)initContext.lookup(“java:comp/UserTranscation”);

//开始一个事务

ut.begin();

//做事务工作。

……

ut.commit(); //or ut.rollback();

}

}


三、获得enterprise bean的信息:

  enterprise bean的信息是一个指向metadata引用。客户使用enterprise bean的home接口的getMetaData()方法能够获得bean的metadata信息。

  GetMetaData()方法经常被开发环境和build工具所使用,因为它们需要知道enterprise bean的相关信息,例如哪些链接到一起的bean已经被安装。脚本客户也需要获得bean的metadata信息。

  一旦客户重新得到home接口的引用。就能够在home接口上调用getEJBMetaData()方法。然后,客户就可以通过调用EJBMetaData接口上的方法来取得如下信息。

  用EJBMetaData.getEJBHome()方法获得bean的EJBHome接口。


  用EJBMetaData.getHomeInterfaecClass()方法来获得home接口类的对象。包括其接口,类,域和方法。


  用EJBMetaData.getRemoteInterfaceClass()方法来获得remote接口类的对象。包括所有的类信息。

  用EJBMetaData.getPrimaryKeyClass()方法来获得bean的主键类对象。

  不管是会话bean还是实体bean。可用EJBMetaData.isSession()方法来判断。

  用EJBMetaData.isStatelessSession()来判断会话bean是否有状态还是无状态的。


四、JNDI的支持:

  EJB规范定义了定位home接口的API。JNDI是在其它的服务(CORBA的命名服务,LDAP/X.500,flat files,目录服务)上面实现的。下图解释了不同的实现选择。典型的,EJB服务提供者选择一个特定的JNDI实现。

 


  这个技术实现了JNDI底层的与客户无关性。客户只需要使用JNDI的API就可以了。


五、EJB到CORBA的映射:

  EJB和CORBA之间有许多的联系。有三点很重要:

  用ORB实现EJB容器/服务。


  将原有系统放到EJB中间层的综合能力。


  从非java组件的客户,访问EJB的能力。


  EJB规范目前只涉及到这三个方面。

12下一页  GO
阅读:
录入:无忧

推荐 】 【 打印
相关新闻       jsp 
本文评论       全部评论
发表评论


点评: 字数
姓名:

  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款