# <jsp:include . und Objektreferenzen mitgeben



## nauni77 (25. Mai 2006)

Hallo,
zu Beginn habe ich nicht den Unterschied zwischen der Direktive 


```
<%@ include file="modules/steuerung/Einloggen.jsp"%>
```

und der Aktion


```
String includeIt = "modules/steuerung/Einloggen.jsp";
<jsp:include page="<%= includeIt %>" />
```

gekannt. Nun ist er mir schmerzlich klar geworden. Am Anfang habe ich die Direktive verwendet. Nun habe ich in einer Datenbank hinterlegt welche weitere JSP zu includieren ist. Als Direktive kann dieses Include nicht ausgeführt werden, da beim Kompilieren nicht feststeht welche JSP eingebunden werden soll. Mir bleibt jetzt nur die Möglichkeit durch eine Aktion die Modul-JSPs einzubinden.

Es ergibt sich jetzt jedoch ein Problem. Bei der Direktive wird der Code direkt in das JSP includiert (beim erzeugen/kompilieren). Somit kann ich in dem per Direktive includierten JSP auf die Objekte der ursprünglichen "Main-JSP" zugreifen. Bei dem Include per Aktion wird lediglich das request und response Objekt übergeben und auf die restlichen Objekte kann ich nicht zugreifen.

Meine gesamte Anwendung verwendet ein Objekt aus der Main-JSP. Wie kann ich diese an die includierte JSP übergeben (beim Includieren per Aktion)? Erzeugt habe ich dieses Objekt folgendermaßen:


```
<jsp:useBean id="sh" class="dbM.steuerung.SessionHelp" scope="session" />
```

Ich hoffe es kann mir jemand helfen.

tia und schöne Grüße

Oli


----------



## nauni77 (25. Mai 2006)

Hi,
habe ein "workaround" für das Problem gefunden. Hoffe dennoch, dass mir jemand einen Tipp gibt wie das Problem "sauberer" zu lösen ist. Mein Workaround:

In der "Vater-JSP":

```
<jsp:useBean id="sh" class="dbM.steuerung.SessionHelp" scope="session" />
<%
session.setAttribute("sh", sh);
%>
```

Auf dieses Objekt kann aus der "Kind-JSP" mittels folgendem Code zugegriffen werden:

```
dbM.steuerung.SessionHelp sh = (dbM.steuerung.SessionHelp)session.getAttribute("sh");
```

Hmmmm, irgendwie muss ich doch dem aufgerufenen Java-Servlet (welches aus meiner includierten JSP erzeugt wurde) eleganter die Objekte übergeben können. Aber wie???

Bin für jeden Tipp dankbar.

Grüße

Oli


----------



## bronks (25. Mai 2006)

Eine sehr fragwürdige Architektur, was Du da baust ... Das erinnert mich an die Code behind Code aus Asp? In Java endet das als vollgasfahrt in die Sackgasse, weil man das einfach anders macht.

Schau Dir auf http://java.sun.com die BluePrints an, da findest Du einen Patternkatalog mit Beispielen, wie man es richtig macht.

Viel Erfolg!


----------



## LordSam (26. Mai 2006)

@Bronks: Du magst mit deiner Kritik recht haben, das es nicht die non-plus-ultra 100% Blue-Print kompatible Lösung zu sein scheint. Aber beantwortet das in irgendeiner weise die Frage? Antworten dieser Art vergraulen Java-Einsteiger nur, was nicht im Sinn der Java-Community sein kann...

@Oli: 
In der ersten Seite hast Du ja schon die richtige Anweisung drin:

```
<jsp:useBean id="sh" class="dbM.steuerung.SessionHelp" scope="session" />
```

Die selbe Anweisung packst Du einfach in die anderen JSP pages, dann hast Du auch dort Zugriff auf die selbe Instanz. Denn jsp:useBean erzeugt ein Bean nur dann, wenn es nicht schon im entsprechenden scope vorhanden ist. Sofern das Objekt schon vorhanden ist, wird einfach nur eine variable mit referenz auf das bestehende Objekt erzeugt. Siehe hierzu auch die <jsp:useBean> Doku.

Also in deiner Seite 1:

```
<jsp:useBean id="sh" class="dbM.steuerung.SessionHelp" scope="session" /> 
String includeIt = "modules/steuerung/Einloggen.jsp"; 
<jsp:include page="<%= includeIt %>" />
```

Und in deiner Seite 2:

```
<jsp:useBean id="sh" class="dbM.steuerung.SessionHelp" scope="session" /> 
<%
    sh.foo(); 
%>
```

