# JSF Layout Möglichkeiten



## Niki (27. Feb 2008)

Hallo Forum!

Ich beschäftige mich seit ein paar Tagen mit JSF und finde es eigentlich recht angenehm zum Programmieren (ich verwende die Standardimplementierung von SUN, also kein MyFaces oder IceFaces...).
Ich würde gerne in der Applikation das Header - Navigation - Content Layout verwenden (oben Header, links Navigation, und der restliche Platz soll für den Content verwendet werden)
Dafür verwende ich verschachtelte PanelGrids und für den Content eine panelGroup, in der ich den jeweiligen Content mit setRendered setze.
Mal die erste Frage: Ist das prinzipiell richtig, oder sollte man das anders lösen, ich hab da mal kurz was von Tiles gelesen....?

Mein generelles Problem bei diesem Layout ist, dass der Content nicht den Restplatz bekommt, sondern immer nur soviel wie er braucht, das schaut aber nicht gut aus. Gibt es für das PanelGrid irgenwelche Constraints oder so etwas ähnliches wie beim GridBagLayout unter Swing?
Meine JSP schaut wie folgt aus:

```
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>

<html>
<head>
<title>Hauptseite</title>
</head>
<body>
<f:view>
	<h:form id="mainForm">
		<h:panelGrid columns="1" border="0" cellpadding="0" cellspacing="0">
			<h:graphicImage url="/images/header.gif" width="800" height="100" />

			<h:panelGrid columns="2" border="1" cellpadding="0" cellspacing="0">
				<h:panelGrid columns="1" border="0" cellpadding="0" cellspacing="0"
					width="20%">
					<h:commandButton value="User auflisten"
						actionListener="#{navHandler.listUser}" />
					<h:commandButton value="User anlegen"
						actionListener="#{navHandler.addUser}" />
				</h:panelGrid>
				<h:panelGroup binding="#{navHandler.mainPanel}">
					<h:dataTable var="user" binding="#{navHandler.userTable}" border="1"
						width="80%" rendered="false">
						<h:column>
							<f:facet name="header">
								<h:outputText value="ID" />
							</f:facet>
							<h:outputText value="#{user.id}" />
						</h:column>
						<h:column>
							<f:facet name="header">
								<h:outputText value="Zuname" />
							</f:facet>
							<h:outputText value="#{user.surname}" />
						</h:column>
					</h:dataTable>
					<h:outputText binding="#{navHandler.userLabel}" value="User hinzufügen" rendered="false" />
				</h:panelGroup>
			</h:panelGrid>
		</h:panelGrid>
	</h:form>
	

<h:messages style="color:darkred" /></p>
</f:view>
</body>
</html>
```

Für Hinweise, Tipps, Vorschläge.... wäre ich sehr dankbar!


----------



## ms (27. Feb 2008)

Ich beschäftige mich auch erst seit kurzem mit JSF.
Ohne jetzt auf deinen Code näher einzugehen würde ich gleich zu einem Templateing-Framework wie Tiles oder Facelets raten. Wobei Facelets mehr als nur ein Templating-Framework ist.

ms


----------



## Niki (27. Feb 2008)

Danke für die schnelle Antwort!

Kannst du mir kurz erläutern was Tiles bzw Facelets sind, gibt es dafür irgendwelche Plugins für Eclipse?


----------



## ms (27. Feb 2008)

Grob gesagt: bei Tiles und Facelets wird jeweils ein Template erstellt welches z.B. die von dir gewünschten Bereiche definiert. Das ist das Grundgerüst.
Die eigentlichen Seiten beinhalten nur noch den Inhalt dieser Bereiche. Ein Aufruf einer solchen Seite geht also nicht direkt auf diese Seite sondern ruft das Template auf welches diese Seite wiederum inkludiert.

Ist aber wirklich nur ganz grob angerissen.
Im Netz gibts genügend Tutorials.

Ich verwende die MyEclipseIDE welches beim Projekt erstellen (Facelets) ganz praktisch ist. Andere Plugins kenne ich nicht.

ms


----------



## maki (27. Feb 2008)

Ist zwar ein paar Jahre her das ich mit Tiles gearbeitet habe (noch zu struts 1.1 Zeiten), aber ein großer Vorteil von Tiles gegenüber den normalen jsp:includes ist, dass die Tiles Templates wiederverwendbarer sind, jsp:includes setzen immer einen best. Kontext (Beans die da sein müssen, etc.) vorraus, während Tiles diesen Kontext selbst auch managen kann.


----------

