Templating mit JSF und Facelets

KarlRannseier

Grünschnabel
Hallo Community,
ich habe irgendwie eine Gedankenknoten und hoffe ihr könnt mir Helfen :confused: .
Also ich bin noch recht neu in J2EE / JSF / ... und habe auch noch die letzten Jahre PHP programmiert, dadurch bin gedanklich etwas vorbelastet und denke ggf. in ein ganz falsche Richtung.

Ich such eine Lösung wie ich eine Webseite in Templates aufteilen kann.
Also etwa der Klassiker : Eine LayoutDatei die, einen Headerbereich, einen Navigationsbereich, und einen Bodybereich beinhaltet.

In PHP hatte ich mir dann immer in der "index.php" das "MasterLayout" geladen, und dann darin die jeweiligen Inhalte "includiert/reingeladen". Was dann als Body geladen wurde, habe ich über eine Variable in der URL gesteuert, die ich dann in der Index.php ausgewertet hatte. am ende der index.php hatte ich dann "ein Stück" Html, das ich per "echo/print" an den Browser gesendet hatte.

Jetzt möchte ich sowas ähnliches mit Hilfe von JSF und Faclets zusammenbauen (ich danke das dies die beste Lösung/Kombination ist, wenn nicht lerne ich geren dazu :) ).

Soweit ich mich bis jetzt belesen habe kann ich z.B. in einer "index.jsf" dann eine "navigation.jsf" mit Hilfe des <ui:include src="navigation.jsf"> Tags einbinden. was ich mich jetzt Frage ist, wie ich die "navigation.jsf" aufbaue. Denn soweit ich es verstanden habe übergebe ich in JSF nicht mehr irgend was per URL. und ich möchte gerne vermeiden für jede Bodyseite das Gerüst der Webseite zu definieren, auch wenn ich per "<ui:insert ..>" die Navigation in die jsf laden könnte. Also ich möchte gerne (so wie ich es aus PHP kenne) immer wieder auf meine haupt "index.jsf" zeigen.

Also wie sollte dann der "Link" aussehen der in der "navigation.jsf" eingetragen ist ?
Und wie/wo steuer ich das je nach dem welcher link "geclickt" wurde ein anderer Body geladen wird?
Geht das überhaupt so wie ich mir das Vorstelle? oder bin ich auf ein total falschen Dampfer.

Ich habe schon einiges gelsen konnte aber nichts finden was mir hier gezielt weiterhilft. Alles was ich gefunden habe erklärt jsf immer im allgemeine und beschäftigt sich nicht richtig mit Include und aufbau einer gesamten webseite. i.d.R. wird dann ein "mini-Formular" zu addieren oder so erstellt. und darin zeigt die "faces-config" per "navigation rule" einfach von "calculate.jsf" nach "result.jsf".

Ich hoffe ich konnte mein Problem irgendwie verständlich machen.

Vielen Dank für eure Antworten schon mal im Voraus, und falls ich mich unklar ausgedrückt habe versuche ich gerne es auch anders zu beschreiben.

Beste Grüße
Karl
 
Hallo,

bin auch noch ziemlich neu in diesem Themenbereich. Aber ich habe es vor ein paar Tagen selbst einmal probiert. Es gibt zwar sicher mehr Möglichkeiten, aber ich habe es so gelöst.

Und zwar habe ich eine SessionBean erstellt, mit einem String, welcher mir den zuletzt geklickten Button speichert. Dazu habe ich mehrere setta-Methoden in diese Bean geschrieben (z.B. setStringToLogin(){this.str = "login";...}). Wenn du nun z.B. den Login Button in JSF erstellst (mittels <h:commandButton...> oder so), kannst du mehrere Attribute darin angeben. Einer davon ist (glaube ich jetzt mal) action="#{bean.setStringToLogin}" (so irgendwie). Darin rufst du einfach diese Methode dieser Bean auf wenn du auf diesen Button klickst und ist login in string gespeichert und du kannst diesen string dann in deiner jsf seite abfragen. Da die Bean eine SessionBean ist, bleibt der Wert auch solange in dieser Bean erhalten, bis du was anderes hineinschreibst oda die Cookies löscht. Die if-Abfrage könnte so aussehen in deiner jsf seite:
Code:
<c:choose>
 <c:when test="${bean.str == 'login'}">
  //inlcude
 </c:when>
 ....
</c:choose>

So. Ich weiß zwar jetzt vorn und hinten nicht ob die Syntax und so passt, da ich gerade nicht mein prog zur Verfügung habe, aber sie müsste ungefähr passen. Achja...Navigation Rule brauchst du eigentlich nicht, da du auf die selbe Seite, von welcher du durch den Button kommst, zurückgelangst (ist halt bei mir so).

Eine Bean erstellt man ganz normal. Um sie zur SessionBean zu machen, musst du in deinem WebProjekt auf die faces-config.xml gehen und darin auf ManagedBeans klicken. Da kannst du dann bei Add, diese Bean als session bean hinzufügen, oder du schreibst sie selbst in den Source händisch hinein.

Hoffe, dass dir diese Antwort irgendwie weiterhilft. Wenn ich mal Zeit habe und du noch ungefähr so den Source brauchst, könnte ich mal was posten.

mfg
 
Zuletzt bearbeitet von einem Moderator:
Hi Frozenlife,
vielen dank für deine Hilfe, das hört sich für mich echt schlüssig an. Ich werde das mal so ausprobieren.
Mir ist gestern beim Studieren weiterer Tutorials aufgefallen das diese Idee (nur über ein index.jsp zu gehen) wahrscheinlich zu "PHP typisch" ist, und ich habe mich damit angefreundet u.U. für jede Seite einen den Aufruf auf die <body>.jsp zu machen.
Diese Includiert dann jeweils das Template.
Allerdings hätte ich damit das Problem das ich in dem Navigations Template, irgendwie die URL auswerten muss um den aktiven Menupunkt highlighten zu können.
Mit der Lösung einer Bean die ich zum Navigieren verwende könnte ich dieses Problem einfacher lösen.
Naja ich werde mal beides Ausprobieren.
Vielen dank auf jeden Fall. Mein Gedankenknoten scheint sich langsam zu lösen.

Beste Grüße
Karl
 

Neue Beiträge

Zurück