|
Home TOC Index |
|
Search
Feedback |
The CartEJB Example
The
CartEJBsession bean represents a shopping cart in an online bookstore. The bean's client may add a book to the cart, remove a book, or retrieve the cart's contents. To constructCartEJB, you need the following code:All session beans require a session bean class. All enterprise beans that permit remote access must have a home and remote interface. To meet the needs of a specific application, an enterprise bean may also need some helper classes. The
CartEJBsession bean uses two helper classes,BookExceptionandIdVerifier, which are discussed in the section Helper Classes.The source code for this example is in the
j2eetutorial/examples/src/ejb/cartdirectory. To compile the code, go to thej2eetutorial/examplesdirectory and typeantcart. A sampleCartApp.earfile is in the j2eetutorial/examples/earsdirectory.Session Bean Class
The session bean class for this example is called
CartBean. Like any session bean, theCartBeanclass must meet these requirements:
- It implements the
SessionBeaninterface.- The class is defined as
public.- The class cannot be defined as
abstractorfinal.- It implements one or more
ejbCreatemethods.- It implements the business methods.
- It contains a
publicconstructor with no parameters.- It must not define the
finalizemethod.The source code for the
CartBeanclass follows.import java.util.*; import javax.ejb.*; public class CartBean implements SessionBean { String customerName; String customerId; Vector contents; public void ejbCreate(String person) throws CreateException { if (person == null) { throw new CreateException("Null person not allowed."); } else { customerName = person; } customerId = "0"; contents = new Vector(); } public void ejbCreate(String person, String id) throws CreateException { if (person == null) { throw new CreateException("Null person not allowed."); } else { customerName = person; } IdVerifier idChecker = new IdVerifier(); if (idChecker.validate(id)) { customerId = id; } else { throw new CreateException("Invalid id: "+ id); } contents = new Vector(); } public void addBook(String title) { contents.addElement(title); } public void removeBook(String title) throws BookException { boolean result = contents.removeElement(title); if (result == false) { throw new BookException(title + "not in cart."); } } public Vector getContents() { return contents; } public CartBean() {} public void ejbRemove() {} public void ejbActivate() {} public void ejbPassivate() {} public void setSessionContext(SessionContext sc) {} }The SessionBean Interface
The
SessionBeaninterface extends theEnterpriseBeaninterface, which in turn extends theSerializableinterface. TheSessionBeaninterface declares theejbRemove,ejbActivate,ejbPassivate, andsetSessionContextmethods. TheCartBeanclass doesn't use these methods, but it must implement them because they're declared in theSessionBeaninterface. Consequently, these methods are empty in theCartBeanclass. Later sections explain when you might use these methods.The ejbCreate Methods
Because an enterprise bean runs inside an EJB container, a client cannot directly instantiate the bean. Only the EJB container can instantiate an enterprise bean. During instantiation, the example program performs the following steps.
- The client invokes a
createmethod on the home object:Cart shoppingCart = home.create("Duke DeEarl","123");- The EJB container instantiates the enterprise bean.
- The EJB container invokes the appropriate
ejbCreatemethod inCartBean:public void ejbCreate(String person, String id) throws CreateException { if (person == null) { throw new CreateException("Null person not allowed."); } else { customerName = person; } IdVerifier idChecker = new IdVerifier(); if (idChecker.validate(id)) { customerId = id; } else { throw new CreateException("Invalid id: "+ id); } contents = new Vector(); }Typically, an
ejbCreatemethod initializes the state of the enterprise bean. The precedingejbCreatemethod, for example, initializes thecustomerNameandcustomerIdvariables with the arguments passed by thecreatemethod.An enterprise bean must have one or more
ejbCreatemethods. The signatures of the methods must meet the following requirements:
- The access control modifier must be
public.- The return type must be
void.- If the bean allows remote access, the arguments must be legal types for the Java
Remote Method Invocation (RMI) API.
- The modifier cannot be
staticorfinal.The
throwsclause may include thejavax.ejb.CreateExceptionand other exceptions that are specific to your application. TheejbCreatemethod usually throws aCreateExceptionif an input parameter is invalid.Business Methods
The primary purpose of a session bean is to run business tasks for the client. The client invokes business methods on the remote object reference that is returned by the
createmethod. From the client's perspective, the business methods appear to run locally, but they actually run remotely in the session bean. The following code snippet shows how theCartClientprogram invokes the business methods:Cart shoppingCart = home.create("Duke DeEarl", "123"); . . . shoppingCart.addBook("The Martian Chronicles"); shoppingCart.removeBook("Alice In Wonderland"); bookList = shoppingCart.getContents();The
CartBeanclass implements the business methods in the following code:public void addBook(String title) { contents.addElement(new String(title)); } public void removeBook(String title) throws BookException { boolean result = contents.removeElement(title); if (result == false) { throw new BookException(title + "not in cart."); } } public Vector getContents() { return contents; }The signature of a business method must conform to these rules:
- The method name must not conflict with one defined by the EJB architecture. For example, you cannot call a business method
ejbCreateorejbActivate.- The access control modifier must be
public.- If the bean allows remote access, the arguments and return types must be legal types for the Java RMI API.
- The modifier must not be
staticorfinal.The
throwsclause may include exceptions that you define for your application. TheremoveBookmethod, for example, throws theBookExceptionif the book is not in the cart.To indicate a system-level problem, such as the inability to connect to a database, a business method should throw the
javax.ejb.EJBException. When a business method throws anEJBException, the container wraps it in aRemoteException, which is caught by the client. The container will not wrap application exceptions such asBookException. BecauseEJBExceptionis a subclass ofRuntimeException, you do not need to include it in thethrowsclause of the business method.Home Interface
A home interface extends the
javax.ejb.EJBHomeinterface. For a session bean, the purpose of the home interface is to define thecreatemethods that a remote client may invoke. TheCartClientprogram, for example, invokes thiscreatemethod:Cart shoppingCart = home.create("Duke DeEarl", "123");Every
createmethod in the home interface corresponds to anejbCreatemethod in the bean class. The signatures of theejbCreatemethods in theCartBeanclass follow:public void ejbCreate(String person) throws CreateException . . . public void ejbCreate(String person, String id) throws CreateExceptionCompare the
ejbCreatesignatures with those of thecreatemethods in theCartHomeinterface:import java.io.Serializable; import java.rmi.RemoteException; import javax.ejb.CreateException; import javax.ejb.EJBHome; public interface CartHome extends EJBHome { Cart create(String person) throws RemoteException, CreateException; Cart create(String person, String id) throws RemoteException, CreateException; }The signatures of the
ejbCreateandcreatemethods are similar, but differ in important ways. The rules for defining the signatures of thecreatemethods of a home interface follow.
- The number and types of arguments in a
createmethod must match those of its correspondingejbCreatemethod.- The arguments and return type of the
createmethod must be valid RMI types.- A
createmethod returns the remote interface type of the enterprise bean. (But anejbCreatemethod returnsvoid.)- The
throwsclause of thecreatemethod must include the java.rmi.RemoteExceptionand thejavax.ejb.CreateException.Remote Interface
The remote interface, which extends
javax.ejb.EJBObject, defines the business methods that a remote client may invoke. Here is the source code for theCartremote interface:import java.util.*; import javax.ejb.EJBObject; import java.rmi.RemoteException; public interface Cart extends EJBObject { public void addBook(String title) throws RemoteException; public void removeBook(String title) throws BookException, RemoteException; public Vector getContents() throws RemoteException; }The method definitions in a remote interface must follow these rules:
- Each method in the remote interface must match a method implemented in the enterprise bean class.
- The signatures of the methods in the remote interface must be identical to the signatures of the corresponding methods in the enterprise bean class.
- The arguments and return values must be valid RMI types.
- The
throwsclause must include thejava.rmi.RemoteException.Helper Classes
The
CartEJBsession bean has two helper classes:BookExceptionandIdVerifier. TheBookExceptionis thrown by theremoveBookmethod and theIdVerifiervalidates thecustomerIdin one of theejbCreatemethods. Helper classes must reside in the EJB JAR file that contains the enterprise bean class.Running the CartEJB Example
- Start the J2EE server and
deploytool. For instructions, see the section Setting Up.- In
deploytoolopen thej2eetutorial/examples/ears/CartApp.earfile (FileOpen). You should see the application that is displayed in Figure 4-1.
- Deploy the
CartAppapplication (ToolsDeploy). In the Introduction dialog box, make sure that you select the Return Client JAR checkbox. For detailed instructions, see Deploying the J2EE
Application.
- Run the application.
|
Home TOC Index |
|
Search
Feedback |