Servlet EJBs in Servlets verwenden?

darkcode3

Mitglied
(Aus irgendeinem Grund werden die Absätze in meinem Beitrag nach dem Posten entfernt...) Guten Abend! Die Frage hört sich einfach an: Ich suche eine Möglichkeit, Stateful Session Beans innerhalb von Servlets zu verwenden. In Servlets lassen sich EJBs scheinbar ganz komfortabel mittels @EJB-Annotation injizieren. Es lassen sich sowohl Stateless als auch Stateful Session Beans injizieren. Jeder HTTP-Zugriff auf das Servlet führt aber zu einem Zugriff auf die selbe Stateful Session Bean, obwohl ich natürlich durch den Einsatz einer Stateful Session Bean bezweckte, dass für jede HTTP-Session separate Stateful Session Beans angelegt werden. Ursache: Servlet-Instanzen sind nicht an einzelne HTTP-Sitzungen gebunden, deshalb bleiben die einmal injizierten EJB-Instanzen dort für immer enthalten. Mit Facelets und BackingBeans sollen sich StatefulBeans wohl sinnvoll nutzen lassen. Da macht man wohl einfach nur ein @Named und @SessionScoped ran und schon geht es. Aber geht das auch mit reinen Servlets? Ich möchte nur ungern alle Nutzdaten mittels HttpSession.setAttribute() abspeichern, und die Nutzdaten dann durch ein verzweigtes Netz an Bean-Aufrufen durchleiten. Weil das ist ja soweit ich weiß gerade der Punkt, warum man dependency injection haben möchte. Google meint auch, man solle einfach die Beans erstellen (mittels new?) und diese dann über HttpSession.setAttribute() festhalten und beim nächsten Aufruf wieder aus dieser Session lesen. Versuche schon den ganzen Tag eine Lösung für das Problem zu finden, habe aber bis jetzt noch nichts zufriedenstellendes gefunden. Bin froh um jeden Tipp oder Kommentar. Danke!
 
Zuletzt bearbeitet:

darkcode3

Mitglied
Servlet-Klassen sind zwar gemanaged, sind aber nicht an eine bestimmte HTTP Session gebunden. Laut Stackoverflow kann man angeblich mittels new InitialContext() ein bean laden, indem man ein lookup auf einen jndi pfad in dem folgendem Format ausführt: ejb:///!?stateful Von einem solchen Format für Stateful-Beans konnte ich in der EJB3.1 spezifikation nichts finden, sondern nur java:pfade, die keine distinct-name Angabe ermöglichen. das obige Format hat bei mir nicht funktioniert. Selbst der Lookup auf ein Stateless Bean hat nicht funktioniert:
Java:
 InitialContext ctx = new InitialContext(); TestBean0Local bean0 = (TestBean0Local)(ctx.lookup("java:module/BeanTest0!mein.package.TestBean0Local"));
// Schwerwiegend: javax.naming.NamingException: Lookup failed for 'java:module/BeanTest0!mein.package.TestBean0Local' während das Stateless bean aber Problemlos im Servlet funktioniert, wenn man es sich mittels @EJB-Annotation geben lässt. Kennt jemand eine Quelle für die korrekten jndi-Pfade für den Lookup von Stateful-Beans? Hat jemand eine Idee, warum die @EJB-Annotation bei mir funktioniert, nicht aber der Lookup über den InitialContext?
 

BuckRogers

Bekanntes Mitglied
Hallo,

also einige Dinge sind nicht ganz richtig bzw. unklar erläutert. Zum Einen sind alle vom AS verwalteten Javaklassen Servlets. Dazu zählen Managed Beans, Session Beans, MDBeans usw. Diese werden in den ServletContainer gepackt und nach ihrer Konfiguration verwaltet. Stateless Session Bean Instanzen werden in einem gemeinsamen Pool verwaltet und mehrere Clients haben auf die Methoden und Attribute Nacheinander Zugriff. Deswegen sollte man in einer Stateless Bean keine Werte über längere Zeit speichern. Der Vorteil liegt aber in den vielen, kleinen, kurzen Zugriffen von vielen Clients auf wenige Instanzen der Stateless Beans, was die Performance ungemein verbessert.
Stateful Beans hingegen werden an den Client gebunden, SessionScoped oder RequestScoped... ApplicationScoped ist veraltet. Man kann also in einer Stateful Bean, eine Vielzahl an komplexer und aufwändigher Operationen durchführen, welche abhängig von anderen Beans und Parametern der Anwendung sind. Dafür wird aber die ganze Instanz an den Client gebunden, was den Nachteil hat, dass der Hauptspeicher recht flott dicht werden könnte und der AS die Hufe gibt.
Injizieren tut man die Beans(Stateless / Stateful ist egal) über @EJB. Der ServletContainer stellt die Bean bereit, indem er eine Instanz erzeugt oder aus einem Pool eine zur Verfügung stehende Instanz bereitstellt. Dieses ganze rumgehacke mit dem ServiceLocator und dem JNDI kann man sich sparen. CDI ist das Stichwort. Ansonsten, wenn du wirklich im ServletContext rumspielen möchtest, dann schlag dochmal nach EJBContext Interface nach. Da gibt es ein paar interessante Dinge glaube ich.

