# Session Bean -> Daten aus dem Servlet holen



## freez (19. Nov 2006)

Hallo,

ich habe eine SessionBean für meine JSP und ein XML File, welches ich mit JDOM in der Bean auslese. Nun wiederholt sich dieser Code bei jedem Aufruf der JSP:




```
//		Erzeugen eines JDOM-Dokuments anhand der Datei nav.xml
		SAXBuilder builder 	= new SAXBuilder();
		Document doc 		= null;
		try {
			doc = builder.build( navFilename );
		}
		catch (JDOMException e) {e.printStackTrace();}
		catch (IOException e) {e.printStackTrace();}
		return doc;
```

Nun, da die XML Datei sich eigentlich nie ändert ist es meiner Meinung nach unsinnig, bei jedem Aufruf das selbe zu machen (oder meint ihr, daß das so verschwindend geringer Overhead ist, daß ich das ruhig lassen kann, auch bei erhöhtem Zugriffsaufkommen?). Ich habe mir gedacht, ich könnte diesen Part in dem Servlet einmalig erledigen, und dort direkt das "Document" ablegen. Die Frage ist nur, wie komme ich von der SessionBean an das Document ran, wenn die JSP das erste mal aufgerufen wird, und die Bean instanziiert wird? Hat da jemand ne Idee?

Oder meint ihr, daß das kompletter Blödsinn ist, und ich in die völlig verkehrte Richtung denke?


----------



## Guest (19. Nov 2006)

Nur so 'ne Idee. Das Dokument im Application-Scope zu halten.
	
	
	
	





```
<%
   ...
   Document document = sessionBean.getDocument(...);
   application.setAttribute("document", document);
%>

und dann entsprechend widerverwenden

<%
   Document document = (Document)application.getAttribute("document");
%>
```


----------



## testit1234 (20. Nov 2006)

Eine vollständig andere Idee als der SessionScope wäre es
dies in einem Servlet zu schreiben. Da in den init() denn diese wird
nur genau einmal beim Server Starten aufgerufen und dann setzt du 
das Document als Klassenvariable und schreibst dir eine Methode 
getDocument() und fertig. So lade ich zum Beispiel meine Preferences,
die sich nicht während der Laufzeit ändern sollen.

Bsp.:


```
public class DocumentServlet extends HttpServlet {

Document doc = null;

public void init(javax.servlet.ServletConfig config)
      throws ServletException {

      SAXBuilder builder    = new SAXBuilder(); 
      try { 
         doc = builder.build( navFilename ); 
      } 
      catch (JDOMException e) {e.printStackTrace();} 
      catch (IOException e) {e.printStackTrace();} 


}

... doGet(), doPost() und destroy() für den Lebenszyklus des Servlets

public Document getDocument(){
    return doc;
}
}
```

Gruss
Testit


----------



## bronks (20. Nov 2006)

freez hat gesagt.:
			
		

> ... ich habe eine SessionBean ... verschwindend geringer Overhead ist, daß ich das ruhig lassen kann, auch bei erhöhtem Zugriffsaufkommen?) ...


Auch ich würde EJB vollständig weglassen und es so machen, wie Gast und Testit1234 schon vorgeschlagen haben. Der ServiceLocator hat immer viel Arbeit damit Deine SessionBean zu finden und genau darin sehe ich den Overhead und  Performanceverschwender, wenn man bedenkt, daß die Daten nur von einer JSP verarbeitet werden.


----------



## freez (20. Nov 2006)

@gast: aber dann wäre doch das Document immer noch in der session, oder? Bei jeder neuen Session würde dann doch der Code zum einlesen des Documents ausgeführt. Besser zwar als bei mir, wo ich bei jedem Aufruf der JSP die Datei lade, aber wäre dann noch nicht perfekt.

@testit1234: ja, genauso habe ich es mir gedacht. Aber: wie kommt meine sessionBean an das Document, um die Daten in der XML Datei auszuwerten?


----------



## testit1234 (20. Nov 2006)

Im Zweifelsfall instanzierst du ein Objekt der Klasse DocumentServlet


```
DocumentServlet docserv = new DocumentSevlet()
docserv.getDocument
```

