Anfängerfrage zu EJB3 & JSP

KarlRannseier

Grünschnabel
Hallo Leute,
ich versuch mich in J2EE einzuarbeiten und habe auch schon eine menge Tutorials durchgearbeitet aber iregndie konnte ich zu meinen jetzigen Problem nichts finden.
z.Z. bin ich an folgendem dran:
Ich habe eine EJB geschrieben die eine Klasse "Einkaufsliste" beschreibt. also mann kann sie initialisieren und dabei einen Namen des "Benutzers" eingeben.
Zusätzlich gibt es Funktionen um einfache Artikel in eine Liste hinzuzufügen und zu entfernen.
(Diese Bean habe ich aus einem Tutorial http://java.sun.com/javaee/5/docs/tutorial/doc/bnbod.html ).

Jetzt versuche ich diese Bean über eine JSP anzusprechen.
Ich möchte aber gerne mehrere Einkaufsliste auf einer Seite anzeiegn. Also mehrere Instanzen der Einkaufsliste erstellen. und diese dann unabhängig voneinander bearbeiten können.

Über
Code:
InitialContext.lookup(Klassenname)
kann man ja eine Instanz erstellen. und das habe ich auch schon gemacht. Die Bean funktionier dann auch wie gewünscht.

Meine Frage ist jetzt :
Kann man Mehrere Instanzen der "Einkaufsliste" erstellen ?
Wenn ja : Sind diese Instanzen dann innerhalb eines EJB zu finden, oder existiert dann für jede Instanz eine EJB?
und viel Wichtiger : Wie kann ich diese Instanzen über eine JSP (oder auch anders) ansprechen ?

Vielen Dank für eure Hilfe im Voraus

Gruss
Karl
 
Vielleicht hilft ein Blick in die Unterscheidung zwischen "Statefull" und "Stateless". Eine Statefull Session Bean existiert pro Client, d.h. es gibt für jeden Nutzer eine eine Instanz dieser EJB.

Du solltest selbst gar keine Instanzen von der EJB erstellen. Du tust es ja auch gar nicht. Mit dem Lookup lässt du dir eine Instanz geben. Welche du bekommst, bestimmt der (EJB)Container. Bei Stateless Beans bekommst du z.B. immer irgendeine. Das geht, weil sie halt Zustandslos sind.

Grundsätzlich bietet EJB3 die Möglichkeit der DependencyInjection. D.h. du musst Beans nicht durch einen expliziten Lookup holen, sondern kannst sie dir geben lassen. So wäre es also sinnvoller die Logik der Bean über ein Servlet zu nutzen, in das du dir die Bean injzieren lässt (Property mit Annotation kennzeichnen).

Gruß
Ollie
 
Hallo Oliver,
Vielen Dank für deine Antwort. ich glaube das ich meinen Gedankenknoten bald gelöst habe.
Ich habe gerade nochmal die Doku gelesen und gebe jetzt das ganze nochmal so wieder wie ich das verstanden habe :

1. Eine Enterprise-Bean ist kein Objekt (Instanz einer Klasse) wie ich es von "C++" kenne, sonder einfach ein Container mit Buisnesslogik.

2. Innerhalb einer Bean kann man normal objektorientiert programmieren.

3. Eine Statefull Bean kann genau einmal pro Connection/Client existieren.

4. Eine Stateless Bean existier genau einmal für alle Clients/Connections gleichzeitig.

5. Wenn ich mehrere Einkaufsliste erzeugen will, muss ich in der Bean selbst eine Liste der Einkaufsliste erstellen, und diese z.B. über folgende Funktionen bearbeitbar machen:
Code:
public List<String> getEinkauslisten();
public void addEinkaufsliste(String name);
public void delEinkaufsliste(String name);


Ist das so korrekt ?


Und mit ".....die Bean injzieren lässt (Property mit Annotation kennzeichnen)......" meinst du dieses Format :
Code:
@EJB
private Einkaufsliste meineEinlkaufsliste;
innerhalb der Servlet klasse


Gruß
Karl
 
Zuletzt bearbeitet:
Du musst Domänenobjekte von Services unterscheiden. Domänenobjekte werden als "normale" Javaklassen modelliert und per JPA verwaltet. Um grobgranularere Funktionalität zur Verfügung zu stellen gibt es sogenannte Fassaden, Services, wie man es auch nennen mag. DIESE werden als SessionBeans implementiert. EJB selbst ist einfach nur eine Komponentenspezifikation. Sprich, was für Bedingungen muss eine Klasse erfüllen, wenn sie EJB sein will. Wenn sie diese Bedingungen (Annotationen etc.) erfüllt kann sie an containerspezifischen Diensten Transaktionaliät, Security usw. teilnehmen.

Das zum grundsätzlichen. Nun zum konkreten. Du hast Einkaufsliste als SessionBean (in deinem Fall Statefull) implementiert. D.h. du kannst davon nicht einfach beliebig Instanzen erzeugen. Der Mismatch liegt darin, dass du Einkaufsliste als SessionBean implementiert hast, sie aber wie eine Entität benutzen willst.

Was ist bei dir eine Einkaufsliste? Das solltest du genau definieren und dann eine Implementierungsform wählen. Das Tutorial oben modelliert einen Einkaufswagen. Der ist logischerweise stateful und kann manipuliert werden (Produkt hinzufügen, wegnehmen, als Bestellung abschicken usw.). Da passt die Abstraktion.

REINHAUN!
 
Vielen dank für dein Hilfe.
ich bin jetzt um einiges schlauer.
Die JPA werde ich mir noch ansehen, ich wollte mich zu Anfang nicht gleich mit zuvielen Informationen überladen. J2EE ist halt riesig.
Was und wofür EJBs sind denke ich jetzt verstanden zu haben und ich werde jetzt einfach weiter üben/coden/what ever ....... bis die nächste frage kommt.


Gruß
Karl
 

Neue Beiträge

Zurück