JSPs verschachteln

Joel

Legendäres Mitglied
Hallo zusammen,

Falls sich jemand mit JSP auskennt, wäre ich froh wenn er mir helfen könnte.

Es geht um folgendes:

Ich habe ein Servlet (z.B. ImpressumServlet), welches durch eine URL (z.B. mydomain.com/impressum) aufgerufen wird. Dieses Servlet soll 3 Komponenten zusammenschachteln:

- DESIGN.JSP (Welches auf jeder Seite verwendet wird, wird von jedem Servlet benutzt)
- IMPRESSUM.JSP (Wird nur auf dieser Seite verwendet, DESIGN.JSP hat einen Hauptbereich wo halt der Inhalt reinkommt)
- KONTAKT.JSP (Wird auf dieser Seite verwendet, DESIGN.JSP hat einen Seitenbereicht wo je nach Seite mit Inhalt befüllt werden kann)

ich möchte mein Design *nicht* in HEADER und FOOTER aufspalten!

Nun, *wie mache ich das mit JSP*?!

Wäre froh wenn mir jemand helfen könnte...

Gruess,
Joel Anhang anzeigen 2

 
Eigentlich hat das weniger mit JSP, sondern mehr etwas mit allgemeinen Klassen zu tun - zumindest läßt sich das Problem dadurch lösen.

Design.jsp wird mit zwei Objekten als Parametern initialisiert - Impressum.jsp und Kontakt.jsp.

Design.jsp ruft an geeigneter Stelle Methoden dieser Unterobjekte auf. Das geht, weil dem Design.jsp der Typ der Unterobjekte bekannt ist.

Die Initialisierung von Design.jsp erfolgt aber - je nach Zusammenhang - mit verschiedenen Objekten, die entweder abgeleitete Klassen von Impressum.jsp/Kontakt.jsp sind oder ein entsprechendes Interface implementieren.


Sprich:
Klasse aImpressum.jsp (abstrakt), aKontakt.jsp
Konkrete Klassen Impressum1, Impressum2, Kontakt1, Kontakt2 usw.

Klasse Design.jsp wird in der Definition initialisiert mit aImpressum, aKontakt und aufgerufen bsp. mit Impressum2, Kontakt1.

 
QUOTE
Eigentlich hat das weniger mit JSP, sondern mehr etwas mit allgemeinen Klassen zu tun - zumindest läßt sich das Problem dadurch lösen.

Design.jsp wird mit zwei Objekten als Parametern initialisiert - Impressum.jsp und Kontakt.jsp.

Design.jsp ruft an geeigneter Stelle Methoden dieser Unterobjekte auf. Das geht, weil dem Design.jsp der Typ der Unterobjekte bekannt ist.

Die Initialisierung von Design.jsp erfolgt aber - je nach Zusammenhang - mit verschiedenen Objekten, die entweder abgeleitete Klassen von Impressum.jsp/Kontakt.jsp sind oder ein entsprechendes Interface implementieren.


Sprich:
Klasse aImpressum.jsp (abstrakt), aKontakt.jsp
Konkrete Klassen Impressum1, Impressum2, Kontakt1, Kontakt2 usw.

Klasse Design.jsp wird in der Definition initialisiert mit aImpressum, aKontakt und aufgerufen bsp. mit Impressum2, Kontakt1.


Danke erstmal für die Antwort, ich weis jetzt ungefähr in welche Richtung es gehen soll...

Aber .. kann mir das noch nicht so ganz vorstellen. Und du verwechselst z.T. Servlets und JSPs, weil von JSPs macht man keine Ableitungen.

Also so wie ich dich verstanden habe, würde der Ablauf so aussehen:

1. Seite /Impressum wird aufgerufen, doGet auf ImpressumServlet wird ausgelöst.
2. ImpressumServlet setzt zwei Request-Parameter:
- Hauptbereich auf ImpressumServlet
- Nebenbereich auf KontaktServlet
3. Irgendwie (!) wird Design.jsp eine Interfaced-Funktion (z.B. getContent()) von ImpressumServlet und KontaktServlet aufrufen und deren Inhalt holen. Wie funktioniert das!?
Die aufgerufene ImpressumServlet-Funktion ruft hingegen wieder ImpressumServlet.jsp auf. Die KontaktServlet-Funktion ruft KontaktServlet.jsp auf.

Das klingt für mich sehr komisch.

Zur Erläuterung: Auf anderen Servlets z.B. MusikServlet will ich Design.jsp wiederverwenden, aber einen anderen Inhalt STATT impressum.jsp wäre dann musik.jsp, etc.! ____und beim durch design.jsp aufgerufenen musik.jsp will ich auf alle variablen zugreifen können (wie wenn ich durch MusikServlet das Musik.jsp direkt aufgerufen hätte, mit dispatchRequest oder so).

Das ist doch ein Problem, welches *alle* Webdesigner haben wenn sie JSP wie ein Template-System benutzen wollen. Gibts da keine State-Of-The-Art Lösung...!?
 
QUOTE (madox @ Mi 31.1.2007, 15:36)Aber .. kann mir das noch nicht so ganz vorstellen. Und du verwechselst z.T. Servlets und JSPs, weil von JSPs macht man keine Ableitungen.

Ich kenne mich mit den Details von Java schon seit längerer Zeit mangels Verwendung nicht mehr aus.