Eine andere Methode, die ehr elegantere ist, die Daten aus deiner SessionBean getten bzw. setzen und 
dann im Servlet zuverarbeiten, das kannst du aber auch genauso gut in der SessionBean machen.
Denn eine JSP ist ja nix anderes als eine Scriptsprache für ein Servlet Servlet, die beim ersten AUfruf vom Web-Server als Servlet generiert wird. 
Eigentlich kannst du das machen, wie du möchtest. Du musst nur eben die Objekte hin-und her schicken!
Wofür brauchst du eigentlich so dringend eine SessionBean? Das ist mir noch nicht so ganz klar geworden. Denn JSP bzw. Servlets verfügen doch über eine recht komfortable Möglichkeit Sessions zu verwalten!


----------



## freez (21. Nov 2006)

Vielleicht habe ich mit dem Wort "SessionBean" ein etwas verkehrtes Wort verwendet. Das ist keine EJB sondern die Bean, die ich in meiner JSP einbinde ... und zwar mit scope="session"  Deswegen "SessionBean". Ich hoffe ich habe nicht zu viel Verwirrung gestifftet.

Also anders gefragt. Wie kann ich das Dcoument im Servlet einmalig erstellen und in der JSP nutzen. Vor allem, wenn die JSP beim ersten mal direkt und zwar vor dem Servlet aufgerufen wird (also das Servlet wird erst nach der JSP aufgerufen).

Zur verdeutlichung:

Ich starte meinen Browser und gebe ein: http://www.meinserver.de/project/site.jsp ein ... die JSP wird aufgerufen. Nun weiß das Servlet ja noch gar nix von dem Aufruf und kann somit die Bean nicht aus der HttpSession holen. Erst wenn ich eine Anfrage an das Servlet mache kann ich mir die Bean aus der Session holen .... Richtig??? Wenn jetzt das Document im Servlet steckt, wie kommt meine JSP an dieses Document?


----------



## bronks (21. Nov 2006)

freez hat gesagt.:
			
		

> ... Also anders gefragt. Wie kann ich das Dcoument im Servlet einmalig erstellen und in der JSP nutzen. Vor allem, wenn die JSP beim ersten mal direkt und zwar vor dem Servlet aufgerufen wird (also das Servlet wird erst nach der JSP aufgerufen).


Mit dieser Technik funktioniert das nicht optimal.

Schau mal hier rein: http://java.sun.com/blueprints/corej2eepatterns/Patterns/index.html

Klick auf die beiden Frontcontrollerpatterns und Du wirst die Lösung schnell finden. Schau Dir vor allem die Bedeutung des RequestDispatchers an. Ich empfehle Dir die Servlet Front Strategy (das Linke pattern im Diagramm), da besser zu debuggen.

Viel Erfolg.


----------



## freez (21. Nov 2006)

Danke für den Tip ... ich werde es mal probieren


----------



## freez (22. Nov 2006)

ich habe mir den Link mal genauer angeschaut. die ServletFrontStrategie gefällt mir ganz gut. Eine Frage (das habe ich nämlich nicht so deutlich rauslesen können): muß ich diesen Controller immer von Hand aufrufen (also von der JSP aus) oder gehen automatisch alle Anfragen an den Controller? Wenn es automatisch geht, wie wird dieser Controller in Tomcat implementiert?

Wenn das nicht so automatisch geht, wie kann ich verhindern, daß user bestimmte Seiten einfach aufrufen, ohne z.B. eingeloggt zu sein. Oder manche Seiten benötigen evtl. erst mal eine Eigenschaft (wie z.B. mein Document) um angezeigt zu werden. Wie kann ich dann automatisch an das Servlet umleiten, wenn der User die JSP direkt anspringt (aus dem Bookmark herraus oder so)


----------



## bronks (22. Nov 2006)

So wie Du es beschreibst muß man den Controller von Hand aufrufen, aber letztendlich läuft es automatisch. 

Ein hervorragendes Beispiel mit komplettem Quellcode genau zu dem Thema findest Du hier: http://www.javaworld.com/javaworld/jw-12-1999/jw-12-ssj-jspmvc.html

Der User wird nie versuchen den Controller zu umgehen, weil er niemals erfahren wird, welche JSPs sich dahinter verbergen. Er wird außer der URL für die index.jsp, immer nur die URL des Controllers und evlt. die Parameter dahinter sehen, welche nicht dafür ausreichen sich unangemeldet etwas anzeigen zu lassen, aber das wirst Du alles sehen, wenn Du den Code aus o.g. Link durchtestest.

Viel Erfolg!


----------



## freez (23. Nov 2006)

Danke schön ... hört sich vielversprechend an  Ich schaue es mir an


----------

