Beruflich Dokumente
Kultur Dokumente
Enterprise
JavaBeans
with J2EE
Solutions to
Workshops
Fundamentals of EJB with J2EE: Page i
Solutions to Workshops
Table of Contents
Workshop 2:
Writing a Session Bean
Bank.java
package bank;
import account.*;
import java.rmi.RemoteException;
import javax.ejb.*;
// ===========================================
// Methods for Bank attributes
// ===========================================
// ===========================================
// Methods to get accounts
// ===========================================
// ===========================================
// Methods to operate on current account
// ===========================================
// ===========================================
// Methods to do complex transactions
// ===========================================
BankHome.java
package bank;
import javax.ejb.*;
import java.rmi.RemoteException;
BankBean.java
package bank;
import course.account.Account;
import javax.ejb.*;
//================================================
// Instance Variables
//================================================
//================================================
// Methods for remote interface
//================================================
//================================================
// Method for create(*) in home interface
//================================================
//================================================
// Methods required by SessionBean interface
//================================================
Workshop 4:
Deploying the Session Bean
ejb-jar.xml (Generated)
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar>
<description>My bank bean</description>
<display-name>BankJar</display-name>
<enterprise-beans>
<session>
<display-name>Bank</display-name>
<ejb-name>Bank</ejb-name>
<home>bank.BankHome</home>
<remote>bank.Bank</remote>
<ejb-class>bank.BankBean</ejb-class>
<session-type>Stateful</session-type>
<transaction-type>Bean</transaction-type>
<security-identity>
<description></description>
<use-caller-identity></use-caller-identity>
</security-identity>
</session>
</enterprise-beans>
</ejb-jar>
Workshop 5:
Writing a Client Application
BankClient.java
package client;
import bank.*;
import course.client.BankClientBase;
import java.util.Hashtable;
import javax.ejb.*;
import javax.naming.*;
import javax.rmi.PortableRemoteObject;
//================================================
// Instance Variables
//================================================
//================================================
// Methods called by Bank menu
//================================================
// Connect to bank
public boolean bankConnect( String textEntry ) {
String strName = null;
try {
_bank = _bankhome.create();
strName = _bank.getName();
showBankInfo( strName );
return true;
}
catch( Exception ex ) {
printException(ex, "Can't connect to bank:");
return false;
}
}
//================================================
// Methods called by Account menu
//================================================
// Success
_strCurrAcctNum = number;
showAccountInfo();
println( "Opened account #" + number +
". Balance = " + dollarFormat(fBalance)) ;
return true;
}
catch( Exception ex ) {
printException(ex, "Could not get account " + number + ":");
return false;
}
}
//================================================
// Helper Methods
//================================================
// Main method
public static void main( String[] args ) {
BankClientBase.main(args, new BankClient());
}
jndi.properties
java.naming.factory.initial=
com.sun.enterprise.naming.SerialInitContextFactory
Workshop 6:
Writing a Container-Managed
Entity Bean
Account.java
package account;
import javax.ejb.*;
import java.rmi.RemoteException;
//================================================
// Instance Methods for properties
//================================================
//================================================
// Instance Methods for moving money
//================================================
AccountHome.java
package account;
import javax.ejb.*;
import java.rmi.RemoteException;
AccountBean.java
package account;
import course.util.IdGenerator;
import java.rmi.*;
import javax.ejb.*;
//================================================
// Instance Variables
//================================================
//================================================
// Methods for CMP fields
//================================================
// Remote methods
public abstract String getDescription();
public abstract void setDescription(String value);
//================================================
// Methods for remote interface
//================================================
//================================================
// Methods for create(*) in home interface
//================================================
return null;
}
//================================================
// Methods required by EntityBean interface
//================================================
BankBean.java
package bank;
// import course.account.Account;
import account.*;
import java.rmi.RemoteException;
import javax.ejb.*;
import javax.naming.*;
import javax.rmi.PortableRemoteObject;
//================================================
// Instance Variables
//================================================
//================================================
// Methods for remote interface
//================================================
try {
Account acct =
_accthome.create(openingBalance, description);
try {
acct = _accthome.findByPrimaryKey(acctNum);
_acctCurrent = acct;
return getCurrentAcctBalance();
}
catch(RemoteException e) {
throw new FinderException("Can't find account " +
acctNum + ":\n" + e);
}
}
//================================================
// Method for create(*) in home interface
//================================================
//================================================
// Methods required by SessionBean interface
//================================================
Workshop 8:
Deploying the Entity Bean
ejb-jar.xml (Generated)
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar>
<description>My bank teller bean</description>
<display-name>LabBeans</display-name>
<enterprise-beans>
<session>
<description>no description</description>
<display-name>MyBank</display-name>
<ejb-name>MyBank</ejb-name>
<home>bankteller.BankTellerHome</home>
<remote>bankteller.BankTeller</remote>
<ejb-class>bankteller.BankTellerBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Bean</transaction-type>
<security-identity>
<description></description>
<use-caller-identity></use-caller-identity>
</security-identity>
</session>
<entity>
<display-name>MyAccount</display-name>
<ejb-name>MyAccount</ejb-name>
<home>account.AccountHome</home>
<remote>account.Account</remote>
<ejb-class>account.AccountBean</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>java.lang.String</prim-key-class>
<reentrant>False</reentrant>
<cmp-version>2.x</cmp-version>
<abstract-schema-name>Account</abstract-schema-name>
<cmp-field>
Workshop 10:
Using Exceptions
Account.java
public interface Account extends EJBObject {
//================================================
// Instance Methods for properties
//================================================
// No change here...
//================================================
// Instance Methods for moving money
//================================================
AccountBean.java
public abstract class AccountBean implements EntityBean {
//--------------------------------------------------------
setBalance(fNewBal);
return fNewBal;
}
//--------------------------------------------------------
}
Bank.java
public interface Bank extends EJBObject {
//--------------------------------------------------------
//--------------------------------------------------------
}
BankBean.java
public class BankBean implements SessionBean {
//--------------------------------------------------------
//--------------------------------------------------------
try {
return _acctCurrent.credit(amount);
}
catch(RemoteException re) {
throw remoteToEjbException(re);
}
}
try {
return _acctCurrent.debit(amount);
}
catch(RemoteException re) {
throw remoteToEjbException(re);
}
}
//--------------------------------------------------------
Workshop 11:
Using Transactions
BankBean.java
public void transferFunds(String sourceAcctNum, String targetAcctNum,
float amount)
throws FinderException, IllegalTransactionException {
try {
Account acctSource =
_accthome.findByPrimaryKey(sourceAcctNum);
Account acctTarget =
_accthome.findByPrimaryKey(targetAcctNum);
acctTarget.credit(amount);
acctSource.debit(amount);
}
catch(RemoteException re) {
throw remoteToEjbException(re);
}
catch(FinderException fe) {
_ctxt.setRollbackOnly();
throw fe; // Re-throw exception
}
catch(IllegalTransactionException ite) {
_ctxt.setRollbackOnly();
throw ite; // Re-throw exception
}
}
Bank.java
public void transferFunds(String sourceAcctNum, String targetAcctNum,
float amount) throws RemoteException, FinderException,
IllegalTransactionException;
BankClient.java
public boolean accountTransfer( float amount, String target ) {
try {
_bank.transferFunds(_strCurrAcctNum, target, amount);
Workshop 13:
Setting an Environment
BankBean.java
public class BankBean implements SessionBean {
//================================================
// Instance Variables
//================================================
// AccountHome name
strAcctHomeName = (String) ctxtEnv.lookup("AccountHome.name");
// Bank name
_strName = (String) ctxtEnv.lookup("Bank.name");
}
catch(Exception e) {
throw new CreateException("Could not create bank;\n" +
"Could not get environment:\n" + e);
}
try {
_jndiCtxt = new InitialContext();
}
catch(NamingException ne) {
throw new EJBException(ne);
}
}