at-m42:lecture15
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
at-m42:lecture15 [2009/04/25 09:41] – eechris | at-m42:lecture15 [2011/01/14 12:45] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
~~SLIDESHOW~~ | ~~SLIDESHOW~~ | ||
- | ====== | + | ====== |
In principle, the business logic of an enterprise application could be performed by //domain objects// which implement a model of the business concept as Plain-Old Java Objects (POJOs). | In principle, the business logic of an enterprise application could be performed by //domain objects// which implement a model of the business concept as Plain-Old Java Objects (POJOs). | ||
Line 15: | Line 15: | ||
* [[#The key business tier services]] | * [[#The key business tier services]] | ||
* [[#The Java solution: Enterprise Java Beans]] | * [[#The Java solution: Enterprise Java Beans]] | ||
- | * [[# | + | * [[# |
* [[#Is the Java solution a good solution?]] | * [[#Is the Java solution a good solution?]] | ||
Line 107: | Line 107: | ||
* **[[#The key business tier services]]** | * **[[#The key business tier services]]** | ||
* [[#The Java solution: Enterprise Java Beans]] | * [[#The Java solution: Enterprise Java Beans]] | ||
- | * [[# | + | * [[# |
* [[#Is the Java solution a good solution?]] | * [[#Is the Java solution a good solution?]] | ||
Line 136: | Line 136: | ||
* Or simply to be stored in non-volatile memory. | * Or simply to be stored in non-volatile memory. | ||
* Your business objects want this to //just happen//! | * Your business objects want this to //just happen//! | ||
- | * **Transparent persistence**, | + | * **Transparent persistence**, |
* but persistence should also be a key part of transaction management and is a cornerstone of data integrity. | * but persistence should also be a key part of transaction management and is a cornerstone of data integrity. | ||
Line 172: | Line 172: | ||
* [[#The key business tier services]] | * [[#The key business tier services]] | ||
* **[[#The Java solution: Enterprise Java Beans]]** | * **[[#The Java solution: Enterprise Java Beans]]** | ||
- | * [[# | + | * [[# |
* [[#Is the Java solution a good solution?]] | * [[#Is the Java solution a good solution?]] | ||
Line 273: | Line 273: | ||
* [[#The key business tier services]] | * [[#The key business tier services]] | ||
* [[#The Java solution: Enterprise Java Beans]] | * [[#The Java solution: Enterprise Java Beans]] | ||
- | * **[[# | + | * **[[# |
* [[#Is the Java solution a good solution?]] | * [[#Is the Java solution a good solution?]] | ||
Line 282: | Line 282: | ||
* Each method in the remote interface must declare java.rmi.RemoteException in its throws clause in addition to any application-specific exceptions. | * Each method in the remote interface must declare java.rmi.RemoteException in its throws clause in addition to any application-specific exceptions. | ||
* Any object passed as an argument or return value (either directly or embedded within a local object) must be a valid RMI-IIOP data type (this includes other EJB objects). | * Any object passed as an argument or return value (either directly or embedded within a local object) must be a valid RMI-IIOP data type (this includes other EJB objects). | ||
- | * In EJB 3, the details can be left to the container: interface is a plain-old-Java interface // | ||
- | | ||
- | ===== Remote interface for the DateHere EJB ===== | ||
- | <code java 1|Example 1: Remote interface for the DateHereBean (at-m42/ | + | ===== Remote interface for the DateHere EJB (EJB 2 version) ===== |
- | extern> http:// | + | |
+ | <code java 1| Example 1: Remote interface for the DateHereBean (EJB 2)> | ||
+ | import java.rmi.*; | ||
+ | import javax.ejb.*; | ||
+ | |||
+ | package | ||
+ | |||
+ | public interface TimeHere extends EJBObject { | ||
+ | public String getTimeHere() throws RemoteException; | ||
+ | } | ||
</ | </ | ||
+ | |||
+ | ===== Remote interface for the DateHere EJB (EJB 3 version) ===== | ||
+ | |||
+ | In EJB 3, the details can be left to the container: interface is a plain-old-Java interface // | ||
+ | | ||
+ | <code java 1|Example 2: Remote interface for the DateHereBean (at-m42/ | ||
+ | extern> http:// | ||
+ | </ | ||
+ | |||
===== The Home interface ===== | ===== The Home interface ===== | ||
Line 295: | Line 310: | ||
* It can define create methods, to create instances of EJBs | * It can define create methods, to create instances of EJBs | ||
* //finder// methods, which locate existing EJBs and are used for Entity Beans only. | * //finder// methods, which locate existing EJBs and are used for Entity Beans only. | ||
+ | | ||
===== The Home Interface Specification ===== | ===== The Home Interface Specification ===== | ||
Line 306: | Line 322: | ||
===== Home interface for the TimeHere (EJB 2) ===== | ===== Home interface for the TimeHere (EJB 2) ===== | ||
- | <code java 1|Example | + | <code java 1|Example |
- | extern> http:// | + | extern> http:// |
</ | </ | ||
===== Business Logic ===== | ===== Business Logic ===== | ||
- | * You can now implement the business logic. When you create your EJB implementation class, you must follow these guidelines: | + | You can now implement the business logic. When you create your EJB implementation class, you must follow these guidelines: |
- | | + | |
- | The class must implement an EJB interface (either javax.ejb.SessionBean or javax.ejb.EntityBean). | + | |
- | The class should define methods that map directly to the methods in the Remote interface. Note that the class does not implement the Remote interface; it mirrors the methods in the Remote interface but does not throw java.rmi.RemoteException. | + | |
- | Define one or more ejbCreate( ) methods to initialize your EJB. | + | |
- | The return value and arguments of all methods must be valid RMI-IIOP data types. | + | |
- | PerfectTimeBean (Session Bean) | + | |
- | // Simple Stateless Session Bean// that returns current system time.import java.rmi.*; | + | |
- | } | + | |
- | Deployment Descriptor | + | |
- | An XML file that describes the EJB component. Should be stored in a file called ejb-jar.xml.<? | + | |
- | Deploying the EJB | + | |
- | The files must be archived inside a standard Java Archive (JAR) file. The deployment descriptors should be placed inside the /META-INF sub-directory of the Jar file. | + | |
- | Once the EJB component is defined in the deployment descriptor, the deployer should then deploy the EJB component into the EJB Container. | + | |
- | The deployment process is quite “GUI intensive” and specific to the individual EJB Container. | + | |
- | The deployment process creates some client stubs for calling the EJB component. These classes should be placed on the classpath of the client application. | + | |
- | When a client program wishes to invoke an EJB, it must look up the EJB component inside JNDI and obtain a reference to the home interface of the EJB component. The Home interface is used to create an instance of the EJB. | + | |
- | The Client | + | |
- | Here a simple Java program but could just as easily be a servlet, a JSP or even a CORBA or RMI distributed object.// Client program for PerfectTimeBeanpublic class PerfectTimeClient { public static void main(String[] args) throws Exception { // Get a JNDI context using | + | |
- | The Client … cont | + | |
- | // Create a remote object from the home interface: | + | |
- | ===== | + | ===== TimeHereBean (Session Bean) EJB 2 Version |
- | * [[#An example]] | + | <code java 1| Example 4: SessionBean implemented using EJB 2 conventions> |
- | * [[#The key business tier services]] | + | // Simple Stateless Session Bean |
- | * [[#The Java solution: Enterprise Java Beans]] | + | // that returns current system time. |
- | * [[# | + | |
- | * **[[#Is the Java solution a good solution? | + | |
+ | package uk.ac.swan.atm42.ejb; | ||
+ | import java.rmi.*; | ||
+ | import javax.ejb.*; | ||
- | ===== Is the Java Solution a Good Solution? ===== | + | public class TimeHereBean implements SessionBean { |
- | During 2004, the developer community decided that the answer is probably no. | + | |
- | We will discuss this issue, and some of the alternatives in the final lecture. | + | // |
- | Eckel’s PerfectTime session | + | public String getTimeHere() { |
- | It’s a good example of a bad design if nothing else! | + | return new Date().toString(); |
+ | | ||
+ | // EJB methods | ||
+ | public void ejbCreate() throws CreateException {} | ||
+ | public void ejbRemove() {} | ||
+ | public void ejbActivate() {} | ||
+ | public void ejbPassivate() {} | ||
+ | public void setSessionContext(SessionContext ctx) { | ||
+ | sessionContext = ctx; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
- | ===== | + | ===== Version 3 EJBs ===== |
- | * [[#An example]] | + | * Most of the code in previous |
- | * [[#The key business tier services]] | + | * EJB uses Java 5 annotations to enable the container to provide its own hooks. |
- | * [[# | + | * EJB is now a "Plain Old Java Object" |
- | * [[# | + | |
- | * [[#Is the Java solution a good solution?]] | + | |
+ | ===== TimeHereBean (Session Bean) EJB 3 Version ===== | ||
+ | <code java 1| Example 5: SessionBean implemented using EJB 3 conventions (at-m42/ | ||
+ | extern> http:// | ||
+ | </ | ||
+ | ===== Deployment Descriptor (EJB 2) ===== | ||
- | ---- | + | An XML file that describes the EJB component. Should be stored in a file called '' |
+ | <code xml 1|Example 6: Deployment Descriptor for the TimeHereBean (not required in EJB 3 containers) (at-m42/ | ||
+ | extern> http:// | ||
+ | </ | ||
+ | ===== Deploying the EJB ===== | ||
- | [[Home]] | [[lecture14|Previous Lecture]] | [[Lectures]] | [[lecture16|Next Lecture]] | + | * The files must be archived inside a standard Java Archive (JAR) file. The deployment descriptors (if used) should be placed inside the ''/ |
+ | * Once the EJB component is defined in the deployment descriptor, the deployer should then deploy the EJB component into the EJB Container. | ||
+ | * The deployment process is quite "GUI intensive2 and specific to the individual EJB Container. | ||
+ | * The deployment process creates some client stubs for calling the EJB component. These classes should be placed on the CLASSPATH of the client application. | ||
+ | * When a client program wishes to invoke an EJB it must look up the EJB component inside JNDI and obtain a reference to the home interface of the EJB component. The Home interface is used to create an instance of the EJB. | ||
+ | |||
+ | ===== The Client ===== | ||
+ | |||
+ | * Here a simple Java program but could just as easily be a servlet, a JSP or even a CORBA or RMI distributed object. | ||
+ | |||
+ | <code java 1|Example 7: Client program for TimeHereBean (at-m42/ | ||
+ | extern> http:// | ||
+ | </ | ||
+ | <code java 1| Example 7: Client program for TimeHereBean (at-m42/ | ||
+ | extern> http:// | ||
+ | </ | ||
===== Lecture Content ===== | ===== Lecture Content ===== | ||
Line 369: | Line 403: | ||
* [[#The key business tier services]] | * [[#The key business tier services]] | ||
* [[#The Java solution: Enterprise Java Beans]] | * [[#The Java solution: Enterprise Java Beans]] | ||
- | * [[# | + | * [[# |
* **[[#Is the Java solution a good solution? | * **[[#Is the Java solution a good solution? | ||
- | |||
- | |||
===== Is the Java Solution a Good Solution? ===== | ===== Is the Java Solution a Good Solution? ===== | ||
- | During 2004, the developer community decided that the answer is probably no. | ||
- | We will discuss this issue, and some of the alternatives in the final lecture. | ||
- | Eckel’s PerfectTime session EJB example gives a flavour of the complexity! To run the example, you’ll need an implementation of a J2EE container to which you can deploy the bean. | ||
- | It’s a good example of a bad design if nothing else! | ||
- | ===== Lecture | + | * During 2004, the developer community decided that the answer is probably no. |
+ | * EJB 3 was a response to this, and uses annotations to simplify it. | ||
+ | * We will discuss this issue, and some of the alternatives in the final lecture. | ||
+ | * The TimeHere session EJB example gives a flavour of the complexity! To run the example, you’ll need an implementation of a Java EE container (e.g. Glassfish) to which you can deploy the bean. | ||
+ | |||
+ | ===== Lecture | ||
* [[#An example]] | * [[#An example]] | ||
* [[#The key business tier services]] | * [[#The key business tier services]] | ||
* [[#The Java solution: Enterprise Java Beans]] | * [[#The Java solution: Enterprise Java Beans]] | ||
- | * [[# | + | * [[# |
* [[#Is the Java solution a good solution?]] | * [[#Is the Java solution a good solution?]] | ||
Line 392: | Line 425: | ||
---- | ---- | ||
- | [[Home]] | [[lecture14|Previous Lecture]] | [[Lectures]] | [[lecture16|Next Lecture]] | + | [[Home]] | [[lecture15|Previous Lecture]] | [[Lectures]] | [[lecture16|Next Lecture]] |
+ |
at-m42/lecture15.1240652508.txt.gz · Last modified: 2011/01/14 12:24 (external edit)