Oracle8i中EJB组件的开发和使用EnterpriseJavaBeans(EJB)是由SUN公司所推出的开发分布式组件的一个标准,Oracle8i不仅支持在数据库中开发CORBA组件,而且也支持开发EJB组件。本篇文章将详细介绍这方面的知识,具体内容如下:EJB组件简介;手工开发EJB应用;使用JDeveloper开发EJB应用。比较CORBA与EJB组件EnterpriseJavaBeans(EJB)是一种基于分布式计算组件的事务体系。当使用EJB进行开发时,组件开发人员和客户应用程序员将无需关心事务支持、安全性、远程对象访问等细节问题。1.EJB是基于Java语言的组件模型,所以开发人员只能使用Java语言来开发EJB组件;而编写CORBA组件不仅需要掌握编程语言(JAVA、C、COBOL),而且还需要掌握IDL语言。2.CORBA使用IIOP作为传输协议,而EJB则是基于RMI(RemoteMethodInvocationinterface)开发的一种概念。但SUN公司没有规定要使用RMI协议,所以Oracle8i仍是通过IIOP协议来实现EJB组件。EJB组件的组成元素1.宿主接口(BeanHomeInterface)宿主接口指定了一或多个create()方法,该方法既可带有参数,也可以没有任何参数。对于宿主接口中的每个create()方法,必须在远程接口中指定一个相应的ejbCreate()方法。二者的唯一不同是create()方法返回组件类型,而ejbCreate()方法返回为空(void)。2.远程接口(BeanRemoteInterface)远程接口用于说明组件所要实现的企业规则,并且客户要访问的方法必须在远程接口中存在。远程接口类必须是公用的(public),并且必须是javax.ejb.EJBObject的子类。3.组件(Bean)组件用于实现远程接口中所声明的方法,客户应用正是通过调用组件方法来访问组件的。4.配置说明(deploymentdescriptor)配置说明用于说明EJB组件的属性,包括指定宿主接口、远程接口、组件实现类名、组件JNDI名、事务、安全等属性。开发EJB组件的方法1.编写宿主接口(HomeInterface)程序当客户要访问EJB组件时,必须创建组件实例,这是通过宿主接口来完成的,编写宿主接口程序的方法如下:2.编写远程接口(RemoteInterface)程序远程接口用于声明组件所要实现的方法,编写远程接口程序的方法如下:3.编写组件(JavaBeans)程序组件用于实现远程接口中所声明的方法,编写组件程序的方法如下:4.编写配置说明(DeploymentDescriptor)配置说明用于指定组件的属性,编写配置说明的方法如下:5.编译/打包EJB在编写了远程接口、宿主接口以及组件程序之后,首先编译这些程序,然后将所生成的二进制文件(.class)打包。如下所示:6.配置并发行EJB在打包了组件程序之后,就可以将其装载到Oracle8i数据库,并发行该组件了。如下所示:当开发了EJB组件之后,客户应用就可以访问该组件了。如下图所示:实现EJB服务器组件下面以创建在表AUTHS上执行查询、插入、更新、删除操作的EJB组件为例,介绍开发EJB组件的方法。如下图所示:具体步骤如下:1.编写宿主接口程序,程序清单如下(author\AuthorHome.java):packageauthor;/*导入Java类*/importjavax.ejb.*;importjava.rmi.RemoteException;/*定义接口authorHome*/publicinterfaceAuthorHomeextendsEJBHome{publicAuthorcreate()throwsCreateException,RemoteException;}2.编写远程接口程序,程序清单如下(author\Author.java):packageauthor;importjavax.ejb.EJBObject;importjava.rmi.RemoteException;publicinterfaceAuthorextendsEJBObject{publicStringqueryAuthor(Stringauthor_code)throwsjava.sql.SQLException,RemoteException;publicvoidinsertAuthor(Stringauthor_code,Stringname,intsex,doublesalary,Stringbirthdate,Stringentry_date_time)throwsjava.sql.SQLException,RemoteException;publicvoidupdateAuthor(Stringauthor_code,doublesalary)throwsjava.sql.SQLException,RemoteException;publicvoiddeleteAuthor(Stringauthor_code)throwsjava.sql.SQLException,RemoteException;}3.编写组件程序,程序清单如下(authorServer\AuthorBean.java):packageauthorServer;importjava.sql.*;importjava.rmi.RemoteException;importjavax.ejb.*;importoracle.jdbc.driver.*;/*主类authorBean:用于实现会话组件*/publicclassAuthorBeanimplementsSessionBean{SessionContextctx;/*方法queryAuthor():用于获取作者信息*/publicStringqueryAuthor(Stringauthor_code)throwsSQLException,RemoteException{/*声明并初始化变量*/Stringauthorinfo=newString();/*建立缺省的数据库连接*/Connectionconn=newOracleDriver().defaultConnection();/*构造动态SQL语句*/Stringsql=SELECTname,sex,salary,birthdate,entry_date_time+FROMauthsWHEREauthor_code=?;/*准备动态SQL语句*/PreparedStatementps=conn.prepareStatement(sql);/*设置宿主变量的值*/ps.setString(1,author_code);/*执行动态SQL语句*/ResultSetrset=ps.executeQuery();if(!rset.next())thrownewRemoteException(代码为+author_code+的作者不存在!);/*返回作者信息*/authorinfo=代码为+author_code+的作者信息\n+-----------------------------------+\n作者姓名:+rset.getString(1)+\n作者性别:+rset.getInt(2)+\n作者工资:+rset.getDouble(3)+\n出生日期:+rset.getString(4)+\n录入日期:+rset.getString(5);/*关闭结果集*/rset.close();/*关闭动态SQL语句*/ps.close();returnauthorinfo;}/*方法insertAuthor():用于插入作者记录*/publicvoidinsertAuthor(Stringauthor_code,Stringname,intsex,doublesalary,Stringbirthdate,Stringentry_date_time)throwsSQLException,RemoteException{/*建立缺省的数据库连接*/Connectionconn=newOracleDriver().defaultConnection();/*构造动态SQL语句*/Stringsql=INSERTINTOauths(author_code,name,sex,salary,+birthdate,entry_date_time)VALUES(?,?,?,?,?,?);/*准备动态SQL语句*/PreparedStatementps=conn.prepareStatement(sql);/*设置宿主变量的值*/ps.setString(1,author_code);ps.setString(2,name);ps.setInt(3,sex);ps.setDouble(4,salary);ps.setString(5,birthdate);ps.setString(6,entry_date_time);/*执行动态SQL语句*/ps.executeUpdate();/*关闭动态SQL语句*/ps.close();}/*方法updateAuthor():用于修改作者工资*/publicvoidupdateAuthor(Stringauthor_code,doublesalary)throwsSQLException,RemoteException{/*建立缺省的数据库连接*/Connectionconn=newOracleDriver().defaultConnection();/*构造动态SQL语句*/Stringsql=UPDATEauthsSETsalary=?WHEREauthor_code=?;/*准备动态SQL语句*/PreparedStatementps=conn.prepareStatement(sql);/*设置宿主变量的值*/ps.setDouble(1,salary);ps.setString(2,author_code);/*执行动态SQL语句*/ps.executeUpdate();/*关闭动态SQL语句*/ps.close();}/*方法deleteAuthor():删除作者记录*/publicvoiddeleteAuthor(Stringauthor_code)throwsSQLException,RemoteException{/*建立缺省的数据库连接*/Connectionconn=newOracleDriver().defaultConnection();/*构造动态SQL语句*/Stringsql=DELETEFROMauthsWHEREauthor_code=?;/*准备动态SQL语句*/PreparedStatementps=conn.prepareStatement(sql);/*设置宿主变量的值*/ps.setString(1,author_code);/*执行动态SQL语句*/ps.executeUpdate();/*关闭动态SQL语句*/ps.close();}publicvoidejbCreate()throwsCreateException,RemoteException{}publicvoidejbActivate(){}publicvoidejbPassivate(){}publicvoidejbRemove(){}publicvoidsetSessionContext(SessionContextctx){this.ctx=ctx;}}4.编写配置说明,清单如下(author.ejb):SessionBeanauthorServer.AuthorBean{/*组件名称*/BeanHomeName=test/author;/*远程接口类名*/RemoteInterfaceClass