Templating mit Facelets
In JavaServer Faces gelangt man via „String“-Rückgabe von JSP-Seite zu JSP-Seite. Man lädt jede Seite also komplett neu.
Was macht man wenn jede Seite das gleiche Design haben soll?
Problem: ich müsste jetzt auf jeder Page das Design mitschleifen, dies würde aber zu redundantem Code und schlechter Wartbarkeit führen
- in php habe ich das bisher mit Includes gelöst
- ohne JSF mit JSP-only auch mit Includes
Lösung für JSF heißt Facelets mit Templating
so in etwa sah meine faces-config.xml aus (spielt eigentlich keine rolle)
Als erstes musste in der faces-config.xml der Facelet-View-Handler aktiviert werden.
{code type=JAVA}
<application>
<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
</application>
{/code}
nun muss noch die jsf-facelets.jar in den WebContent/WEB-INF/lib Folder.
Dannach muss die web.xml angepasst werden.
{code type=XML}
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup> 1 </load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
{/code}
Wichtig ist auch der DEFAULT_SUFFIX, ich habe ihn auf .jsp gestellt.
Eer ist bei anderen tutorials auf .xhtml gestellt gewesen, ich wollte meine Dateien aber mit der Endung .jsp haben. Man könnte auch eine eigene Endung festlegen z. B. : „own“.
{code type=XML}
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.jsp</param-value>
</context-param>
{/code}
Templating
Man erstellt als erstes sein Template, bei mir ist das template.jsp
obwohl die Datei Endung .jsp ist muss sie dem xhtml DOCTYPE genügen.
{code type=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“>
head>
<meta http-equiv=“Content-type“ content=“text/html; charset=utf-8″ />
<title>Schöbel.net</title>
</head>
<link
href=“#{facesContext.externalContext.requestContextPath}/design/css/my_layout.css“
rel=“stylesheet“ type=“text/css“ />
<ul>
<ui:insert name=“navigation_help“>
Default Menü
</ui:insert>
</ul>
<ui:insert name=“content“>
Default Body
</ui:insert>
</body>
</html>
{/code}
Wichtig sind die ui:insert Tags, sie schaffen Platzhalter die später Überschrieben werden können.
{code type=HTML}
<ui:insert name=“navigation_help“>
Text der überschrieben wird
</ui:insert>
{/code}
Jetzt kann man das Template nutzen.
Bei mir wäre das meine Ausgangsseite admin.jsp
{code type=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“ xml:lang=“en“ lang=“en“
xmlns:ui=“http://java.sun.com/jsf/facelets“>
<head>
<meta http-equiv=“Content-type“ content=“text/html; charset=utf-8″ />
</head>
<body>
<ui:composition template=“template.jsp“>
<ui:define name=“navigation_help“>
<li><strong>Hauptmenü</strong></li>
<li><em>bearbeiten </em></li>
<li><em>Ende</em></li>
</ui:define>
<ui:define name=“content“>
Das ist Inhalt der den Default Inhalt überschreibt
</ui:define>
</ui:composition>
</body>
</html>
{/code}
Als erstes verweist man auf das Template ui:composition.
Dannach kann man den Bereich definieren den man überschreiben möchte. Dazu nutzt man das Tag ui:define.
{code type=HTML}
<ui:composition template=“template.jsp“>
<ui:define name=“navigation_help“>
ich überschreibe navigation_help im template
</ui:define>
<ui:define name=“content“>
ich überschreibe content im template
</ui:define>
</ui:composition>
{/code}
Nun kann jede beliebige Seite aus der faces-config.xml angepasst werden
im quite often bouncing about the web most of the week hence I usually tend to peruse significantly, which unfortunately is not usually a beneficial factor as most of the internet sites I look at are composed of pointless trash copied from many other internet websites a zillion times, nonetheless I gotta give you props this page is frankly not bad at all and also seems to have a lot of unique information, so many thanks for stopping the trend of merely duplicating other individual’s websites, if you ever wanna play a couple of hands of myspace poker together just email me – you have my e mail 🙂
hello really good little site ya got there 🙂 I am using the matching theme on my website although for whatever weird explanation it would seem to load earlier on yours eventhough this blog includes more content. Have you been working with any sort of plugins or widgets that will quicken it up? If you could quite possibly give the widgets so maybe I could use them on my personal webpage so twilight eclipse fans could watch twilight new moon online trailers and films more quickly I’d personally be ever so happy – thanks ahead of time 🙂