Für den Fall das Du die Objekte nicht mit useBean instanzieren kannst (oder willst?), kannst Du Sie auch selbst an die Session oder den Request hängen, so wie Du es schon gemacht hast. Denn die jsp:useBean Anweisung macht letztlich nichts anderes...


----------



## bronks (26. Mai 2006)

LordSam hat gesagt.:
			
		

> ... Aber beantwortet das in irgendeiner weise die Frage? Antworten dieser Art vergraulen Java-Einsteiger nur, was nicht im Sinn der Java-Community sein kann ...


Ich finde, daß es mehr als eine Antwort auf die Frage ist. Ich habe vor Jahren von einem prominenten User die kurze und knappe Antwort bekommen: "Das macht man so nicht". Dankbar habe ich diese entgegengenommen und wußte, daß meine Vorgehensweise keine Zukunft hat und auch keine Anerkennung im professionellen Bereich finden wird.


----------



## LordSam (27. Mai 2006)

Ist ja auch i.O. jemanden drauf hinzuweisen, das seine Architektur verbesserungswürdig ist. Aber wenn man dabei nicht auf die Frage selbst eingeht, wirkt es arrogant und abfällig. Das war sicher ned von Dir beabsichtigt, is aber so rübergekommen....

Davon mal abgesehen sollte man sich schon sehr sicher sein, bevor man die Architektur beurteilt - gerade wenn solch spezifische Fragen mit nur 3 Zeilen codebeispiel gestellt werden....

Aber es war ja wohl gut gemeint, also nix für ungut....


----------



## nauni77 (28. Mai 2006)

Hallo,
vielen Dank für die Nachrichten.  Ich möchte gerne zur Session-Variablen und zum Design etwas schreiben.

Session-Variable:
============
Das ist ja wirklich einfach. Leider bin ich nicht selbst darauf gekommen, dass er mit der gleichen Anweisung automatisch das Session-Objekt identifiziert. Vielen Dank für den Hinweis! 

Guter Stil/Architektur:
================

Falls die Architektur falsch ist, dann bitte ich um Verbesserungs-Vorschläge. Finde es auch gut, dass mich jemand drauf hinweist - möchte mich stets (wenn möglich) verbessern. Über eine kurze Antwort vom Hinweisenden zu meinem Problem wäre ich dennoch sehr dankbar gewesen.

Ich habe eine dreiteilige Architektur. Einmal die Darstellung (mit JSPs), dann die Anwendungslogik (mit Java-Beans) und die Datenhaltung (mit MYSQL). Wobei die Darstellungs-Schicht nur auf die Anwendungslogik-Schicht zugreift und die Anwendungslogik-Schicht sich die Informationen aus der DB-holt (bzw. diese dort hinterlegt).

Darstellungs-Schicht (Session-Facade):
---------------------------------------------
Ich skizziere mal kurz wie diese Darstellungs-Schicht aufgebaut ist.

```
<table border="0">
<tr>
  <td align="center"> 
    Mein Programmkopf mit diesem ich zwischen den einzelnen Modulen 
    navigiere. Dieser ist bei jedem Modul gleich.
  </td>
</tr>
<tr>
  <td align="center">
    Anhand der Auswahl im Programmkopf verwende ich nun diese Zelle
    um das ausgewaehlte Modul darzustellen. Dieses wird durch einen übergebenen
    Parameter identifiziert und der korrekte Link aus einer Datenbank geholt:

   <jsp:include page="<%= nav.getLocaleLink(request.getParameter("action")) %>" />
  </td>
</tr>
</table>
```

Somit ist selbst die Verlinkung variabel. Ich habe eine jsp geschrieben, welche mir einen neuen Link entsprechend in die DB schreibt. Sobald er in der DB ist wird dieser Link einfach im "Programmkopf" dargestellt wird und kann somit ausgewaehlt werden (unter Beachtung der entsprechenden Rechte der Benutzergruppen, welche in meinem Programm existieren).

Dieses Session-Objekt (stateful bean), welche ich dem in Zeile 15 aufgerufenen jsp übergeben möchte, beinhaltet einige Session-Informationen auf die ich mit einfachen SET- und GET-Methoden zugreifen kann. Diese Informationen benötige ich im includierten Skript. Z.B.:
  - getMitarbeiterID();
  - getFirma();
  - isAdministrator();
  - isProjektmitarbeiter(String ProjektID);
  u.s.w.



Ich hoffe die Vorgaben eingehalten zu haben. Falls nicht bin ich über jede Information dankbar und werde mich und mein Programm verbessern. 

Nochmal vielen Dank und schöne Grüße

Oli


----------