Viel Spaß noch beim EJB MessUp :p
 

darkcode3

Mitglied
Interessante Begriffsklärung. Dann sind WebServlets, Session Beans,... eine Unterkategorie von Servlets?

Zu CDI muss ich mich noch tiefer einlesen. Aber mein aktueller Stand ist, dass WebServlets Instanzen gepoolt sind und *nicht* an eine bestimmte HTTP-Sitzung gebunden ist. Daher wirkt das @Inject bzw. @EJB in der Servlet instanz lediglich beim ersten HTTP-Request. Danach bleibt die Stateful-Bean für immer injiziert. Und das WebSevlet weiß selbst noch nicht einmal direkt etwas von irgendwelchen HTTP-Sitzungen, die zur Bestimmung des EJB oder CDI SessionScopes herangezogen werden könnte. Völlig ungeachtet dessen, dass WebServlet über request.getSession(true) natürlich eine Session starten könnten.

Zum EJBContext werde ich mich mal informieren. Danach werde ich einfach nachgeben und JSF verwenden. Da ist meine BackingBean dann einfach SessionScoped und ich kann dann mit @EJB mir weitere Objekte injizieren lassen. Ich werde mal sehen müssen, wieviel Kontrolle ich durch den JSF-Einsatz gegenüber reinen WebServlets abgeben muss...

Danke dir für deine Anmerkungen!
 

BuckRogers

Bekanntes Mitglied
Richtig, gepoolte WebServlets können bei globalen Injizierungen die SessionBean Instanzen an ganz andere Clients weitergeben.
Deswegen sollte man in WebServlets niemals globale Variablen verwenden, es sei denn sie sind 'final' deklariert.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K JSF nur im Kombi mit EJBs nutzbar? Web Tier 2
L CRUD-Handler mit EJBs? Web Tier 3
T Model2-Architektur Servlets Web Tier 0
S JSF, JSP, Servlets - ich verstehe nur noch Bahnhof Web Tier 4
M Best practice JSP und Servlets Web Tier 1
A Aufruf eines Servlets auf einer JSP Seite funktioniert nicht Web Tier 10
A Wartezeit nach Tomcat start wegen Servlets zu hoch Web Tier 2
T Einsteigerfragen zu Servlets/Webprogrammierung mit Java Web Tier 11
C Kommunkation Servlets/Browseraufruf Servlet Web Tier 4
U Servlet Allgemeine Frage zu Servlets Web Tier 2
T Tomcat mit Servlets Problem Web Tier 7
A Parameterübergabe an Servlet und Aufruf von Servlets per Java Code Web Tier 7
R Daten Streamen mit Servlets. Web Tier 4
J web.xml / Erreichbarkeit von Servlets Web Tier 6
F Richtiges Session Management mit Servlets Web Tier 4
S Architektur-Problem? 2 Servlets, ein Objekt Web Tier 4
S Ein ControllerServlet für andere Servlets - Sinnvoll oder nicht? Web Tier 34
D Servlets vor direktem Zugriff schützen Web Tier 2
O setDefaultUncaughtExceptionHandler in Servlets Web Tier 2
M Design-Frage: JSP, Servlets und CSS Web Tier 11
Java.getSkill() Webseiten JSP Servlets Struktur Web Tier 3
R File Einlesen mit jsp/servlets Web Tier 11
S Daten zwischen 2 Servlets aus 2 Webapplikationen teilen? Web Tier 17
D client-seitige Sessions mit Servlets Web Tier 5
M Bilder in Servlets Web Tier 8
U Grundaufbau der Webapp mit JSP/Servlets Web Tier 7
J Welcher WebServer(-anbieter) für Servlets? Web Tier 5
S Ablauffrage von Servlets Web Tier 2
G Kurze Frage zu Servlets&Struts Web Tier 4
L Massenaufruf ( 5000/s ) eines Servlets testen. Web Tier 4
G synchronized bei Servlets Web Tier 24
rambozola session attribut in servlets und jsps Web Tier 11
D Kann Servlets nicht kompilieren Web Tier 7
M Grundlegende Frage zu Servlets und JSPs Web Tier 12
I Gleiche Session von EJB Container in JSF Container verwenden? Web Tier 21
G JSP dataTable header - Datenwerte verwenden? Web Tier 3
K RichFaces CommandButton mit PopUp verwenden Web Tier 2
G JSF Beans und Entity verwenden Web Tier 2
J response HTML verwenden Web Tier 2
ruutaiokwu JSF nur für die präsentation verwenden? Web Tier 4
O struts2: Zeilenumbruch in textarea verwenden Web Tier 3
M Java Framework für größere Projekte verwenden Web Tier 5

Ähnliche Java Themen

Neue Themen


Oben