coutoperator 2010-07-02
EJB基础笔记(一)
第一章教程提示
第二章EJB技术概述
2.1简介
2.2两层和三层环境
Two-tierComputingEnvironments:Application-----------network-------->DatabaseServer
三层客户机-------》应用程序服务器--------》数据库服务器
第三章EJB规范
3.2EJB容器
容器容纳和管理EnterpriseBean
JavaWeb服务器容纳Servlet
HTML浏览器容纳JavaApplet
EJB容器在运行时管理EnterpriseBean的各个方面,包括远程访问bean、安全性、持续、事务、并行性和资源的访问与合用。
EJBContainer>TransactionManagement
>PersistenceManagement
>SecurityManagement
>EJBContext,JNDIENC
>CallbackMethods
由于客户机应用程序不能直接访问bean--容器位于客户机和bean之间。
EnterpriseBean通过以下三种机制之一与容器交互:
回调方法
每个bean都会实现EnterpriseBean接口的子类型,该接口定义了一些方法,称作回调方法。每个回调方法在bean的生命周期期间向它提示一个不同事件,当容器要合用某个bean、将其状态存储到数据库、结束事务、从内存中除去该bean等操作时,它将调用这些方法来通知该bean。回调方法可以让bean在事件之前或之后立即执行内部调整。
EJBContext接口
每个bean都会得到一个EJBContext对象,它是对容器的直接引用。EJBContext接口提供了用于与容器交互的方法,因此那个bean可以请求关于环境的信息,如其客户机的身份或事务的状态,或者bean可以获取它自身的远程引用。
Java命名和目录接口(JNDI)
JNDI是Java平台的标准扩展,用于访问命名系统,如LDAP、NetWare、文件系统等。每个bean自动拥有对某个特定命名系统(称作环境命名上下文(ENC))的访问权。ENC由容器管理,bean使用JNDI来访问ENC。JNDIENC允许bean访问资源,如JDBC连接、其它EnterpriseBean,以及特定于该bean的属性。
3.5远程和本地接口
远程和本地接口分别扩展javax.ejb.EJBObject和javax.ejb.EJBHome接口。这些EJB接口类型定义了一组标准的实用程序方法,并为所有远程和本地接口提供了常用基本类型。
RemoteInterface:java.rmi.Remote----->javax.ejb.EJBObject------->Customer
HomeInterface:java.rmi.Remote----->javax.ebj.EJBHome-------->CustomerHome
CustomerHomehome=//...obtainareferencethatimplementsthehomeinterface.
//Usethehomeinterfacetocreatea
//newinstanceoftheCustomerbean.
Customercustomer=home.create(customerID);
//usingabusinessmethodontheCustomer.
customer.setName(someName);
Thecustomerinterface:
importjavax.ejb.EJBObject;
importjava.rmi.RemoteException;
publicinterfaceCustomerextendsEJBObject{
publicNamegetName()throwsRemoteException;
publicvoidsetName(Namename)throwsRemoteException;
publicAddressgetAddress()throwsRemoteException;
publicvoidsetAddress(Addressaddress)throwsRemoteException;
}
实体Bean,它表示持久商业对象(数据存储在数据库中的商业对象)。实体Bean表示数据库中的商业数据,并添加特定于该数据的行为。
会话Bean
importjavax.ejb.EJBObject;
importjava.rmi.RemoteException;
publicinterfaceHotelClerkextendsEJBObject{
publicvoidreserveRoom(Customercust,RoomInfori,Datefrom,Dateto)
throwsRemoteException;
publicRoomInfoavailableRooms(Locationloc,Datefrom,Dateto)
throwsRemoteException;
}
HotelClerkbean充当代理程序,因为它代表用户执行任务,但它自己在数据库中并不是持久的。您不需要有关HotelClerk的信息;您需要旅馆店员为您执行任务。这是会话Bean的典型行为。
实体Bean
importjavax.ejb.EntityBean;
publicclassCustomerBeanimplementsEntityBean{
AddressmyAddress;
NamemyName;
CreditCardmyCreditCard;
snipgetterandsetter
...
}
BeanClass:javax.ejb.EnterpriseBean-->javax.ejb.EntityBean-->CustomerBean
3.9生命周期方法
importjavax.ejb.EJBHome;
importjavax.ejb.CreateException;
importjavax.ejb.FinderException;
importjava.rmi.RemoteException;
publicinterfaceCustomerHomeextendsEJBHome{
publicCustomercreate(IntegercustomerNumber)throwsRemoteException,CreateException;
publicCustomerfindByPrimaryKey(IntegercustomerNumber)throwsRemoteException,FinderException;
publicEnumerationfindByZipCode(intzipCode)throwsRemoteException,FinderException;
}
create()方法用于创建新的实体。这将在数据库中产生新的记录。本地接口可能有许多create()方法。每个create()的自变量数量和数据类型由bean开发人员指定,但返回类型必须是远程接口数据类型。这种情况下,在CustomerHome接口上调用create()将返回Customer的实例。
第四章实体Bean
实体Bean:容器管理的持续(CMP)bean管理的持续(BMP)
容器管理的持续
容器管理的字段可以是任何原语数据类型或可串行化类型。本例中使用原语int(customerID)和可串行化对象(Address、Name、CreditCard)。
4.4本地接口
publicinterfaceCustomerHomeextendsjavax.ejb.EJBHome{
publicCustomercreate(IntegercustomerNumber)throwsRemoteException,CreateException;
publicCustomercreate(IntegercustomerNumber,Namename)throwsRemoteException,CreateException;
publicCustomerfindByPrimaryKey(IntegercustomerNumber)throwsRemoteException,FinderException;
publicEnumerationfindByZipCode(intzipCode)throwsRemoteException,FinderException;
}
调用本地接口示例:
CustomerHomehome=//GetareferencetotheCustomerHomeobject
Namename=newName("John","W","Smith");
Customercustomer=home.create(newInteger(33),name);
4.5远程接口
importjavax.ejb.EJBObject;
importjava.rmi.RemoteException;
publicinterfaceCustomerextendsEJBObject{
publicNamegetName()throwsRemoteException;
publicvoidsetName(Namename)throwsRemoteException;
publicAddressgetAddress()throwsRemoteException;
publicvoidsetAddress(Addressaddress)throwsRemoteException;
publicCreditCardgetCreditCard()throwsRemoteException;
publicvoidsetCreditCard(CreditCardcard)throwsRemoteException;
}
远程接口调用示例:
Customercustomer=//...obtainaremotereferencetothebean
//getthecustomer'saddress
Addressaddr=customer.getAddress();
//changethezipcode
addr.zip="56777";
//updatethecustomer'saddress
customer.setAddress(addr);
4.6回调方法
回调方法在javax.ejb.EntityBean接口中定义,此接口由所有实体Bean实现,包括CustomerBean类。
publicinterfacejavax.ejb.EntityBean{
publicvoidsetEntityContext();
publicvoidunsetEntityContext();
publicvoidejbLoad();
publicvoidejbStore();
publicvoidejbActivate();
publicvoidejbPassivate();
publicvoidejbRemove();
}
使用回调方法的CustomerBean:
importjavax.ejb.EntityBean;
publicclassCustomerBeanimplementsEntityBean{
intcustomerID;
AddressmyAddress;
NamemyName;
CreditCardmyCreditCard;
EntityContextejbContext;
//CALLBACKMETHODS
publicvoidsetEntityContext(EntityContextcntx){
ejbContext=cntx
}
//BUSINESSMETHODS
publicvoidsetCreditCard(CreditCardcard){
if(card.type.equals("WorldWide"))
if(ejbContext.isCallerInRole("Manager"))
myCreditCard=card;
else
thrownewSecurityException();
else
myCreditCard=card;
}
...snip...
4.8Bean管理的持续
bean使用数据库API(通常是JDBC)来读取其字段并将字段写入数据库,但容器会告诉它何时执行每个同步操作,并会自动管理bean的事务。bean管理的持续可以让bean开发人员灵活地执行对于容器来说太过于复杂的持续操作,或者使用容器不支持的数据源--例如,定制或旧的数据库。
publicclassCustomerBean_BMPextendsCustomerBean{
publicvoidejbLoad(){
//overrideimplementation
}
publicvoidejbStore(){
//overrideimplementation
}
publicvoidejbCreate(){
//overrideimplementation
}
publicvoidejbRemove(){
//overrideimplementation
}
privateConnectiongetConnection(){
//newhelpermethod
}
}
ejbLoad()和ejbStore()方法必须包括数据库访问逻辑,只有这样,当EJB告诉bean要装入和存储数据时,它才能这么做。容器会在适当时自动执行ejbLoad()和ejbStore()方法。
ejbCreate()方法将新记录插入数据库,而ejbRemove()方法从数据库中删除实体的数据。
获得IDIntegerprimaryKey=(Integer)ejbContext.getPrimaryKey();