# Master Page in JSF



## Phenix (7. Dez 2010)

Hallo zusammen,

ich arbeite mich gerade in JSF (2.0) ein und habe vorher immer nur mit JSP gearbeitet. Ich habe eine Frage, zu der ich im Internet immer nur widersprüchliche Antworten finde:

Gibt es in JSF die Möglichkeit, eine Masterseite zu definieren, um ein Layout nur an einer zentralen Stelle zu definieren, das dann für alle Seiten dieser Applikation gilt? Ich weiss, dass es bei ASP.NET diese Möglichkeit gibt.

Danke im Voraus


----------



## nocturne (7. Dez 2010)

Phenix hat gesagt.:


> Hallo zusammen,
> 
> ich arbeite mich gerade in JSF (2.0) ein und habe vorher immer nur mit JSP gearbeitet. Ich habe eine Frage, zu der ich im Internet immer nur widersprüchliche Antworten finde:
> 
> ...



JSF hat diese Funktion nicht. Du brauchst Facelets oder MyFaces oder ähnliche, du musst selber einschätzen welches Framework du dafür brauchst.


----------



## Phenix (7. Dez 2010)

Ok, danke.

Für einen Neuling auf diesem Gebiet ist es recht schwierig da durch zu blicken. 
Ohne größere Suche bin ich bereits auf folgende Frameworks gestossen:

JSF, Facelets, IceFaces,MyFaces, Struts....

Da stellt sich mir die Frage: Womit fängt man als Anfänger da am Besten an? Welches Framework bietet welche Vorteile? IceFaces gefiel mir auf den 1. Blick ganz gut. Was habt ihr für Erfahrungen? Gibt es eine Sinnvolle! Reihenfolge, in der man sich mit diesen Frameworks beschäftigen sollte? Etwa, erst einmal JSF und dann z.B. Icefaces?!


----------



## kidsos (7. Dez 2010)

Icefaces, Primefaces, usw. sind alles nur Aufsätze zu JSF, d.h. sie bieten dir schon vorgefertigte Komponenten, die JSF so nicht enthält. Struts hat da überhaupt nichts JSF zu tun, von daher das eine oder das andere 

Welches "Faces"-Framework du letztendlich nimmst, ist Geschmackssache. Bevor du irgendeines nimmst, solltest du dich am besten erst mit den grundlegenden JSF-Sachen auseinandersetzen.

Was die Masterpage-Frage angeht: So wie das bei ASP.NET realisiert ist, gibt es das bei JSF nicht. Aber du kannst dir in JSF Templates erstellen und die weiteren Seiten können von diesem ableiten oder selbst wieder ein Template bilden. Das kommt den Masterpage auf jeden Fall am nächsten.


----------



## nocturne (8. Dez 2010)

kidsos hat recht. 
Zu deiner Frage:
Wenn du frickeln willst gehst du auf die vielversprechende JSF-Linie.
Dazu würde ich folgenden Ablauf vorschlagen:
JSP (Das hast du ja fertig)
JSF (Netbeans) 
Facelets oder MyFaces (Eclipse)
ajax4jsf (Eclipse, ab hier mit Datenbank mit/ohne Hibernate)
Richfaces (JBoss Dev Studio)
Seam (JBoss Dev Studio)
Icefaces oder Primefaces (JBoss Dev Studio)
Cocoon (JBoss Dev Studio und IntelliJ IDEA)




Wenn du eintöniges Tippen willst das stabil läuft, solltest du Struts verwenden.


----------



## pherin (12. Dez 2010)

Phenix hat gesagt.:


> Hallo zusammen,
> 
> ich arbeite mich gerade in JSF (2.0) ein und habe vorher immer nur mit JSP gearbeitet. Ich habe eine Frage, zu der ich im Internet immer nur widersprüchliche Antworten finde:
> 
> ...



Da du dich ja bereits in die aktuelle JSF-Version einarbeitest, hast du den Vorteil, dass seit der Version 2.0 der empfohlene "Präsentationsmechanismus" Facelets ist und somit direkt in JSF2.0 eingebettet ist. Facelets ist eine sehr mächtige Templating-Methode, die aus den folgenden Bestandteilen besteht:
* Einem Template, das den eigentlichen Aufbau der Seite definiert
* Einem oder mehreren Template-Clients, die ein Template verwenden und bestimmte Inhalte definieren, die an festgelegten Stellen in den Template eingesetz werden.

Ein Template könnte zB wie folgt aussehen (template.xhtml):

```
<?xml version="1.0" encoding="UTF-8" ?>
<!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">
<h:head>
	<title>
		<ui:insert name="webpage_title">
			Standard-Titel
		</ui:insert>
	</title>
</h:head>
<h:body>
	<div id="header">
		<ui:insert name="webpage_header">
			Standard-Header // Könnte deine Navigation beinhalten
		</ui:insert>
	</div>
	<div id="content">
		<ui:insert name="webpage_content">
			Standard-Inhalt // Der eigentliche Inhalt deiner Seite
		</ui:insert>
	</div>
</h:body>
</html>
```

Ein Template-Client könnte dann in etwa so aussehen:

```
<?xml version="1.0" encoding="UTF-8" ?>

<ui:composition template="templates/template.xhtml"
	xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html">

	<ui:define name="webpage_title">
		Herzlich Willkommen
	</ui:define>
	<ui:define name="webpage_header">
		<a href="nav1.xhtml">Nav 1</a>
		<a href="nav2.xhtml">Nav 2</a>
	</ui:define>
	<ui:define name="webpage_content">
		Herzlich Willkommen auf unserer Internetseite!
	</ui:define>
</ui:composition>
```

Wichtig ist dabei zu wissen, dass Facelets alle Teile des Template-Client außerhalb der <ui:composition>-Tags abschneidet. 

Die <ui:insert>-Tags definieren die Bereiche an denen Inhalte durch den Template-Client eingefügt werden können. Die <ui:define>-Tags im Client definieren dann diese Inhalte und verbinden diese über den Namen mit den entsprechenden Teilen des Templates.

Um Facelets mit JSF2.0 zu verwenden ist keinerlei Konfiguration notwendig, da es, wie schon erwähnt, fix eingebaut in JSF2 ist.


----------



## Phenix (13. Dez 2010)

Sorry, dass ich mich jetzt erst melde.

Danke für die zahlreichen Antworten. 

@pherin
Das ist genau das, was ich gesucht habe. Danke dafür. Das kommt der Sache mit der Masterpage schon sehr sehr nahe.


----------



## pherin (13. Dez 2010)

Was ich noch vergessen habe:
Man kann auch mit <ui:include src="filename.xhtml" /> arbeiten. Damit kann man auch etwas kompliziertere Templates aufbauen. Diesen include-Files kann man auch parameter übergeben, die dann direkt ansprechbar sind.

Am besten dazu Dokumentation lesen.


----------

