EJB Session Beans

Preview:

DESCRIPTION

EJB Session Beans. “ Controlling your application ” (the business logic). Model 2 with J2EE EJB ’ s. Model Two Architecture. EJB Container. Web Container. View. Control. Model. Web Server. Servlet (request handler). Entity EJB. Entity EJB. HTTP Request. Session EJB. Session Bean. - PowerPoint PPT Presentation

Citation preview

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

Recommended