Struts: Link Navigation ?!

NetPerformance

Erfahrenes Mitglied
Hallo,

Ich habe eine Struts Seite folgendermaßen aufgebaut
Screenshot: http://www.aaron.de/test/navigation.gif

Wie muss ich theoretisch vorgehen, wenn ich das folgende Szenario erzielen möchte:

Ich klicke auf "Navi 1" und innerhalb von "content.jsp" wird "seite_1.jsp" geladen.
Ich klicke auf "Navi 2" und innerhalt von "content.jsp" wird "seite_2.jsp" geladen.

usw.

Bis jetzt habe ich nur einfache forwards gemacht. Wenn ich forwarde, wird "main.jsp" ersetzt und nicht "content.jsp".

Gruß und Dank im Vorraus
Aaron
 
Hallo Aaron,

was du verwenden willst scheint mir eine Art "embedded Frame" zu sein. Ob das mit Struts hinzubekommen ist kann ich jetzt auch nicht sicher sagen. Da würde ich dir empfehlen in der Doku zum Tag <html:link /> aus der html-Taglib nachzusehen. Evtl gibt es da ein Target-Attribut und so kann man das dann vielleicht machen.

Ein andere Methode wäre aber der Einsatz von Tiles. Die Seite wird zwar immer neu geladen, aber z.B. Navigation, Header und Footer müssen nur einmal "includiert" werden. Den content kannst du dann immer austauschen lassen. Schau dir das mal an, vielleicht ist das das richtige für dich.

Grüße
Christian
 
Kann nur das unterstreichen was Chaertl gesagt hat.

Das was du vorhast, ist das gleiche (und viel mehr) was Tiles dir bietet. Gerade im zusammenhang mit Struts ist Tiles die richtige Lösung


Kurz: du bastelst dir ein Template und speicherst es z.b unter WEB-INF/templates/base.jsp

HTML:
<%@ page language="java"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles" prefix="tiles" %>

<html:html locale="true">
<head>
<html:base />
</head>
<body>
<table border="1" width="600" cellspacing="5">
<tbody>
<tr>
     <td><tiles:insert attribute="navi" /></td>
    <td width="600"><tiles:insert attribute="content" /></td>
<tr>
</tbody>
</table>
</body>
</html:html>

Dann kannst du deine Seiten follgendermassen aufbauen:
Beispiel die seite superheftig.jsp

HTML:
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>
<tiles:insert page="/WEB-INF/templates/base.jsp" flush="true">
 <tiles:put name="navi" value="/WEB-INF/tiles/eineseite/navi.jsp" />
  <tiles:put name="conent" value="/WEB-INF/tiles/eineseite/superheftigcontent.jsp" />  
</tiles:insert>

Jetzt hast du 2 Seiten definiert die per "put" in das vorrher definierte "insert" hineingeschoben werden.
(Gibt noch eine anderen Weg die seiten zu deklarieren).

Jetzt kannst du die Teile navi.jsp bzw superheftigcontent.jsp mit deinem Zeuch füllen.
 
Frage:

So wie du das Ganze vorgeschlagen hast, muss ich in jede *.jsp Datei das layout bzw. Template einbinden.
Um das Einbinden des Templates sauberer zu gestalten, hat man die Möglichkeit, das Template über tiles-definition an die entsprechenden *.jsp Seiten zu vererben.

Hier habe ich unter kooperation.default die template Seite angegeben und per extends an kooperation.index vererbt.

tiles-defs.xml
Code:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">

<tiles-definitions>
	
	<!-- Base Tiles Definition -->
	<definition name="kooperation.default" path="layout.jsp">
		<put name="navigation" value="navigation.jsp" />
		<put name="content" value="welcome.jsp" />
	</definition>
	
	<definition name="kooperation.index" extends="kooperation.default">
	</definition>
	
</tiles-definitions>

Jetzt muss ich in der index.jsp kooperation.index bzw. das Layout aufrufen.

Wie kann ich das machen ?

Gruß
Aaron
 
Zuletzt bearbeitet:
Danke für den Tip. Ich werds gleich versuchen.
Jedoch würde mich interessieren, warum ich überhaupt mappen muss ?!
Wenn ich index.jsp starte, soll das Layout aus tiles-defs.xml angezeigt werden.
Warum wird hier ein Action benötigt ? Ich klicke nicht auf irgendwelche Buttons.

Gruß
Aaron
 
nun du bist über tiles-definitions gegangen. Du kannst auch so wie ich das gezeigt habe die Definitionen direkt in die jsp schrieben dann brauchst du nichts mappen.


sprich in die index.jsp:
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %> <tiles:insert page="/WEB-INF/templates/base.jsp" flush="true"> <tiles:put name="navi" value="/WEB-INF/tiles/eineseite/navi.jsp" /> <tiles:put name="conent" value="/WEB-INF/tiles/eineseite/superheftigcontent.jsp" /> </tiles:insert>

dann brauchst du das nicht in tiles-definitions deklarieren.

Die tiles-definitions sorgt ja dafür das du nicht für alle .jsp's JSP dateien anlegen musst, sondern das er eben aus dieser konfiguration herausliest welche teile er verwendet.
Du hast beide möglichkeiten.
 

Neue Beiträge

Zurück