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