1、java会话bean第十五章 Java会话Bean 下面是一个无状态会话Bean的Home interface编程实例:import java.rmi.RemoteException;import javax.ejb.*;public interface BookDealerHome extends EJBHome /无状态的会话Bean的Home interface /只能有一个没参数的create()函数,且必须返回Bean的Remote interface public BookDealer create() throws CreateException,RemoteException;
2、 下面是无状态会话Bean的Remote interface的编程实例:import java.util.Collection;import java.rmi.RemoteException;import javax.ejb.*;/用户自定义的包import bookstore.ejb.NoSuchBookException;public interface BookDealer extends EJBObject /根据业务需要定义的各种business函数/这些函数将在EJB的Bean class中具体实现 public boolean buyBook(String booksn) thr
3、ows RemoteException,NoSuchBookException; public Collection getAvailableBooksInPriceRange(String booktype, float maxprice) throws RemoteException; 以下,是一个无状态会话Bean的编程实例:/引入需要的包import java.util.*;import java.sql.*;import javax.ejb.*;import javax.sql.*;import javax.naming.*;/引入用户自定义的包import bookstore.ej
4、b.*;public class BookDealerBean implements SessionBean SessionContext ctx; /程序运行中所连接的数据源的参考private javax.sql.DataSource ds; /setSessionContext函数用于取得一些运行中使用的资源public void setSessionContext(SessionContext ctx) /保留SessionContext对象的参考,以备运行中其他函数使用this.ctx=ctx; /取得数据源的参考,以备运行中其他函数需要数据库操作时使用 /没作用的callback函
5、数但因为implements了SessinBean接口,/所以仍需定义 public void ejbCreate() public void ejbRemove() public void ejbPassivate() public void ejbActivate() /实现Remote interface中定义的business 函数 public Collection getAvailableBooksInPriceRange(String booktype,float maxPrice) public boolean buyBook(String booksn) throws NoS
6、uchBookException 例如,下面的实例将ExampleEJB中名为getContext()的函数的事务管理属性指定为Required。 ExampleEJB getContents Required下面的代码实例说明了如何使用JTA实现Bean的事务管理:UserTransaction tx=ctx.getUserTransaction();try tx.begin(); business_Method() mit();catch(Exception e) try tx.rollback(); catch(SystemException sysex) throw new EJBEx
7、ception( Rollback failure:+sysex.toString(); throw new EJBException(Rollback failure:+e.toString();本实例选用Oracle8作为后台数据库。/实例文件:bookstore.sql:建立数据表,并插入一些演示数据DROP TABLE book;CREATE TABLE book ( booksn varchar(8), bookname varchar(30), author varchar(30), booktype varchar(20), price number(5,2);INSERT IN
8、TO book VALUES(0001,Thinking in Java,Bruce Eckel,Java,60.00);INSERT INTO book VALUES(0002,Java and XML,McLaughlin,Java,69.00);INSERT INTO book VALUES(0003,Thinking in C+,Bruce Eckel,C+,39.00);INSERT INTO book VALUES(0004,Java Cookbook,Darwin,Java,89.00);15.2.3 编写代码1、图书信息对象:BookValueObject.java这个实例程序
9、要求有一个表示图书种类,价格等信息的对象BookValueObject。BookDealer访问数据库,并用查询的结果填充这个对象,最后把这个对象返回给客户机。客户机程序从BookValueObject中提取各种图书的信息。因为这个对象是通过远程接口传递的,所以必须实现java.io.Serializable接口。/图书信息对象:BookValueObject.java/将本接口定义在包bookstore.ejbpackage bookstore.ejb;import java.io.*;public final class BookValueObject implements Seriali
10、zable /换行符 private static String EOL=System.getProperty(line.separator); /图书的各种基本信息 private String booksn; private String bookname; private String author; private String booktype; private float bookprice; /无参数构造函数 public BookValueObject() /* *构造函数 *参数:各种图书的基本信息 */ public BookValueObject(String bsn,S
11、tring bname,String au, String btype,float bprice) setBooksn(bsn); setBookname(bname); setAuthor(au); setBooktype(btype); setBookprice(bprice); /重载java.lang.Object的toStrng()函数 public String toString() StringBuffer sb=new StringBuffer(); sb.append(EOL); sb.append(编号:+getBooksn(); sb.append( 书名:+getBoo
12、kname(); sb.append( 作者:+getAuthor(); sb.append( 类别:+getBooktype(); sb.append( 价格:+getBookprice(); sb.append(EOL); return sb.toString(); public String getBooksn() return this.booksn; public void setBooksn(String bsn) this.booksn=bsn; public String getBookname() return this.bookname; public void setBo
13、okname(String bname) this.bookname=bname ; public String getAuthor() return this.author; public void setAuthor(String au) this.author=au; public String getBooktype() return this.booktype; public void setBooktype(String btype) this.booktype=btype ; public float getBookprice() return this.bookprice; p
14、ublic void setBookprice(float bprice) this.bookprice=bprice ; 2、自定义的异常类:NoSuchBookException.java本实例还需要一个用户自定义的异常类NoSuchBookException,以当用户欲购买一本不存在的图书时,报告异常。/自定义的异常类:NoSuchBookException.javapackage bookstore.ejb;public class NoSuchBookException extends Exception public NoSuchBookException() public NoS
15、uchBookException(String msg) super(msg); 3、有状态会话Bean:BookBuyer/Remote interface:BookBuyer.java/将本接口定义在bookstore.buyer.ejb下,结构分明,便于管理package bookstore.ejb.buyer;/有状态Bean-BookBuyer的Remote interfaceimport java.util.Collection;import java.rmi.RemoteException;import javax.ejb.EJBObject;import bookstore.e
16、jb.*;public interface BookBuyer extends EJBObject /* *业务逻辑函数:查询符合客户要求的书籍 *参数: 无 *返回: java.util.Collection 符合要求的书目 *异常: java.rmi.RemoteException */ public Collection getAvailableBooks() throws java.rmi.RemoteException; /* *业务逻辑函数:购买指定的书籍 *参数: String bsn 书籍的编号 *返回: boolean 交易成功 *异常: java.rmi.RemoteExc
17、eption * bookstore.ejb.NoSuchBookException */ public boolean buyBook(String bsn) throws RemoteException,NoSuchBookException;/Hoem interface:BookBuyerHome.java/将本接口定义在bookstore.buyer.ejb下,结构分明,便于管理package bookstore.ejb.buyer;/有状态Bean-BookBuyer的Home interfaceimport java.rmi.RemoteException;import java
18、x.ejb.CreateException;import javax.ejb.EJBHome;public interface BookBuyerHome extends EJBHome /* *create函数:获取Remote intface的参考 *参数: String booktype 书目的类别 * float maxPrice 查询书目的价格上限 *返回: BookBuyer BookBuyer的Remote interface *异常: java.rmi.RemoteException * javax.ejb.CreateException */ public BookBuyer
19、 create(String booktype, float maxPrice) throws CreateException,RemoteException; /Bean class:BookBuyerBean.java/将本接口定义在包bookstore.buyer.ejb下package bookstore.ejb.buyer;/引入所使用的类import java.rmi.RemoteException;import java.util.*;import javax.ejb.*;import javax.naming.*;import javax.rmi.*;/引入用户自定义的类imp
20、ort bookstore.ejb.NoSuchBookException;import bookstore.ejb.dealer.*;public class BookBuyerBean implements SessionBean /SessinContext的参考 private SessionContext ctx; /用户欲查询图书的类型和最高价格 private String bookType; private float maxPrice; /对无状态会话BeanBookDealer的参考 private BookDealer bookDealer; /* *callback函数
21、 *参数:SessinContext EJBContaienr参入的SessionContext对象的参考 */ public void setSessionContext(SessionContext c) ctx=c; /* *ejbCreate函数:实现Home interface中实现的create函数 *参数: String booktype 书目的类别 * float maxPrice 查询书目的价格上限 *返回: void */ public void ejbCreate(String booktype,float maxPrice) this.bookType=booktype
22、; this.maxPrice=maxPrice; /通过Jndi获得有状态会话Bean的Home interface参考 BookDealerHome bookDealerHome=null; try Context ic=new InitialContext(); Object h=ic.lookup(BookDealerEJB); bookDealerHome=(BookDealerHome) PortableRemoteObject.narrow(h,BookDealerHome.class); catch (NamingException ne) ne.printStackTrace
23、(); throw new EJBException(Exception during look up BookDealerHome); /获得有状态会话Bean的Remote interface参考 try bookDealer=bookDealerHome.create(); catch (Exception e) e.printStackTrace(); throw new EJBException(Exception during get BookDealer Remote interface); /callback函数,在本实例中用不着,但由于implements了SessionBe
24、an, /所以还是必须实现它们。 public void ejbRemove() public void ejbActivate() public void ejbPassivate() /* *业务逻辑函数:查询符合客户要求的书籍 *参数: 无 *返回: java.util.Collection 符合要求的书目 *异常: java.rmi.RemoteException */ public Collection getAvailableBooks() throws RemoteException /调用BoookDealer提供的服务:getAvailableBookInPriceRange
25、 return bookDealer.getAvailableBooksInPriceRange(bookType,maxPrice); /* *业务逻辑函数:购买指定的书籍 *参数: String bsn 书籍的编号 *返回: boolean 交易成功 *异常: java.rmi.RemoteException */ public boolean buyBook(String bsn) throws RemoteException,NoSuchBookException /调用BoookDealer提供的服务:buyBook(String) return bookDealer.buyBook
26、(bsn); 3、无状态会话Bean:BookDealer/Remote interface:BookDealer.javapackage bookstore.ejb.dealer;/引入所需的类import java.util.Collection;import java.rmi.RemoteException;import javax.ejb.*;/引入用户自定的异常类import bookstore.ejb.NoSuchBookException;public interface BookDealer extends EJBObject /根据业务需要定义的各种业务函数 /* *业务逻辑
27、函数:删除数据库中相应的数据记录 *参数: String bsn 书籍的编号 *返回: boolean 交易成功 *异常: java.rmi.RemoteException * bookstore.ejb.NoSuchBookException */ public boolean buyBook(String booksn) throws RemoteException,NoSuchBookException; /* *业务逻辑函数:查询数据库中符合用户要求的书籍信息 *参数: String booktype 书籍的种类 * float maxPrice 书籍的最高价格 *返回: java.u
28、til.Collection 符合查询条件的书籍信的信息对象(BookValueObject)的集合 *异常: java.rmi.RemoteException */ public Collection getAvailableBooksInPriceRange(String booktype,float maxprice) throws RemoteException; /Home interface:BookDealerHome.javapackage bookstore.ejb.dealer;import java.rmi.RemoteException;import javax.ejb.*;public interface BookDealerHome extends EJBHome /无状态的会话Bean的Home interface /只能有一个没参数的create()函数,且必须返回Bean的Remote interface public BookDealer create() throws CreateException,RemoteExcepti