EJB Session Beans
“Controlling your application”
(the business logic)
EJB ContainerWeb Container
View
Model 2 with J2EE EJB’s
Control Model
Session BeanWeb
Server
Servlet (request handler)
JSP(view builder)
Session EJB
Model Two Architecture
JavaBean
JavaBean
Entity EJB
<<forward>>
HTTP Request
HTTP Response
Entity EJB
JavaBean
<<creates>>
Session EJB
Advantages
Automatic Transaction management Resource management Security Modularity Simple programming interface
Clients View of Session EJB
Implementation
<<EJB>>
Client Interface
Remote Interface
Bean(Implementation)
ClientProgram
LocalInterface
Session EJB Developers View
<<EJB Session Bean>>OrderControl
Client Interface Implementation
<<Realization>>CustomerOrderEJB
+startOrder() +addItem()+deleteItem()+checkout()+cancelOrder()+checkOrder()
<<Remote Interface>>CustomerOrderRemote
+startOrder() +addItem()+deleteItem()+checkout()+cancelOrder()+checkOrder()
Remote vs. Local Entity Beans
Remote Session EJB Anywhere on the network Pass by value
Local EJB are faster but not as flexible, scalable and adaptable On same server as Session Beans No network traffic Pass by reference
Please Use
Whenever Possible!!!
Stateful vs. Stateless Transactions
A stateless transactions is One call to server Does not the save transaction state data
No memory is allocated in the pool for each session with a client
EJB is never passivated or activated
Stateful transaction Used for multi-step transactions Saves state data for each client session
Memory is allocated in pool for each client session EJB is passivated and activated
Please Use
Whenever Possible!!!
Stateless Session Bean LifeCycle
Ready in pool
timeout, @PreDestroy,
Does not exist
Class.newInstance(),@PostConstruct
Business method
Stateful EJB Session Bean Lifecycle
Does not exist
Ready in pool Passive
Timeout, @PreDestroy
Class.newInstance(),@PostConstruct()
business methods
@PrePassivate()
@PostActivate ()
System exception
Timeout, @PreDestroy
Guidelines for use
Coarse-Grained better than Finely-Grained
Use stateless whenever possible
Use the remote interface for flexibility
Locating an EJB
Must use a directory service and DNS to locate network objects
JNDI (Java Naming Directory Interface) Programming interface to the directory
services to locate any object in a network (files, EJBs, web services, etc.)
Directory Service names Most use X.500 naming standard
c (country name)o (organizationName)
ou (organizationUnitName)l (localityName)
cn (commonName)dc (domainComponent)
uid (userid)
Each type of directory service has it’s own naming syntax LDAP example
cn=Martin Bond, ou=Authors, o=SAMS, c=us
Microsoft Active Directory Servicecn=Martin Bond/ou=Authors/o=SAMS/c=us
JNDI names
JNDI names are not specific to directory services
JNDI maps universal name to specific directory service syntax
Typical JNDI name
“SAMS/authors/Martin Bond”
Outline for using remote EJBs
1. Get initial JNDI naming context
2. Use JNDI to lookup and find EJB
3. Call business function
Defining the JNDI name
Calling business methods
try{ InitialContext initialContext = new InitialContext(); // get jndi context String jndiName = BusinessRulesBean.RemoteJNDIName; ; // get jndi name // lookup and get remote interface for session bean BusinessRulesRemote businessRulesRemote = (BusinessRulesRemote) initialContext.lookup(jndiName );
// call any business methods defined in the interface Person person = businessRulesRemote.login(username, password); …
}catch (NamingException ne) { throw new MyAppException( “Session EJB not found, jndiname=” + jndiName));}
catch (Exception e) { throw new MyAppException(ee.getMessage());}
Calling business methods
try{ InitialContext initialContext = new InitialContext(); // get jndi context String jndiName = BusinessRulesBean.RemoteJNDIName; ; // get jndi name // lookup and get remote interface for session bean BusinessRulesRemote businessRulesRemote = (BusinessRulesRemote) initialContext.lookup(jndiName );
// call any business methods defined in the interface Person person = businessRulesRemote.login(username, password); …
}catch (NamingException ne) { throw new MyAppException( “Session EJB not found, jndiname=” + jndiName));}
catch (Exception e) { throw new MyAppException(ee.getMessage());}
Calling business methods
try{ InitialContext initialContext = new InitialContext(); // get jndi context String jndiName = BusinessRulesBean.RemoteJNDIName; ; // get jndi name // lookup and get remote interface for session bean BusinessRulesRemote businessRulesRemote = (BusinessRulesRemote) initialContext.lookup(jndiName );
// call any business methods defined in the interface Person person = businessRulesRemote.login(username, password); …
}catch (NamingException ne) { throw new MyAppException( “Session EJB not found, jndiname=” + jndiName));}
catch (Exception e) { throw new MyAppException(ee.getMessage());}
Calling business methods
try{ InitialContext initialContext = new InitialContext(); // get jndi context String jndiName = BusinessRulesBean.RemoteJNDIName; ; // get jndi name // lookup and get remote interface for session bean BusinessRulesRemote businessRulesRemote = (BusinessRulesRemote) initialContext.lookup(jndiName );
// call any business methods defined in the interface Person person = businessRulesRemote.login(username, password); …
}catch (NamingException ne) { throw new MyAppException( “Session EJB not found, jndiname=” + jndiName));}
catch (Exception e) { throw new MyAppException(ee.getMessage());}
Calling business methods
try{ InitialContext initialContext = new InitialContext(); // get jndi context String jndiName = BusinessRulesBean.RemoteJNDIName; ; // get jndi name // lookup and get remote interface for session bean BusinessRulesRemote businessRulesRemote = (BusinessRulesRemote) initialContext.lookup(jndiName );
// call any business methods defined in the interface Person person = businessRulesRemote.login(username, password); …
}catch (NamingException ne) { throw new MyAppException( “Session EJB not found, jndiname=” + jndiName));}
catch (Exception e) { throw new MyAppException(e.getMessage());}
Insert object into Datastore
public void addBranch() { // create a branch java bean Branch branch = new Branch(); branch.setName(“Bank of Nauvoo”); branch.setPhone(“203-356-1426”);
// inserts a branch into the database entityManager.persist(branch); }
Update Object in Datastore
public void renameBranch(String branchid, String newName) { // get branch by its Primary Key from datastore Branch branch = (Branch) entityManager.find(Branch.class, branchid); // update the branch branch.setBranchname(newName); entityManager.merge(branch);}
Delete Object from Datastore
public void deleteBranch(String branchid) { // get branch by its Primary Key from datastore Branch branch = (Branch) entityManager.find(Branch.class, branchid); // Delete the branch entityManager.remove(branch);}
Query Object/s from Datastore
public Collection<Branch> getBranches(String name){
// Define query prepared statement String ejbql = "SELECT b FROM Branch b WHERE b.branchname LIKE :branchname”; // Create query object Query query = entityManager.createQuery(ejbql);
// Substitute value to search for in prepared statement query.setParameter("branchname", searchValue); // Execute query to get list of branches List<Branch>branches = query.getResultList();
return branches;}
Entity Bean query language (ejb-ql)
select_clause from_clause [where_clause]
SELECT jFROM Job AS jWHERE j.jobType = ‘web development’
From Examples:
SELECT j.*FROM Job AS jWHERE j.jobType = ‘web development’;
SQL equivalent:
Entity Bean query language (ejb-ql)
select_clause from_clause [where_clause]
SELECT sFROM Job AS j, INNER JOIN j.Skills AS s
From Examples:
SELECT s.*FROM Job AS j INNER JOIN JobSkill AS sON j.FK_skillID = s.skillID
SQL equivalent:
Entity Bean query language (ejb-ql)
SELECT OBJECT o FROM Customer AS c, INNER JOIN c.orders AS o, INNER JOIN o.items AS IWHERE c.lastName = ‘FLINTSTONE”
Where Examples:
SELECT C.*, O.*, I.* FROM Customer C INNER JOIN Orders O INNER JOIN Items ION C.customerId = O.FK_CustomerIdON O.FK_ItemId = I.ItemIdWHERE C.lastName = ‘FLINSTONE’;
SQL equivalent:
Inner Joins of Entities