JAX 2007: Facelets und JSF (Thomas Spiegl, IRIAN.at)

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.

  1. Keine Kommentare