Aber das, was man für so eine Struktur braucht, sind Klassen, die Möglichkeit, eine Klasse von einer anderen Klasse abzuleiten, Methoden zu überschreiben und Objekte mit Methoden anzusprechen - all das gibt es in Java.

Was allerdings wohl niemals gehen dürfte, wäre das Aufrufen 'von innen nach außen': Das geht zwar unter 'Objektaufrufgesichtspunkten', nicht aber dann, wenn sinnvoller Html-Code entstehen soll.

Also hatte ich - analog zur Zeichnung - die Design-Klasse als Rahmen genommen, die bsp. anhand der Url entscheidet, welche Unterobjekte sie erzeugt. Im einen Fall erzeugt sie eben Impressum1, im anderen Fall Impressum2 - beide haben aber dieselbe Methode, die sie von ihrer Elternklasse aImpressum erben und überschreiben. Und die Design-Klasse ruft im weiteren Verlauf diese Methode aImpressum.TuEtwas() auf - derselbe Aufruf erzeugt verschiedene Outputs in Abhängigkeit davon, ob Impressum1 oder Impressum2 genutzt wird.


QUOTE (madox @ Mi 31.1.2007, 15:36)Das ist doch ein Problem, welches *alle* Webdesigner haben wenn sie JSP wie ein Template-System benutzen wollen. Gibts da keine State-Of-The-Art Lösung...!?


Die meisten kleineren Anwendungen laufen wohl mit PHP, erst bei größeren Sachen von größeren Firmen wird wohl Java ernstzunehmend verwendet - oder eben NET.
 
QUOTE (jAuer)
Aber das, was man für so eine Struktur braucht, sind Klassen, die Möglichkeit, eine Klasse von einer anderen Klasse abzuleiten, Methoden zu überschreiben und Objekte mit Methoden anzusprechen - all das gibt es in Java.



Naja aber Java ist nicht gleich JSP. JSPs sind eher wie Template-Dateien und bestehen zu 90% aus HTML, ein paar Tags und Variablen die ersetzt werden. (*Aus Programmierer-Sicht gilt folgendes*) JSP-Dateien haben weder Methoden, noch einen Klassennamen, noch eine Klassen-Hierarchie, man kann sie auch nicht ableiten, etc. Natürlich wird im Hintergrund ein Objekt und Methoden gebildet, diese benutzt man aber nicht so...


QUOTE (JSP-Datei)
<html>
<head>
</head>
<body>
${title}
<jsp:include xyz="abc"/>
<mytag:xyz>
Hallo ${name}!
</body>
</html>



Ich kenne die OO-Konzepte schon, aber JSP und J2EE hat halt sehr viele eigene Konzepte... (und ich würde das gerne --- state-of-the-art mässig machen)

Danke trotzdem für die Hilfe, bringt mich zwar nicht wirklich weiter....
 
wenn ich dich richtig verstehe brauchst du jsf java server faces oder java struts.
such mal in google nach...

ich weiss es hat mit dem topic nicht zu tun, aber wenn dich java interessiert, schau mal auch java hibernate, du wirst sofort sehen für was man die framework braucht.

gruss
Steven
 
Hallo SwiZZ,

QUOTE
wenn ich dich richtig verstehe brauchst du jsf java server faces oder java struts.
such mal in google nach...


Okay, das wurde mir schonmal gesagt. Gehts wirklich nicht ohne JSF oder Struts, nur mit JSP?

Aber okay, ich werd mir mal JSF definitiv ansehen.


QUOTE
ich weiss es hat mit dem topic nicht zu tun, aber wenn dich java interessiert, schau mal auch java hibernate, du wirst sofort sehen für was man die framework braucht.


Thx, ich kenne Hibernate bereits, hab auch schon ein paar Testprojekte damit gemacht.

--

PS: Für mich hat sich das Problem soweit erledigt. Ich benutze "Tiles", das ist ein Sub-Projekt von Struts welches *genau diese Aufgabe erfüllt*. Struts an sich ist mir zu gross für dieses Projekt.
 
Hallo madox,

falls das Problem eventuell doch noch aktuell sein sollte, könntest Du es bspw über RequestDispatcher-Includes oder das jsp:include-Tage regeln, das ganze könnte in etwa folgendermapen aussehen (ungetestet runtergetippt):

Das Servlet impressum macht ein forward auf die design.jsp und übergibt per request-Attribute die einzubindenden JSPs:
CODE RequestDispatcher rd = getServletContext().getRequestDispatcher( "design.jsp" );
if ( rd != null ) {
request.setAttribute( "mainContent", "IMPRESSUM.JSP" );
request.setAttribute( "secondContent", "KONTAKT.JSP" );
rd.forward( request, response );
}

Damit wird die Abarbeitung des Requests vollständig an DESIGN.JSP übergeben, hier erfolgen nun die Ausgaben, bspw:

CODE <%
String mainContent = "DEFAULT-JSP";
if ( request.getAttribute( "mainContent" ) != null ) {
mainContent = (String) request.getAttribute( "mainContent" );
}
%><jsp:include page="<%= mainContent %>"/>


Und analog für den zweiten Teil (KONTAKT.JSP).

Das sollte dann eigentlich zu dem gewünschten Ergebnis führen.

Viele Grüße,

Maddin
 
Zurück
Oben