在WEB应用中访问EJB组件.docx
- 文档编号:23256887
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:16
- 大小:31.11KB
在WEB应用中访问EJB组件.docx
《在WEB应用中访问EJB组件.docx》由会员分享,可在线阅读,更多相关《在WEB应用中访问EJB组件.docx(16页珍藏版)》请在冰豆网上搜索。
在WEB应用中访问EJB组件
在WEB应用中访问EJB组件
EJB组件分为两种类型:
1.会话Bean:
实现会话中的业务逻辑;
2.实体Bean:
实现一个业务实体;
会话Bean有两种类型:
1.有状态会话Bean:
有状态的会话Bean的实例始终与一个特定的客户关联,他的实例变量可以代表特定客户的状态信息.
2.无状态会话Bean:
无状态的会话Bean的实例不与一个特定的客户关联,他的实例变量不能代表特定客户的状态信息.
如果直接将基于JAVAEE1.4的应用发布到刚安装好的JBoss4.2服务器,则运行时在执行PortableRomoteObject.narrow()方法时可能抛出ClassCastException.
必须按如下的步骤修改JBoss配置,才能正常的基于JavaEE1.4的应用.
1.修改
name="jboss: service=Naming" xmbean-dd="resource: xmdesc/NamingService-xmbean.xml"> --Thecallbyvaluemode.trueifalllookupsareunmarshalledusing thecaller'sTCL,falseifinVMlookupsreturnthevaluebyreference. --> 2.修改 name="jboss.j2ee: service=EARDeployer"> --Aflagindicatingifeardeploymentsshouldhavetheirownscoped classloadertoisolatetheirclassesfromotherdeployments. --> --AflagindicatingiftheearcomponentsshouldhaveinVMcall optimizationdisabled. --> 3修改jboss-server.xml文件,该问价的路径为: name="jboss.web: service=WebServer"xmbean-dd="META-INF/webserver-xmbean.xml"> 创建EJB组件 在本例中,将创建一个遵循EJB2.0规范的无状态的会话Bean,名”BookDBEJB”.它将负责操作数据库, 一个EJB至少酉三个Java文件: Romote接口,Home接口和EnterpriseBean类,本类中的BookDBEJB的三个Java文件分别如下: 1.BookDBEJB.java: Remote接口 2.BookDBEJBHome.java: Home接口 3.BookDBEJBImpl.java: EnterpriseBean类 编写Romote接口: 在Remote接口中定义了客户可以调用的业务方法,这些业务方法在EnterpriseBean类中实现,一下是远程接口BookDBEJB.java的代码: packagemypack; importjava.util.*; importjavax.ejb.*; importjava.rmi.RemoteException; publicinterfaceBookDBEJBextendsEJBObject{ publicBookDetailsgetBookDetails(StringbookId)throwsRemoteException; publicintgetNumberOfBooks()throwsRemoteException; publicCollectiongetBooks()throwsRemoteException; publicvoidbuyBooks(ShoppingCartcart)throwsRemoteException; } 当客户程序访问EJB组件的业务方法时,这些方法的参数及返回值都会在网络上传输.SUN公司的EJB规范规定,如果在Remote接口中声明的方法的参数类型或者返回类型为类,那么这些类必须实现java.io.Serializable接口,在以上代码中,getBookDetail方法返回的是BookDetail类,buyBooks方法的参数类型为ShoppingCart类,因此,必须修改BookDetails和ShoppingCart类的声明,确保他们都实现了java.io.Serializable接口,此外,在一个ShoppingCart对象中会包含多个ShoppingCartItem对象,ShoppingCartItem对象也会作为参数的一部分在网络中传输,ShoppingCartItem也必须实现Serializable接口. 编写BookDetail.java packagemypack; publicclassBookDetailsimplementsComparable,java.io.Serializable{ privateStringbookId=null; privateStringtitle=null; privateStringname=null; privatefloatprice=0.0F; privateintyear=0; privateStringdescription=null; privateintsaleAmount; publicBookDetails(StringbookId,Stringname,Stringtitle, floatprice,intyear,Stringdescription,intsaleAmount){ this.bookId=bookId; this.title=title; this.name=name; this.price=price; this.year=year; this.description=description; this.saleAmount=saleAmount; } publicStringgetTitle(){ returntitle; } publicfloatgetPrice(){ returnprice; } publicintgetYear(){ returnyear; } publicStringgetDescription(){ returndescription; } publicStringgetBookId(){ returnthis.bookId; } publicStringgetName(){ returnthis.name; } publicintgetSaleAmount(){ returnthis.saleAmount; } publicintcompareTo(Objecto){ BookDetailsn=(BookDetails)o; intlastCmp=pareTo(n.title); return(lastCmp); } } 编写ShoppingCart类 packagemypack; importjava.util.*; importjava.io.Serializable; publicclassShoppingCartimplementsSerializable{ HashMapitems=null; intnumberOfItems=0; publicShoppingCart(){ items=newHashMap(); } publicsynchronizedvoidadd(StringbookId,BookDetailsbook){ if(items.containsKey(bookId)){ ShoppingCartItemscitem=(ShoppingCartItem)items.get(bookId); scitem.incrementQuantity(); }else{ ShoppingCartItemnewItem=newShoppingCartItem(book); items.put(bookId,newItem); } numberOfItems++; } publicsynchronizedvoidremove(StringbookId){ if(items.containsKey(bookId)){ ShoppingCartItemscitem=(ShoppingCartItem)items.get(bookId); scitem.decrementQuantity(); if(scitem.getQuantity()<=0) items.remove(bookId); numberOfItems--; } } publicsynchronizedCollectiongetItems(){ returnitems.values(); } protectedvoidfinalize()throwsThrowable{ items.clear(); } publicsynchronizedintgetNumberOfItems(){ returnnumberOfItems; } publicsynchronizeddoublegetTotal(){ doubleamount=0.0; for(Iteratori=getItems().iterator();i.hasNext();){ ShoppingCartItemitem=(ShoppingCartItem)i.next(); BookDetailsbookDetails=(BookDetails)item.getItem(); amount+=item.getQuantity()*bookDetails.getPrice(); } returnroundOff(amount); } privatedoubleroundOff(doublex){ longval=Math.round(x*100);//cents returnval/100.0; } publicsynchronizedvoidclear(){ items.clear(); numberOfItems=0; } } 编写ShoppingCartItem类 packagemypack; importjava.io.Serializable; publicclassShoppingCartItemimplementsSerializable{ Objectitem; intquantity; publicShoppingCartItem(ObjectanItem){ item=anItem; quantity=1; } publicvoidincrementQuantity(){ quantity++; } publicvoiddecrementQuantity(){ quantity--; } publicObjectgetItem(){ returnitem; } publicintgetQuantity(){ returnquantity; } } 编写Home接口 Home接口定义了创建爱你,查找和删除EJB组件的方法,本例中的BookDBEJBHome接口包含了一个Create方法,这个方法返回一个BookDBEJB对象的远程引用.以下是BookDBEJBHome.java的代码: packagemypack; importjava.io.Serializable; importjava.rmi.RemoteException; importjavax.ejb.CreateException; importjavax.ejb.EJBException; importjavax.ejb.EJBHome; publicinterfaceBookDBEJBHomeextendsEJBHome{ BookDBEJBcreate()throwsRemoteException,CreateException; } 编写EnterpriseJavaBean类 本例中的EnterpriseJavaBean名为”BookDBEJBImpl”,它实现了在远程接口BookDBEJB中定义的业务方法,如下所示: packagemypack; importjava.util.*; importjava.sql.*; importjavax.sql.*; importjavax.naming.*; importjavax.ejb.*; publicclassBookDBEJBImplimplementsSessionBean{ privateConnectioncon=null; privateStringdbUrl="jdbc: mysql: //localhost: 3306/BookDB"; privateStringdbUser="dbuser"; privateStringdbPwd="1234"; publicvoidejbCreate()throwsCreateException{ try{ Class.forName("com.mysql.jdbc.Driver"); con=java.sql.DriverManager.getConnection(dbUrl,dbUser,dbPwd); }catch(Exceptionex){ thrownewCreateException("Couldn'tcreatebean: "+ex.getMessage()); } } publicvoidejbRemove()throwsEJBException{ try{ con.close(); }catch(SQLExceptionex){ thrownewEJBException("unsetEntityContext: "+ex.getMessage()); } con=null; } publicBookDBEJBImpl(){} publicvoidejbActivate(){} publicvoidejbPassivate(){} publicvoidsetSessionContext(SessionContextsc){} publicintgetNumberOfBooks(){ intcount=0; try{ StringselectStatement="selectcount(*)"+"fromBOOKS"; PreparedStatementprepStmt=con.prepareStatement(selectStatement); ResultSetrs=prepStmt.executeQuery(); if(rs.next()) count=rs.getInt (1); prepStmt.close(); }catch(SQLExceptionex){ ex.printStackTrace(); } returncount; } publicCollectiongetBooks(){ ArrayListbooks=newArrayList(); try{ StringselectStatement="select*"+"fromBOOKS"; PreparedStatementprepStmt=con.prepareStatement(selectStatement); ResultSetrs=prepStmt.executeQuery(); while(rs.next()){ BookDetailsbd=newBookDetails(rs.getString (1),rs.getString (2),rs.getString(3), rs.getFloat(4),rs.getInt(5),rs.getString(6),rs.getInt(7)); books.add(bd); } prepStmt.close(); }catch(SQLExceptionex){ ex.printStackTrace(); } Collections.sort(books); returnbooks; } publicBookDetailsgetBookDetails(StringbookId){ try{ StringselectStatement="select*"+"fromBOOKSwhereID=? "; PreparedStatementprepStmt=con.prepareStatement(selectStatement); prepStmt.setString(1,bookId); ResultSetrs=prepStmt.executeQuery(); if(rs.next()){ BookDetailsbd=newBookDetails(rs.getString (1),rs.getString (2),rs.getString(3), rs.getFloat(4),rs.getInt(5),rs.getString(6),rs.getInt(7)); prepStmt.close(); returnbd; } else{ prepStmt.close(); returnnull; } }catch(SQLExceptionex){ returnnull; } } publicvoidbuyBooks(ShoppingCartcart){ Collectionitems=cart.getItems(); Iteratori=items.iterator(); try{ con.setAutoCommit(false); while(i.hasNext()){ ShoppingCartItemsci=(ShoppingCartItem)i.next(); BookDetailsbd=(BookDetails)sci.getItem(); Stringid=bd.getBookId(); intquantity=sci.getQuantity(); buyBook(id,quantity); } mit(); con.setAutoCommit(true); }catch(Exceptionex){ ex.printStackTrace(); } } publicbooleanbuyBook(StringbookId,intquantity){ try{ StringselectStatement="select*"+"fromBOOKSwhereID=? "; PreparedStatementprepStmt=con.prepareStatement(selectStatement); prepStmt.setString(1,bookId); ResultSetrs=prepStmt.executeQuery(); if(rs.next()){ prepStmt.close(); StringupdateStatement= "updateBOOKSsetSALE_AMOUNT=SALE_AMOUNT+? whereID=? "; prepStmt=con.prepareStatement(updateStatement); prepStmt.setInt(1,quantity); prepStmt.setString(2,bookId); prepStmt.executeUpdate(); prepStmt.close(); } }catch(Exceptionex){ex.p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WEB 应用 访问 EJB 组件