JSF - wie navigieren ?

KarlRannseier

Grünschnabel
Hallo Zusammen,
ich setzte mich z.Z. mit JSF auseinander und möchte ein kleines Projekt aufsetzen.

Momentan zerbreche ich mir den Kopf wie ich am geschicktesten in JSF navigieren kann.
Ich möchte es gerne vermeiden immer von einer *.jsf Datei zur nächsten springe zu müssen, sondern hätte es gerne so dass in der URL immer "index.jsf" steht und dann der Content je nach Parameter geladen wird. (Der Grund ist der, dass ich nur Einmal den Rahmen definieren will und immer nur den Conten neu schreibe).

Um das zu erreichen habe ich meine Seite in mehrere Teile aufgeteilt und folgende "index.xhtml" erstellt.

HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">
<body>
<ui:composition template="#{d.layout}">
    <ui:define name="title">Das ist meine Indexseite</ui:define>
    
    <ui:define name="heading">
        <ui:include src="#{n.headerFile}" />
    </ui:define>
    
    <ui:define name="navigation">
        <ui:include src="#{n.navigationFile}" />
    </ui:define> 
    
    <ui:define name="content">
        <ui:include src="#{n.contentFile}" />
    </ui:define>
</ui:composition>
</body>
</html>

Über das Bean "n" möchte ich dann die inkludierten Dateien dynamisch auswählen können. Um die Attribute des Bean "n" zu ändern verwende ich "CommandLinks" über die in der verbundenen action die Attribute geändert werden.

Hier ist die Headerdatei in der die CommandLinks stehen:

HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
	xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core">
<body>
	<div id="menu">
	   <ul>
	    <ui:repeat value="#{d.navigation.availableTargets}" var="target">
		  <li>
		      <h:form id="commandLink">
		      <h:commandLink id="link1" value="#{target.displayName}" action="#{d.navigation.navigate}" immediate="true" >
		          <f:param name="param_navigateTo" value="#{target.navigationId}" />    
		      </h:commandLink>
		      </h:form> 
		      </li>
		</ui:repeat>
	   </ul>
	</div>
</body>
</html>

In der Action wird dann einfach der Setter für die Attribute des Beans "n" aufgerufen.
Und ich habe gehofft dass das ausreicht um eine andere Inhaltsseite zu laden.

Nur leider funktioniert das nicht so ganz wie ich mir das gedacht habe. Folgendes passiert jetzt wenn ich die CommandLinks verwende:
  • Angezeigt wird die "Seite 1".
  • Ich Klicke auf den Button für "Seite 4".
  • Es wird erneut die "Seite 1" angezeigt und die Attribute im Bean "n.*" werden mit den Werten der "Seite 4" gefüllt.
  • Ich Klicke auf "Seite 2".
  • Jetzt wird "Seite 4" Angezeigt und die Attribute im Bean "n.*" werden mit den Werten der "Seite 2" gefüllt.
  • usw...

So wie ich das sehe wird die Attributänderung zwar durchgeführt aber erst im nächsten Aufruf auch berücksichtigt.

Und meine Frage ist:
Bin ich mit meinem Vorhaben volkommen auf dem Holzweg und ist eine Navigation nach diesem Schema gar nicht möglich ? Wie navigiert Ihr wenn ihr dynamische Menus haben wollt ? Muss mann zwangsweise diese "Navigation-Rules" verwenden ? Oder mach ich einfach eine kleinen Fehler ?

Sollte ich lieber doch je Contentseite eine xhtml-Datei erstellen und dann in jeder diese "<ui:composition template="#{d.layout}">" ausfüllen ?



Ich bin für jeden Tipp sehr dankbar da ich im moment irgendwie nen Hiernknoten habe.
Falls noch irgendwelche Informationen Fehlen reiche ich die gerne nach.

Danke und beste Grüße
Karl
 
Zuletzt bearbeitet:
Hallo zusammen,
ich habe für mein Problem jetzt eine andere Lösung gewählt.

Jetzt verwende ich zur Navigation h:commandButtons die per Outcome die nächste jsf-Datei definieren. Dadurch "springt" zwar die URL immer zwischen den Seiten, aber anderer Seits können jetzt je nach Unterseite auch unterschiedliche Bookmarks gesetzt werden. Und dadurch das der Outcome auch direkt interpretiert wird, kann ich mir die Definition von Navigation-Rules ersparen.

Warscheinlich war mein Ansatz "nur über ein Index.jsf" geheh zu wollen einfach nicht mehr der richtige für JSF.

Danke und gruß
 

Neue Beiträge

Zurück