Enterprise JavaBeans
Download
Report
Transcript Enterprise JavaBeans
Enterprise JavaBeans™
Trademark of Sun Microsystems, Inc.
Agenda
Review
Interfaces
Deployment Descriptors
Using Beans
Homework 5
Review
need
development and runtime environment
J2EE SDK
development environment from tool vendor like Together,
Inprise
runtime environment from Sun, IBM, BEA, Inprise, etc.
beans
are server-side components
entity beans model real-world objects
persistent
session beans manage processes or tasks
transient
in nature, can be externally manipulated
in nature, though have side effects that perist
message-driven beans increase reliability and efficiency
transient
in nature, process messages sent to message server
Interface Review
remote interface: defines business methods;
EJBObject extension
home interface: defines life cycle methods;
EJBHome extension
bean class: implements business methods
implements EntityBean or SessionBean
MessageDrivenBean is a different story, left untold
primary key: for entity beans; DB reference
Clients and Containers Review
client uses home and remote interfaces
not bean class itself
bean and server/infrastructure interactions
managed by "container"
container creates instances, manages storage, etc.
tools support container, doing things like:
mapping between entity beans and DB records
generating code from interfaces
etc.
Remote Interface
• just the business methods
• not used by message-driven beans
import java.rmi.RemoteException;
public interface xxx extends javax.ejb.EJBObject {
public ... throws RemoteException:
}
By convention, xxx is name of business object or process
“…” means any method signature
Remote Interface Example
package account;
import java.rmi.RemoteException;
public interface Account extends javax.ejb.EJBObject {
public void debit(MoneyAmount amount)
throws RemoteException, InsufficientFundsException;
public void credit(MoneyAmount amount) throws RemoteException;
}
Home Interface
• life cycle and bean look-up methods
• not used by message-driven beans
import java.rmi.RemoteException;
import java.ejb.CreateException;
import java.ejb.FinderException; // BMP entity bean only
public interface xxxHome extends javax.ejb.EJBHome {
public xxx create(...) throws RemoteException,
CreateException;
// BMP entity bean only below
public xxxPK findByPrimaryKey(...) throws
RemoteException, FinderException;
}
Home Interface Example
package account;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.FinderException;
public interface AccountHome extends javax.ejb.EJBHome {
public Account create(String name, String ssNumber,
MoneyAmount initialBalance)
throws RemoteException, CreateException;
public findByPrimaryKey(AccountPK pk)
throws RemoteException, FinderException;
}
Generic Enterprise Bean Class
public class xxxBean implements javax.ejb.zzzBean {
// … >>> business methods here <<<…
public … ejbCreate(…) {…}
public void ejbRemove() {}
// context setting
public void setzzzContext(javax.ejb.zzzContext ctx) {}
// etc.
}
EntityBean Class
public class xxxBean implements javax.ejb.EntityBean {
// …>>> public instance variables from persisted storage <<<…
// … >>> business methods here <<<…
public xxxPK ejbCreate(…some key...) {…; return null;}
public void ejbPostCreate(…some key...) {}
public void ejbActivate() {}
public void ejbPassivate() {}
public void ejbRemove() {}
public void setEntityContext(javax.ejb.EntityContext ctx) {}
public void unsetEntityContext() {}
public void ejbLoad() {}
public void ejbStore() {}
}
EntityBean Example, Part 0
// AccountPK.java:
package account;
public class AccountPK implements java.io.Serializable {
public String id;
public int hashCode( ){
return // integer hash of id;
}
public boolean equals(Object obj){
if(obj instanceof AccountPK){
return (id == ((AccountPK)obj).id);
}
return false;
}
public String toString(){
return id;
}
}
EntityBean Example, Part 1
// AccountBean.java:
package account:
public class AccountBean implements javax.ejb.EntityBean {
private static int count=0;
public String id;
public String name;
public String ssNumber;
public MoneyAmount balance;
public void debit(BigDecimal amount)
throws RemoteException, InsufficientFundsException {
if (balance.compareTo(amount) > 0)
balance.Decrement(amount);
else
raise InsufficientFundsException;
}
//…continued
EntityBean Example, Part 2
public void credit(MoneyAmount amount) throws RemoteException {
balance.Increment(amount);
}
public AccountPK ejbCreate(String name, String ssNumber,
MoneyAmount initialBalance) {
this.name = name; // check for errors???
this.ssNumber = ssNumber;
balance = new MoneyAmount(initialBalance);
count += 1; // ???
id = “123456-” + count; // ???
return null;
}
public void ejbPostCreate(String name, String ssNumber,
MoneyAmount initialBalance) {}
//…continued
EntityBean Example, Part 3
public void ejbActivate() {}
public void ejbPassivate() {}
public void ejbRemove() {}
public void setEntityContext(javax.ejb.EntityContext ctx) {}
public void unsetEntityContext() {}
public void ejbLoad() {}
public void ejbStore() {}
}
SessionBean Class
public class xxxBean implements javax.ejb.SessionBean {
// … >>> business methods here <<<…
public ... ejbCreate(...) {…; return null;}
public void ejbActivate() {}
public void ejbPassivate() {}
public void ejbRemove() {}
public void setSessionContext(javax.ejb.SessionContext ctx) {}
}
SessionBean Example, Part 0
from: Enterprise JavaBeans, R. Monson-Haefel, O’Reilly, 2000.
// TravelAgent.java:
// imports...
public interface TravelAgent extends javax.ejb.EJBObject{
public String [] listCabins(int shipID, int bedCount)
throws RemoteException;
}
// TravelAgent???.java:
// imports...
public interface TravelAgent??? extends javax.ejb.EJB???{
public TravelAgent create()
throws RemoteException, CreateException;
}
SessionBean Example, Part 1
from: Enterprise JavaBeans, R. Monson-Haefel, O’Reilly, 2000.
// TravelAgentBean.java
// imports...
public class TravelAgentBean implements javax.ejb.SessionBean {
public String [] listCabins(int shipID, int bedCount) {
try {
javax.naming.Context jc = new InitialContext();
CabinHome home = (CabinHome)
javax.rmi.PortbleRemoteObject.narrow(
(Object) jc.lookup(“CabinHome”), CabinHome.class);
Vector list = new Vector();
CabinPK pk = new CabinPK();
Cabin cabin;
// continued...
SessionBean Example, Part 2
for (int i=0; ; i++)
pk.id = i;
try
{
cabin = home.findByPrimaryKey(pk);
} catch (javax.ejb.FinderException fe) {break;}
if (cabin.getShip() == shipID &&
cabin.getBedCount() == bedCount) {
list.addElement((String) i+”, ” +cabin.getName() +
“, “ + cabin.getDeckLevel());
}
}
String [] strings = new String[list.size()];
list.copyInto(strings);
return strings;
} catch (Exception e) {throw new EJBException(e);}
}
// continued...
SessionBean Example, Part 3
public TravelAgent ejbCreate() {return null;}
public void ejbActivate() {}
public void ejbPassivate() {}
public void ejbRemove() {}
public void setSessionContext(javax.ejb.SessionContext ctx) {}
}
MessageDrivenBean Class
public class xxxBean implements javax.ejb.MessageDrivenBean,
javax.jms.MessageListener {
public void ejbCreate(...) {…}
public void ejbRemove() {}
public void onMessage(javax.jms.Message message) {…}
public void setMessageDrivenContext(
javax.ejb.MessageDrivenContext mdc) {}
}
Deployment Descriptors
as of EJB 1.1, tags in XML files (ejb-jar.xml)
part of a jar file, which defines a bean
declares behavior externally vs. inside code
allows deployer to change way code works by
changing environment, including naming
lists dependencies
groups beans
Deployment Descriptors:
EntityBean Example, Part 1
from: Enterprise JavaBeans, R. Monson-Haefel, O’Reilly, 2000.
<ejb-jar>
<enterprise-beans>
<entity>
<description>This Cabin enterprise bean entity represents a cabin on a cruise ship.</description>
<ejb-name>CabinBean</ejb-name>
<home>com.titan.cabin.CabinHome</home>
<remote>com.titan.cabin.Cabin</remote>
<ejb-class>com.titan.cabin.CabinBean</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>com.titan.cabin.CabinPK</prim-key-class>
<reentrant>False</reentrant>
<cmp-field><field-name>id</field-name></cmp-field>
<cmp-field><field-name>name</field-name></cmp-field>
<cmp-field><field-name>deckLevel</field-name></cmp-field>
<cmp-field><field-name>ship</field-name></cmp-field>
<cmp-field><field-name>bedCount</field-name></cmp-field>
</entity> </enterprise-beans>
Deployment Descriptors:
EntityBean Example, Part 2
<assembly-descriptor>
<security-role>
<description>
This role represents everyone who is allowed full access
to the cabin bean.
</description>
<role-name>everyone</role-name>
</security-role>
<method-permission>
<role-name>everyone</role-name>
<method>
<ejb-name>CabinBean</ejb-name>
<method-name>*</method-name>
</method>
</method-permission>
Deployment Descriptors:
EntityBean Example, Part 3
<container-transaction>
<method>
<ejb-name>CabinBean</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
Deployment Descriptors:
SessionBean Example, Part 1
from: Enterprise JavaBeans, R. Monson-Haefel, O’Reilly, 2000.
<ejb-jar>
<enterprise-beans>
<session>
<ejb-name>TravelAgentBean</ejb-name>
<home>com.titan.travelagent.TravelAgentHome</home>
<remote>com.titan.travelagent.TravelAgent</remote>
<ejb-class>com.titan.travelagent.TravelAgentBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<ejb-ref>
<ejb-ref-name>ejb/CabinHome</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
<home>com.titan.cabin.CabinHome</home>
<remote>com.titan.cabin.Cabin</remote>
</ejb-ref> </session> </enterprise-beans>
Deployment Descriptors:
SessionBean Example, Part 2
<assembly-descriptor>
<security-role>
<description>
This role represents everyone who is allowed full access
to the cabin bean.
</description>
<role-name>everyone</role-name>
</security-role>
<method-permission>
<role-name>everyone</role-name>
<method>
<ejb-name>TravelAgentBean</ejb-name>
<method-name>*</method-name>
</method>
</method-permission>
Deployment Descriptors:
SessionBean Example, Part 3
<container-transaction>
<method>
<ejb-name>TravelAgentBean</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
Deployment
put
all class files and bean descriptors in a jar file
make a folder called META-INF at root of source tree
copy ejb-jar.xml to META-INF
then:
jar cf com\titan\com\travelagent\*.class META-INF\ejb-jar.xml
Use
the deployment tool provided by the EJB server
vendor to configure the environment
For Sun’s J2EE Reference Implementation:
deploytool:
generates .ear file which includes server-specific
descriptor (sun-j2ee-ri.xml) and application-specific descriptor
Fill in the fields with information pertinent to the bean
deploy to your EJB server host
Client Application
uses the bean(s)
via the remote and home interfaces
never via the bean class
steps
find the naming service
find the bean(s)
use home and business methods as desired
Client Application:
Example, Part 1
from: Enterprise JavaBeans, R. Monson-Haefel, O’Reilly, 2000.
package com.titan.travelagent;
import com.titan.cabin.CabinHome;
import com.titan.cabin.Cabin;
import com.titan.cabin.CabinPK;
import javax.naming.InitialContext;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.ejb.CreateException;
import java.rmi.RemoteException;
import java.util.Properties;
// continued...
Client Application:
Example, Part 2
public class Client_1 {
public static int SHIP_ID = 1;
public static int BED_COUNT = 3;
public static void main(String [] args){
try {
Context jndiContext = getInitialContext();
Object obj = jndiContext.lookup("ejb/TravelAgentHome");
TravelAgentHome home = (TravelAgentHome)
javax.rmi.PortableRemoteObject.narrow(obj, TravelAgentHome.class);
TravelAgent reserve = home.create();
// continued...
Client Application:
Example, Part 3
// Get a list of all cabins on ship 1 with a bed count of 3.
String list [] = reserve.listCabins(SHIP_ID,BED_COUNT);
for(int i = 0; i < list.length; i++){
System.out.println(list[i]);
}
} catch(java.rmi.RemoteException re){re.printStackTrace();}
catch(Throwable t){t.printStackTrace();}
}
static public Context getInitialContext() throws Exception {
Properties p = new Properties();
// ... Specify the JNDI properties specific to the vendor.
return new InitialContext();
}
}
Homework 5
Programming assignment #2
tasks
implement Account beans for savings and checking
accounts; use student id for account number prefix
implement transferMoney bean
implement client to transfer money from one account to
another
deploy (don’t create/delete table) & run
use
use
container-managed persistence
JNDI for databases: jndi/SavingsAccountDB and
jndi/CheckingAccountDB