📄 3.html
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="description" content="Java,JDBC,EJB,Open Source,jdk,rmi">
<meta name="Keywords"
content="Java, servlets, Java servlet, Javascript, ActiveX, VRML,
applet, applets, directory, news, jdbc, applications,
Java applications, Java developer, Java development, developer,
classes, Jars.com, Jars, intranet, Java applet, Javabeans,
Java products, JDK, Java development kit, java development environment, JIT,
JavaPlan, enterprise tools, JVM, Java Virtual Machine, Java resources,
SUN, CGI, Perl, database, network, html,
xml, dhtml, rating, ratings, review, jars, cgi, programming,
software review, software rating">
<title>csdn_编写Enterprise bean的客户端(下)</title>
<style>
.news { BACKGROUND: #007cd3; font-family: "宋体"; font-size: 9pt }
.t { font-family: "宋体"; font-size: 9pt }
.t1 { color:#007cd3; font-family: "宋体"; font-size: 9pt }
.white { font-family: "宋体"; font-size: 9pt;color:#FFFFFF }
.red { font-family: "宋体"; font-size: 9pt;color:#FF0000 }
A:visited {color:#0000FF}
A:hover {color: #ff6666; text-decoration: none}
.text {font-size: 12px; line-height: 160%; font-family: "宋体"}
.text1 {color:#000000; font-size: 12px; line-height: 130%; font-family: "宋体"; text-decoration: none}
.text1:visited {color:#000000}
.text1:hover {color: #000000}
.text2 {color:#000000; font-size: 12px; line-height: 130%; font-family: "宋体"; text-decoration: none}
.text2:visited {color:#000000}
.text2:hover {color: #000000}
.text3 {font-size: 12px; line-height: 100%; font-family: "宋体"; text-decoration: none}
.large {font-size: 14.8px; line-height: 130%}
</style>
</head>
<body
<tr>
<td WIDTH="100%" VALIGN="TOP">
<tr>
<td WIDTH="100%" CLASS="white"></td>
</tr>
<tr>
<td WIDTH="50%" bordercolor="#FFFFFF" CLASS="t1" bgcolor="#F0F0F0" align="center" nowrap>编写Enterprise bean的客户端(下)</td>
<p> <td WIDTH="50%" bordercolor="#FFFFFF" CLASS="t1" bgcolor="#F0F0F0" align="center" nowrap>作者:ilamei</td> </p>
</tr>
<tr>
<td WIDTH="100%" bordercolor="#FFFFFF" CLASS="t" bgcolor="#F0F0F0" colspan="2">
<p>使用bean的句柄:</p>
<p> 句柄是用来引用enterprise bean的另一种方法。句柄相当于bean的一个较长的指针。你可以从remote接口获得句柄。一旦你拥有了句柄,就可以将它写入到文件或其它的持久存贮器里面。便于以后可以重新得到句柄,用它来重新建立enterprise
bean的引用。</p>
<p> 但是,你只能用remote接口的句柄来重新建立bean的引用。你不能用句柄来创建bean本身。如果另一个进程删除了bean,或者系统崩溃或关闭,删除了bean的实例,则当应用程序试图用句柄重新建立对bean的引用时会抛出异常。</p>
<p> 当你不确定bean的实例是否依然存在的时候,你可以不用remote接口的句柄。而是保存bean的home接口的句柄,在以后要用的时候再通过调用create方法或finder方法重新创建bean对象。</p>
<p> 在客户创建了bean的实例以后,就能够用getHandle()方法来获得实例的句柄。一旦拥有的句柄,就能够将它写到文件里面去。在以后的时间,客户可以读这个文件,将读出来的对象转化为句柄类型。然后,就可以在句柄上调用的getEJBObject方法来获得bean的引用。最后再将getEJBObject方法返回的值转化为合适的类型。</p>
<p>使用句柄来引用一个Bean</p>
<p>Import java.io;</p>
<p>Import javax.ejb.Handle;</p>
<p>……</p>
<p>Cart cart;</p>
<p>……</p>
<p>cart = home.create(cartHolderName,creditcartNumber,expirationDate);</p>
<p>//在cart对象上调用getHander方法来获得它的句柄。</p>
<p>CartHander=cart.getHandler();</p>
<p>//将hander写到文件中去。</p>
<p>FileOutputStream f = new FileOutputStream(“carthandle.ser”);</p>
<p>ObjectOutputStream o = new ObjectOutputStream(f);</p>
<p>o.writeObject(myHandle);</p>
<p>o.flush();</p>
<p>o.close();</p>
<p>……</p>
<p>//在以后的某个时间,可以从文件中读出handle</p>
<p>FileInputStream fi = new FileInputStream(“carthandle.ser”);</p>
<p>ObjectInputSteam oi = new ObjectInputStream(fi);</p>
<p>//从文件中读出对象并将它转化为Hander类型。</p>
<p>CartHanle = (Handle)oi.readObject();</p>
<p>Oi.close;</p>
<p>……</p>
<p>//使用handle来引用bean的实例</p>
<p>try{</p>
<p>Object ref = context.lookup(“cart”);</p>
<p>Cart cart1 = (Cart)javax.rmi.PortableRemoteObject.narrow(ref,Cart.class);</p>
<p>……</p>
<p>}catch(RemoteException e){</p>
<p>……</p>
<p>}</p>
<p>……</p>
<p> 当用完会话bean的句柄以后,客户将使用javax.ejb.EJBHome.remove(Handle
handle)方法来删除句柄。</p>
<p><br>
二、管理事务:</p>
<p> 客户程序能够管理它自己的事务,而不是让enterprise
bean或者是容器来管理。客户管理自己事务的时,就好象会话bean管理它自己的事务一样。</p>
<p> 当客户管理自己的事务的时候,需要自己来描述事务的分界线。这也就是说,它必须明确的开始一个事务和终止(提交或回滚)一个事务。</p>
<p> 客户使用javax.transaction.UserTransaction接口来管理它自己的事务。它必须首先用JNDI来获得UserTransaction接口的引用。一旦有了UserTranscation的上下文,就可以用UserTransaction.begin()方法来开始一个事务(后面用UserTranscation.commit()方法提交或Usertransction.rollback()方法回滚这个事务)。这之间客户做有关的查询和更新操作。</p>
<p> 如下代码演示了客户如何实现管理它自己的事务。客户管理的属于协议的那部分用粗体显示:</p>
<p>客户管理事务:</p>
<p>import javax.naming.initialContext;</p>
<p>import javax.transcation.UserTransaction;</p>
<p>……</p>
<p>public class clientTransaction{</p>
<p>public static void main(String[] argv){</p>
<p>UserTranscation ut=null;</p>
<p>InitialContext initContext = new InitialContext();</p>
<p>……</p>
<p>ut = (UserTransaction)initContext.lookup(“java:comp/UserTranscation”);</p>
<p>//开始一个事务</p>
<p>ut.begin();</p>
<p>//做事务工作。</p>
<p>……</p>
<p>ut.commit(); //or ut.rollback();</p>
<p>}</p>
<p>}</p>
<p><br>
三、获得enterprise bean的信息:</p>
<p> enterprise bean的信息是一个指向metadata引用。客户使用enterprise
bean的home接口的getMetaData()方法能够获得bean的metadata信息。</p>
<p> GetMetaData()方法经常被开发环境和build工具所使用,因为它们需要知道enterprise
bean的相关信息,例如哪些链接到一起的bean已经被安装。脚本客户也需要获得bean的metadata信息。</p>
<p> 一旦客户重新得到home接口的引用。就能够在home接口上调用getEJBMetaData()方法。然后,客户就可以通过调用EJBMetaData接口上的方法来取得如下信息。</p>
<p> 用EJBMetaData.getEJBHome()方法获得bean的EJBHome接口。</p>
<p><br>
用EJBMetaData.getHomeInterfaecClass()方法来获得home接口类的对象。包括其接口,类,域和方法。</p>
<p><br>
用EJBMetaData.getRemoteInterfaceClass()方法来获得remote接口类的对象。包括所有的类信息。</p>
<p> 用EJBMetaData.getPrimaryKeyClass()方法来获得bean的主键类对象。</p>
<p> 不管是会话bean还是实体bean。可用EJBMetaData.isSession()方法来判断。</p>
<p> 用EJBMetaData.isStatelessSession()来判断会话bean是否有状态还是无状态的。</p>
<p><br>
四、JNDI的支持:</p>
<p> EJB规范定义了定位home接口的API。JNDI是在其它的服务(CORBA的命名服务,LDAP/X.500,flat
files,目录服务)上面实现的。下图解释了不同的实现选择。典型的,EJB服务提供者选择一个特定的JNDI实现。</p>
<p> </p>
<p><br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -