Java Enterprise: Ein erstes Beispiel

Aus Wikibooks

Ein Beispiel hilft Zusammenhänge besser zu verstehen. Wir werden dieses Beispiel in den weiteren Kapiteln sukzessive weiterentwickeln.

Wizard Fenster (EJB Project)[Bearbeiten]

In Eclipse kann man über "File -> New -> Project..." den Projekt Wizard starten. Für das erste Beispiel wählen wir unter der Kategorie "EJB" das "EJB Project" aus. Im ersten Dialog trägt man in das Feld "Project name" zum Beispiel "EJB_Project" ein. Das Häkchen bei "Use default Location" lässt man aktiviert. In der Drop Down Box sollte jetzt die zuvor eingerichtete Target Runtime (GlassFish Server Open Source Edition 3 (Java EE 6)) erscheinen. Falls nicht kann man über "New Runtime..." diese einrichten. Im Feld "EJB module Version" wählt man die Version 3.1 und im Feld Configuration lässt man den Eintrag "Default Configuration for GlassFish Server". Zusätzlich setzt man den Haken bei EAR Membership und trägt beim Namen beispielsweise "EJB_ProjectEAR" ein.

Wizard Fenster (Java)[Bearbeiten]

In diesem Dialog werden die Verzeichnisse für die Sourcen verwaltet. Standardmässig sollte im Fenster "Source folders on build path:" das Verzeichnis "ejbModule" erscheinen und im Feld "Default output folder" "build\classes".

Wizard Fenster (EJB Module)[Bearbeiten]

Den Haken bei "Create an EJB Client JAR module to hold the client interfaces and classes". Dies resultiert in einem extra Eclipse Projekt, welches später den Clients hinzugefügt werden kann.

Mit "Finish" schliesst man den Wizard ab. In Eclipse sieht man nun im "Project Explorer" auf der linken Seite die Projektstruktur. Sie beinhaltet drei Projekte:

  1. EJB_Projekt
  2. EJB_ProjektClient
  3. EJB_ProjektEAR

Erstellen der Bean[Bearbeiten]

Im "EJB_Projekt" den Punkt "Deployment Descriptor" expandieren und mit der rechten Maustaste auf den Unterpunkt "Session Beans" klicken. Im Kontextmenü nun "New -> Session Bean" wählen. Im Dialog "Create EJB 3.x Session Bean" die folgenden Angaben eintragen bzw. ergänzen:

Feld Eintrag
Project: EJB_Projekt
Source Folder: \EJB_Projekt\ejbModule
Java Package: de.wikibooks.javaee
Class name: StatelessSession
Superclass:
State type: Stateless
Create busines interface Haken bei "Remote und Local" setzen, den Haken bei "no interface" entfernen
Remote: de.wikibooks.javaee.StatelessSessionRemote
Local: de.wikibooks.javaee.StatelessSessionLocal

Im nächsten Dialog sollten die untenstehenden Einträge vorgenommen werden:

Feld Eintrag
Bean name: StatelessSession
Mapped name:
Transaction type Container
Interfaces de.wikibooks.javaee.StatelessSessionRemote & de.wikibooks.javaee.StatelessSessionLocal
Inherited abstract methods
Constructors from Superclass

Mit "Finish" kann der Dialog beendet werden. Eclipse erstellt daraufhin im Source Verzeichnis "ejbModule" das Package de.wikibooks.javaee mit der Klasse StatelessSession.java. Diese Klasse enthält folgenden Quellcode:

StatelessSession.java[Bearbeiten]

package de.wikibooks.javaee;

import javax.ejb.Stateless;

/**
 * Session Bean implementation class StatelessSession
 */
@Stateless
public class StatelessSession implements StatelessSessionRemote, StatelessSessionLocal {

    /**
     * Default constructor. 
     */
    public StatelessSession() {
        // TODO Auto-generated constructor stub
    }

}

Wir erweitern nun zunächst den Quellcode der beiden Interfaces. Beide Interfaces erhalten dieselbe Methode getAplusB(int a, int b);

StatelessSessionLocal.java[Bearbeiten]

package de.wikibooks.javaee;
import javax.ejb.Local;

@Local
public interface StatelessSessionLocal {
	
	public int getAplusB(int a, int b);

}

StatelessSessionRemote.java[Bearbeiten]

package de.wikibooks.javaee;
import javax.ejb.Remote;

@Remote
public interface StatelessSessionRemote {
	
	public int getAplusB(int a, int b);

}

Wir können nun zur Klasse StatelessSession.java zurückkehren. Inzwischen hat Eclipse erkannt, dass in den beiden Interfaces neue Methoden hinzugekommen sind, welche durch die Klasse implementiert werden müssen. Mit einem Klick auf den Marker am linken Rand, erscheint eine kleiner Dialog, welcher anbietet die benötigte Methode hinzuzufügen: "Add unimplemented methods".

Wir ersetzen das "return 0" durch "return a + b". Damit sieht die Klasse StatelessSession.java nun so aus:

StatelessSession.java[Bearbeiten]

package de.wikibooks.javaee;

import javax.ejb.Stateless;

/**
 * Session Bean implementation class StatelessSession
 */
@Stateless
public class StatelessSession implements StatelessSessionRemote, StatelessSessionLocal {

    /**
     * Default constructor. 
     */
    public StatelessSession() {
        // TODO Auto-generated constructor stub
    }

	@Override
	public int getAplusB(int a, int b) {
		return a + b;
	}

}

Der Standalone Client[Bearbeiten]

Um die Enterprise Java Bean zu testen, benötigen wir einen Client, der über die Interfaces eine Anfrage, stellt die Antwort erhält und ausgibt. Wir erstellen dazu ein neues Java Projekt. Über "File -> New -> Project" gelangen wir wieder in den Projekt Dialog. Diesmal wählen wir aus der Kategorie Java das "Java Project" aus. Mit "Next" bestätigen wir die Auswahl und geben im nächsten Dialog als Projektnamen "StandaloneClient" ein. Mit "Next" kommen wir zum "Java Settings" Dialog. Hier klicken wir auf den Reiter "Projects" und fügen mit "Add..." den EJB_ProjektClient zum Build Path hinzu. Mit "Finish" schliessen wir die Erstellung des Projektes ab. Eclipse fragt möglicherweise nach einem Perspektivenwechsel in die "Java" Perspektive. Diese Frage können wir mit "Yes" bestätigen. Die Java Perspektive unterscheidet sich ein wenig von der "Java EE" Perspektive. Ihr fehlen die Views "Markers", "Properties", "Servers", "Data Source Explorer", "Snippets" und "Progress". Dafür enthält die Java Perspektive die Views "Javadoc" und "Declaration".

Im Package Explorer auf der linken Seite expandieren wir nun das erstellte StandaloneClient Projekt. Mit der rechten Maustaste auf das src Verzeichnis erstellen wir ein neues Package. Wir erstellen dasselbe Package ("de.wikibooks.javaee") wie für unsere bereits erstellten Klassen und Interfaces. Das hat den Vorteil, dass sich alle Klassen im selben Namensraum befinden und nichts importiert werden muss. Dem neu erstellten Package fügen wir über das bereits bekannte Kontextmenü (rechte Maustaste) eine neue Klasse hinzu. Der Name könnte zum Beispiel "StandaloneMain" heissen.

In der Zusammenfassung nun die restlichen Einstellungen:

Feld Eintrag
Package de.wikibooks.javaee
Enclosing type deaktiviert
Name StandaloneClient
Modifiers public (alle restlichen Checkboxen deaktiviert)
Superclass java.lang.Object
Interfaces leer
Which method stubs would you like to create? public static void main(String args[]) -> aktiviert

Constructors from superclass -> deaktiviert

Inherited abstract methods -> aktiviert

Generate comments deaktiviert

Mit "Finish" schliessen wir die Erstellung der Klasse ab und erweitern die Klasse folgendermassen:

StandaloneMain.java[Bearbeiten]

package de.wikibooks.javaee;

import javax.naming.InitialContext;
import javax.naming.NamingException;

public class StandaloneMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		StatelessSessionRemote myEJB = null;
		InitialContext ic;
		try
        {
			ic = new InitialContext();
			myEJB = (StatelessSessionRemote) ic.lookup("de.wikibooks.javaee.StatelessSessionRemote");
			
        } catch (NamingException e) {
        	e.printStackTrace();
        }
		
        if (myEJB != null) {
        	int result = myEJB.getAplusB(3, 4);
        	System.out.println("Ergebnis: " + result);
        }
	}
}

Nachdem wir die Klasse abgespeichert haben, müssen wir dem StandaloneClient Projekt noch eine Jar Datei zum Java Build Path hinzufügen. Dazu öffnen wir über das Kontextmenü die Projekt Eigenschaften ("Properties"). Mit einem Klick auf "Java Build Path" und einem weiteren Klick auf den Reiter "Libraries" öffnen wir die Build Path Konfiguration. Über "Add External Jars" navigieren wir zum Glassfish Library Verzeichnis (Standardmässig C:\glassfishv3\glassfish\modules). Dort sollte sich die Datei "gf-client.jar" befinden welche wir mit "Öffnen" zum Build Path hinzufügen.

Anschliessend wechseln wir in die JavaEE Perspektive und starten den Glassfish Server. Über "Add and Remove" im Kontextmenü fügen wir unser EJB_ProjektEAR hinzu. Danach können wir den Standalone Client starten indem wir im Project Explorer die Klasse StandaloneMain mit der rechten Maustaste anklicken und unter dem Menüpunkt "Run As", "Java Application auswählen.

In der Console sollte nun folgende Ausgabe erscheinen:

10.12.2010 23:27:45 com.sun.enterprise.transaction.JavaEETransactionManagerSimplified initDelegates
INFO: Using com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate as the delegate
Ergebnis: 7