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 10:01] – 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 uk.ac.swan.atm42.ejb; | ||
+ | |||
+ | 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:// |
</ | </ | ||
Line 315: | Line 331: | ||
- The class must be '' | - The class must be '' | ||
- The class must implement an EJB interface (either '' | - The class must implement an EJB interface (either '' | ||
- | - 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 '' | + | - 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 '' |
- | | + | |
- The return value and arguments of all methods must be valid RMI-IIOP data types. | - The return value and arguments of all methods must be valid RMI-IIOP data types. | ||
- | ===== PerfectTimeBean | + | ===== TimeHereBean |
- | <code java 1: Example | + | |
+ | <code java 1| Example | ||
// Simple Stateless Session Bean | // Simple Stateless Session Bean | ||
- | // that returns current system time. | + | // that returns current system time. |
- | import java.rmi.*; | + | package uk.ac.swan.atm42.ejb; |
+ | |||
+ | import java.rmi.*; | ||
import javax.ejb.*; | import javax.ejb.*; | ||
- | + | ||
public class TimeHereBean implements SessionBean { | public class TimeHereBean implements SessionBean { | ||
- | | + | |
- | | + | //return time here |
- | public String getTimeHere() { | + | public String getTimeHere() { |
return new Date().toString(); | return new Date().toString(); | ||
- | } | + | |
- | // EJB methods | + | // EJB methods |
- | public void ejbCreate() throws CreateException {} | + | public void ejbCreate() throws CreateException {} |
- | public void ejbRemove() {} | + | public void ejbRemove() {} |
- | public void ejbActivate() {} | + | public void ejbActivate() {} |
- | public void ejbPassivate() {} | + | public void ejbPassivate() {} |
- | public void setSessionContext(SessionContext ctx) { | + | public void setSessionContext(SessionContext ctx) { |
- | sessionContext = ctx; | + | sessionContext = ctx; |
} | } | ||
} | } | ||
Line 350: | Line 368: | ||
* EJB is now a "Plain Old Java Object" | * EJB is now a "Plain Old Java Object" | ||
- | ===== PerfectTimeBean | + | ===== TimeHereBean |
- | <code java 1: Example | + | <code java 1| Example |
- | extern> http:// | + | 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 ===== | ||
+ | * 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. | ||
- | Deployment Descriptor | + | ===== The Client ===== |
- | 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. | + | <code java 1|Example 7: Client program for TimeHereBean |
- | The deployment process is quite “GUI intensive” and specific to the individual EJB Container. | + | extern> http://www.cpjobling.org.uk/~eechris/at-m42/Examples/lecture15/ |
- | 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. | + | <code java 1| Example 7: Client program for TimeHereBean |
- | The Client | + | extern> http://www.cpjobling.org.uk/~eechris/at-m42/ |
- | 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 { | + | </ |
- | The Client … cont | + | |
- | | + | |
===== Lecture Content ===== | ===== Lecture Content ===== | ||
Line 376: | 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? ===== | ||
+ | * 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. | ||
- | ===== Is the Java Solution a Good Solution? ===== | + | ===== Lecture |
- | 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 | + | |
* [[#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 399: | Line 425: | ||
---- | ---- | ||
- | [[Home]] | [[lecture14|Previous Lecture]] | [[Lectures]] | [[lecture16|Next Lecture]] | + | [[Home]] | [[lecture15|Previous Lecture]] | [[Lectures]] | [[lecture16|Next Lecture]] |
- | ===== Lecture Content ===== | ||
- | |||
- | * [[#An example]] | ||
- | * [[#The key business tier services]] | ||
- | * [[#The Java solution: Enterprise Java Beans]] | ||
- | * [[# | ||
- | * **[[#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 Content ===== | ||
- | |||
- | * [[#An example]] | ||
- | * [[#The key business tier services]] | ||
- | * [[#The Java solution: Enterprise Java Beans]] | ||
- | * [[# | ||
- | * [[#Is the Java solution a good solution?]] | ||
- | |||
- | |||
- | |||
- | ---- | ||
- | [[Home]] | [[lecture14|Previous Lecture]] | [[Lectures]] | [[lecture16|Next Lecture]] |
at-m42/lecture15.1240653716.txt.gz · Last modified: 2011/01/14 12:24 (external edit)