Thomas Spiegl: Committer MyFaces.
Einstieg: http://facelets.dev.java.net
Nachteile von JSP… JSF 1.1-Problem falsche plazierte Renderung, kein Template-Framework. MyFaces hat Tiles-ViewHandler.
Warum Facelets verwenden:
HTML-Content kann schlecht in Komponentenbaum eingefügt werden.
1.es Beispiel
<h:panelGrid columns=1">
<h1><h:outputText value="text" />
</h1></h:panelGrid>
Rendert als:
<table><tr><td>text</td></tr>
<h1></h1>
</table>
(Ist aber bei 1.2 gelöst mit automatischem verbatim-Tag).
2.es Beispiel
<h:outputLabel for="name" />
<h:inputText id="name" />
JSP und JSF 1.1: Label wird erst beim 2.en Request auf die Seite gerendert.
Facelets und JSF 1.1: Label wird gerendert. Komponentenbaum wird vor Renderphase aufgebaut.
(Ist auch bei JSF 1.2) vorhanden.
DataTable mit DataScroller – funktioniert nur, wenn der DS unterhalb der Table liegt.
- Performance 10-15% besser als JSP.
- besseres Error-Reporting.
- "leichte" Komponenten
- einfaches Templating, ohne XML;
- besseres Error Reporting – in web.xml. ui:debug
- Designerfreundlich.
- Konzept w
Einrichten
FaceletViewHandler einbinden in faces-config.xml
Tag Libraries in facelets.LIBRARIES (web.xml Context-Param)
facelets.DEVELOPMENT
facelets.BUFFER_SIZE
facelets.REFRESH_PERIOD; Standard = 2 (Sekunden), lädt die XHTML-Dateien nach. -1 zum Ausschalten.
facelets.VIEW_MAPPINGS
facelets.SKIP_COMMENTS false ist default. Sonst werden Kommentare übermittelt.
facelets.BUILD_BEFORE_RESTORE default: false. Facelet baut Komponentenbaum ganz ab Beginn auf.
Erforderliche jars:
- el-ri.jar
- el-api.jar
- jsf-facelets.jar
JSF EL auch zum Schreiben von Properties. EL-libs für 1.5 kompiliert, aber im Netz auch noch für 1.4.
Maven-Konfig: Dependencies. http://maven-repository.dev.java.net/nonav/repository
Legacy-Attribut setzen für mvn2
Logging-Eigenschaften separat.
Beispielseite: Normales XHTML, Namespaces eingebunden.
Templating
xmlns:ui="http://~"
Verwendung
mit ui:composition und ui:define. Alles außerhalb wird nicht geändert
Beispiel: XHML-Datei erstelllt. Facelet-Namespace geholt und ui:definitionen => Template
Neue Datei mit Verweisauf Template. <ui:composition><ui:define name="content" >Das ist Inhalt => überscjreibt default-Wert.
ui:decorate : Inhalt fügt sich ein, alles Umgebende wird mitgerender
jsfc – Zur Kompilezeit Element in Komponente umwandeln.
<input type="text" jsfc="h:inputText" etc.
JSTL-Support: Nur eingeschränktes Set. Probleme beim Rendern: encodeChildren="true"
ui:repeat statt c:forEach (buggy); besser rendered="true" oder t:dataList
Custom TagLibs
Komponenten rein aus XHTML – TagHandler, Converter, Validator,
2 Alternative: 1 XML-Tag pro Komponente
1 XML-Tag, das eine Java-Klasse spezifiziert, welche die Konfiguration ausführt.
<facelet-taglib>
<namespace …>
<tag>
<tag-name> etc.
Oder an Klasse binden (aber ungewöhnlich)
Einbindung der TagLib. Context-Param in web.xml facelets.LIBRARIES
oder Meta-Inf-Einbindung über WEB-INF/lib (automatisch)
Dynamische Komponenten
in Facelets library
Beispiel f. Eingabekomponente.
ui:component alle Anderen sind Kind-Elemente.
Ist echte Komponente im Baum.
Label mit Eingabekomponenten-Validierung. <f:validateLength>, indem in Template <ui:insert /> eingefügt wird. Input-Text bekomment Validator gesetzt
Dynamische Menüs-Beispiel.
Beispiel: Table-/Scroller-Kombination.
Method-Binding
funktioniert nicht: action="#{myBean.myAction}"
sondern backing="{#myBean}" action="myAction"
und command action="backing[myBean]" (###?, prüfen###)
Welche <ui:…/>-Tags
ui:fragment: rendert auch außenstehenden Text.
ui:composite
ui:decorate
ui:component
EL-Funktionen
JSP-Komponenten müssen in Taglib definiert werden. Component-Type + -Renderer festlegen.
Taglibs z.B.zum Einbinden in Tomahawk, auf Wiki-Seite von Faces.
Tag-Handler – Beispiel für Method-Binding. Tag-Handler nur einmal. dataTable-Tag-Handler: var-Spezialität. In Tomahawk kann das var-Attribut über Binding angespr werden
MetaRulest -Aliase, Attribute ignorieren, Meta-Rules f. Method-Binding.
Inlined EL-Expression: unterstützen keine Konvertierung und kein Encoding (also für Prototyping)
Debugging-Ausgabe: Mit Component-Tree und Scoped Vars, sehr nützlich.
In JSF 2.0 sollte eine ähnliche Technologie im Standard vorhanden sein (2008).
KGs Fazit:
Facelets sind JSP eindeutig vorzuziehen. Erhebliche Erleichterungen beim Erstellen von Taglibs. Intuitiveres Programmieren.
Schreibe einen Kommentar