SlideShare uma empresa Scribd logo
1 de 28
JSF 2-Kompositkomponenten
  Kompositkomponenten im Einsatz


       Michael Kurz | IRIAN
Agenda

•   Motivation
•   JSF 2-Ressourcenverwaltung
•   ABC der Kompositkomponenten
•   Erweiterte Konzepte
•   Beispiele
•   Ausblick: Integration von Ajax
MOTIVATION
Motivation

• Komponente zentraler Bestandteil von JSF



• Eigene Komponente nötig/sinnvoll
• Klassische Komponenten
  – Mächtig aber komplex (JSF-Meisterprüfung)
• Neuer Ansatz: Kompositkomponenten
  – Komponenten ohne Java und XML
  – Wiederverwendung von Seitenfragmenten
Klassische Komponenten
    Komponente




     Komponente   Renderer   Tag-Handler   Taglib




       Skript       Bild     Stylesheet
Kompositkomponenten

• Komponenten ohne Java und XML

    Komponente




      Komposit-   Skript   Bild   Stylesheet
     komponente
JSF 2-RESSOURCEN
Einsatz von Ressourcen

• Ressourcen (Bilder, Skripte oder Stylesheets)
   – In JSF-Seiten über Tags
   – Als Abhängigkeiten in Komponenten
• Ressource hat einen Namen...
  <h:graphicImage name="image.png"/>

• ... und liegt optional in einer Bibliothek
  <h:graphicImage library="images" name="image.png"/>
  <h:outputScript library="scripts" name="script.js"/>
  <h:outputStylesheet library="css" name="style.css"/>
Auflösung von Ressourcen

• Auflösung von Ressourcen in JSF:
   1. In /resources in der Webapplikation
   2. In /META-INF/resources im Classpath
• Bibliothek als Verzeichnis interpretiert
       /
           resources
              images
              image.png

• Positionierung in der Seite
• h:head und h:body nicht vergessen!
ABC DER
KOMPOSITKOMPONENTEN
Einsatz einer Kompositkomponente

• Kompositkomponente panelBox.xhtml
       /
           resources
              mygourmet
              panelBox.xhtml

• Verwendung in einer Seite
 <html xmlns:h="http://java.sun.com/jsf/html"
   xmlns:mc="http://java.sun.com/jsf/composite/mygourmet">
   <mc:panelBox title="Panel-Header">
     <h:outputText value="Erster Text"/>
     <h:outputText value="Zweiter Text"/>
   </mc:panelBox>
 </html>
Beispiel einer Kompositkomponente

• Kompositkomponente panelBox.xhtml
 <html xmlns:h="http://java.sun.com/jsf/html"
     xmlns:cc="http://java.sun.com/jsf/composite">
 <head><title>Panel box component</title></head><body>
 <cc:interface>
   <cc:attribute name="title"/>
 </cc:interface>
 <cc:implementation>
   <h:panelGroup layout="block">
     <h:outputText value="#{cc.attrs.title}"/>
     <cc:insertChildren/>
   </h:panelGroup>
 </cc:implementation>
 </body></html>
Resultierender Komponentenbaum

• Teilbaum der Komponente panelBox.xhtml

                                          Automatisch erstellte
                      UINamingContainer
                                           Wurzelkomponente


                       HtmlPanelGroup


   HtmlOutputText       HtmlOutputText    HtmlOutputText


              Komponenten der              Komponenten aus
             Kompositkomponente            aufrufender Seite
cc:interface

• Schnittstelle der Komponente nach außen
• Definition von Attributen und Facets
  – cc:attribute
  – cc:facet
• Verhalten interner Komponenten
  – cc:valueHolder
  – cc:editableValueHolder
  – cc:actionSource
Attribute

• Attribute
  <cc:attribute name="label" required="true"/>
  <cc:attribute name="text" required=false/>
  <cc:attribute name="header" default="Header"/>

• Attribute mit Typ oder Methoden-Signatur
  <cc:attribute name="max" type="java.lang.Integer"/>
  <cc:attribute name="cancelAction"
      method-signature="java.lang.String f()"/>

• Spezialfall: action-Attribut
  <cc:attribute name="action" targets="save"/>
Beispiel für cc:interface 1/2

• Kompositkomponente simpleInput.xhtml
 <cc:interface>
   <cc:attribute name="label" default="Input"/>
   <cc:attribute name="action" targets="submit"/>
   <cc:attribute name="value" required="true"/>
   <cc:editableValueHolder name="input"/>
   <cc:actionSource name="submit"/>
 </cc:interface>
 <cc:implementation>
   <h:outputLabel for="in" value="#{cc.attrs.label}"/>
   <h:inputText id="in" value="#{cc.attrs.value}"/>
   <h:commandButton id="submit" value="Submit"/>
 </cc:implementation>
Beispiel für cc:interface 2/2

• simpleInput.xhtml im Einsatz

 <mc:simpleInput action="#{myBean.save}"
     value="#{myBean.longValue}">
   <f:actionListener for="submit"
       binding="#{myBean.saveListener}"/>
   <f:validateLength for="input" minimum="10"/>
   <f:valueChangeListener for="input"
       binding="#{myBean.valueChanged}"/>
 </mc:simpleInput>
cc:implementation

• Implizites Objekt cc
  – Aktuellen Kompositkomponente
  – #{cc.attrs.myAttribute}
  – #{cc.facets.myFacet}
• Kindkomponenten einfügen:
  – <cc:insertChildren/>
• Facets aus aufrufender Seite verwenden:
  – <cc:insertFacet name="header"/>
  – <cc:renderFacet name="header"/>
Beispiel für cc:implementation 1/2

• Kompositkomponente panelBox.xhtml
 <cc:interface>
   <cc:facet name="header" required="false"/>
 </cc:interface>
 <cc:implementation>
   <h:panelGroup layout="block">
     <c:if test="#{!empty cc.facets.header}">
       <p><cc:renderFacet name="header"/></p>
     </c:if>
     <cc:insertChildren/>
   </h:panelGroup>
 </cc:implementation>
Beispiel für cc:implementation 2/2

• Komponente panelBox.xhtml mit Facets
 <mc:panelBox id="menu">
   <f:facet name="header">
     <h:outputText value="Menu"/>
   </f:facet>
   <h:panelGrid columns="1">
     <h:commandLink action="page1" value="Page 1"/>
     <h:commandLink action="page2" value="Page 2"/>
   </h:panelGrid>
 </mc:panelBox>
                              Menu
• Mögliche Ausgabe:           Page 1
                              Page 2
Demonstration




Kompositkomponente collapsiblePanel




Beispiel: https://github.com/jsflive/collapsible01
ERWEITERTE KONZEPTE
Ressourcen in Kompositkomponenten

• Ressourcen in Kompositkomponenten:
  <cc:implementation>
    <h:outputScript library="mygourmet"
        name="script.js" target="head"/>
    <h:outputStylesheet name="style.css"
        library="mygourmet"/>
  </cc:implementation>

• Bibliothek this in JSF 2.1
  <cc:implementation>
    <h:outputScript target="head"
        value="#{resource['this:script.js']}"/>
  </cc:implementation>
Benutzerdefinierte Wurzelkomponente

• Spezielles Verhalten in Java implementieren
• Wurzelkomponente über Komponententyp
  <cc:interface componentType="at.irian.MyComponent"/>

  @FacesComponent("at.irian.MyComponent")
  public class MyComponent extends UINamingContainer{}

• Direkter Zugriff auf Eigenschaften
  <h:panelGroup rendered="#{cc.visible}">
    <cc:insertChildren/>
  </h:panelGroup>
Demonstration




Benutzerdefinierte Wurzelkomponente
Kompositkomponente mit benutzerdefinierter
Wurzelkomponente

Beispiel: https://github.com/jsflive/collapsible02
Die eigene Komponentenbibliothek

• JAR mit Artefakten erstellen
  1. Kompositkomponenten in /META-INF/resources
  2. Konfiguration (.taglib.xml) in /META-INF
     <facelet-taglib version="2.0" ...>
       <namespace>http://at.irian/mygourmet</namespace>
       <composite-library-name>mygourmet
       </composite-library-name>
     </facelet-taglib>

  3. Komponenten, Konverter, Validatoren...
  4. faces-config.xml in /META-INF
Demonstration




Die eigene Komponentenbibliothek




Beispiel: https://github.com/jsflive/collapsible03
Neugierig?




• Marinschek, Kurz, Müllan:
  JavaServer Faces 2.0, dpunkt.Verlag
• Irian JSF@Work Online-Tutorial
  http://jsfatwork.irian.at
• JSFlive Weblog
  http://jsflive.wordpress.com

Mais conteúdo relacionado

Mais procurados

DB-Schema-Evolution mit LiquiBase
DB-Schema-Evolution mit LiquiBaseDB-Schema-Evolution mit LiquiBase
DB-Schema-Evolution mit LiquiBasegedoplan
 
Fanstatic pycon.de 2012
Fanstatic pycon.de 2012Fanstatic pycon.de 2012
Fanstatic pycon.de 2012Daniel Havlik
 
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScript
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScriptJSF meets JS (2. ed.) - JSF-Komponenten mit JavaScript
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScriptOPEN KNOWLEDGE GmbH
 
Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...
Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...
Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...Oliver Hader
 
Frontend Performance
Frontend PerformanceFrontend Performance
Frontend Performancenikflip
 
Angular von 0 auf 100
Angular von 0 auf 100Angular von 0 auf 100
Angular von 0 auf 100Yvette Teiken
 
Nooku, Molajo & Co - Joomla! Distributionen. Oder Forks.
Nooku, Molajo & Co - Joomla! Distributionen. Oder Forks.Nooku, Molajo & Co - Joomla! Distributionen. Oder Forks.
Nooku, Molajo & Co - Joomla! Distributionen. Oder Forks.David Jardin
 
WebGL - 3D im Browser - Erfahrungsbericht mit BabylonJS
WebGL - 3D im Browser - Erfahrungsbericht mit BabylonJSWebGL - 3D im Browser - Erfahrungsbericht mit BabylonJS
WebGL - 3D im Browser - Erfahrungsbericht mit BabylonJSOliver Hader
 
Schlanke Webarchitekturen nicht nur mit JSF 2 und CDI
Schlanke Webarchitekturen nicht nur mit JSF 2 und CDISchlanke Webarchitekturen nicht nur mit JSF 2 und CDI
Schlanke Webarchitekturen nicht nur mit JSF 2 und CDIadesso AG
 
Wieviel client braucht das web
Wieviel client braucht das webWieviel client braucht das web
Wieviel client braucht das webgedoplan
 
Building Enterprise Applications with AngularJS (GDG DevFest Karlsruhe 2014)
Building Enterprise Applications with AngularJS (GDG DevFest Karlsruhe 2014)Building Enterprise Applications with AngularJS (GDG DevFest Karlsruhe 2014)
Building Enterprise Applications with AngularJS (GDG DevFest Karlsruhe 2014)Christian Janz
 
Wieviel Client braucht das Web?
Wieviel Client braucht das Web?Wieviel Client braucht das Web?
Wieviel Client braucht das Web?gedoplan
 
WPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF RundumschlagWPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF RundumschlagHendrik Lösch
 

Mais procurados (20)

DB-Schema-Evolution mit LiquiBase
DB-Schema-Evolution mit LiquiBaseDB-Schema-Evolution mit LiquiBase
DB-Schema-Evolution mit LiquiBase
 
GWT: Eintauchen in MVP und Internationalisierung
GWT: Eintauchen in MVP und InternationalisierungGWT: Eintauchen in MVP und Internationalisierung
GWT: Eintauchen in MVP und Internationalisierung
 
MVP mit dem Google Web Toolkit
MVP mit dem Google Web ToolkitMVP mit dem Google Web Toolkit
MVP mit dem Google Web Toolkit
 
Eintauchen in MVP mit GWT
Eintauchen in MVP mit GWT Eintauchen in MVP mit GWT
Eintauchen in MVP mit GWT
 
Fanstatic pycon.de 2012
Fanstatic pycon.de 2012Fanstatic pycon.de 2012
Fanstatic pycon.de 2012
 
Web Components
Web ComponentsWeb Components
Web Components
 
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScript
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScriptJSF meets JS (2. ed.) - JSF-Komponenten mit JavaScript
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScript
 
Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...
Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...
Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...
 
Query Result Caching
Query Result CachingQuery Result Caching
Query Result Caching
 
Frontend Performance
Frontend PerformanceFrontend Performance
Frontend Performance
 
Angular von 0 auf 100
Angular von 0 auf 100Angular von 0 auf 100
Angular von 0 auf 100
 
Backbase Intro
Backbase IntroBackbase Intro
Backbase Intro
 
Nooku, Molajo & Co - Joomla! Distributionen. Oder Forks.
Nooku, Molajo & Co - Joomla! Distributionen. Oder Forks.Nooku, Molajo & Co - Joomla! Distributionen. Oder Forks.
Nooku, Molajo & Co - Joomla! Distributionen. Oder Forks.
 
WebGL - 3D im Browser - Erfahrungsbericht mit BabylonJS
WebGL - 3D im Browser - Erfahrungsbericht mit BabylonJSWebGL - 3D im Browser - Erfahrungsbericht mit BabylonJS
WebGL - 3D im Browser - Erfahrungsbericht mit BabylonJS
 
Schlanke Webarchitekturen nicht nur mit JSF 2 und CDI
Schlanke Webarchitekturen nicht nur mit JSF 2 und CDISchlanke Webarchitekturen nicht nur mit JSF 2 und CDI
Schlanke Webarchitekturen nicht nur mit JSF 2 und CDI
 
Workshop Vue js
Workshop Vue jsWorkshop Vue js
Workshop Vue js
 
Wieviel client braucht das web
Wieviel client braucht das webWieviel client braucht das web
Wieviel client braucht das web
 
Building Enterprise Applications with AngularJS (GDG DevFest Karlsruhe 2014)
Building Enterprise Applications with AngularJS (GDG DevFest Karlsruhe 2014)Building Enterprise Applications with AngularJS (GDG DevFest Karlsruhe 2014)
Building Enterprise Applications with AngularJS (GDG DevFest Karlsruhe 2014)
 
Wieviel Client braucht das Web?
Wieviel Client braucht das Web?Wieviel Client braucht das Web?
Wieviel Client braucht das Web?
 
WPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF RundumschlagWPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF Rundumschlag
 

Semelhante a JSF 2 Kompositkomponenten (JAX 2012)

Von 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im WebVon 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im WebSebastian Springer
 
Welches Webframework passt zu mir? (WJAX)
Welches Webframework passt zu mir? (WJAX)Welches Webframework passt zu mir? (WJAX)
Welches Webframework passt zu mir? (WJAX)Alexander Casall
 
JavaServer Faces - Ein schneller Schnelleinstieg
JavaServer Faces - Ein schneller SchnelleinstiegJavaServer Faces - Ein schneller Schnelleinstieg
JavaServer Faces - Ein schneller Schnelleinstiegtimbrueckner
 
Schnelle Winkel: 10x schnellere Webapps mit AngularJS und JEE
Schnelle Winkel: 10x schnellere Webapps mit AngularJS und JEESchnelle Winkel: 10x schnellere Webapps mit AngularJS und JEE
Schnelle Winkel: 10x schnellere Webapps mit AngularJS und JEEBenjamin Schmid
 
PHP-Module in statischen Seiten - Architektur-Ansätze
PHP-Module in statischen Seiten - Architektur-AnsätzePHP-Module in statischen Seiten - Architektur-Ansätze
PHP-Module in statischen Seiten - Architektur-AnsätzeRalf Lütke
 
Python builds mit ant
Python builds mit antPython builds mit ant
Python builds mit antroskakori
 
jQueryMobile mit Extbase/Fluid
jQueryMobile mit Extbase/FluidjQueryMobile mit Extbase/Fluid
jQueryMobile mit Extbase/FluidPeter Schuhmann
 
Einstieg in Xpath für SEO (Campixx2021)
Einstieg in Xpath für SEO (Campixx2021)Einstieg in Xpath für SEO (Campixx2021)
Einstieg in Xpath für SEO (Campixx2021)Sebastian Adler
 
Einführung in die Java-Webentwicklung - Part II - [3 of 3] - Java Server Face...
Einführung in die Java-Webentwicklung - Part II - [3 of 3] - Java Server Face...Einführung in die Java-Webentwicklung - Part II - [3 of 3] - Java Server Face...
Einführung in die Java-Webentwicklung - Part II - [3 of 3] - Java Server Face...kaftanenko
 
Web Performance Optimierung (WPO)
Web Performance Optimierung (WPO)Web Performance Optimierung (WPO)
Web Performance Optimierung (WPO)Martin Kliehm
 
Andy bosch-jsf-javascript
Andy bosch-jsf-javascriptAndy bosch-jsf-javascript
Andy bosch-jsf-javascriptAndy Bosch
 
QS-Tag 2015 - Web Layout Testing mit Galen und webmate
QS-Tag 2015 - Web Layout Testing mit Galen und webmateQS-Tag 2015 - Web Layout Testing mit Galen und webmate
QS-Tag 2015 - Web Layout Testing mit Galen und webmateMichael Mirold
 

Semelhante a JSF 2 Kompositkomponenten (JAX 2012) (20)

Von 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im WebVon 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im Web
 
Welches Webframework passt zu mir? (WJAX)
Welches Webframework passt zu mir? (WJAX)Welches Webframework passt zu mir? (WJAX)
Welches Webframework passt zu mir? (WJAX)
 
Einführung in React
Einführung in ReactEinführung in React
Einführung in React
 
JavaServer Faces - Ein schneller Schnelleinstieg
JavaServer Faces - Ein schneller SchnelleinstiegJavaServer Faces - Ein schneller Schnelleinstieg
JavaServer Faces - Ein schneller Schnelleinstieg
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
 
Schnelle Winkel: 10x schnellere Webapps mit AngularJS und JEE
Schnelle Winkel: 10x schnellere Webapps mit AngularJS und JEESchnelle Winkel: 10x schnellere Webapps mit AngularJS und JEE
Schnelle Winkel: 10x schnellere Webapps mit AngularJS und JEE
 
PHP-Module in statischen Seiten - Architektur-Ansätze
PHP-Module in statischen Seiten - Architektur-AnsätzePHP-Module in statischen Seiten - Architektur-Ansätze
PHP-Module in statischen Seiten - Architektur-Ansätze
 
Wicket Kurzübersicht
Wicket KurzübersichtWicket Kurzübersicht
Wicket Kurzübersicht
 
Python builds mit ant
Python builds mit antPython builds mit ant
Python builds mit ant
 
CSS Clean Code
CSS Clean CodeCSS Clean Code
CSS Clean Code
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
 
Blank Template für Joomla!
Blank Template für Joomla!Blank Template für Joomla!
Blank Template für Joomla!
 
jQueryMobile mit Extbase/Fluid
jQueryMobile mit Extbase/FluidjQueryMobile mit Extbase/Fluid
jQueryMobile mit Extbase/Fluid
 
Einstieg in Xpath für SEO (Campixx2021)
Einstieg in Xpath für SEO (Campixx2021)Einstieg in Xpath für SEO (Campixx2021)
Einstieg in Xpath für SEO (Campixx2021)
 
react-de.pdf
react-de.pdfreact-de.pdf
react-de.pdf
 
Node.js
Node.jsNode.js
Node.js
 
Einführung in die Java-Webentwicklung - Part II - [3 of 3] - Java Server Face...
Einführung in die Java-Webentwicklung - Part II - [3 of 3] - Java Server Face...Einführung in die Java-Webentwicklung - Part II - [3 of 3] - Java Server Face...
Einführung in die Java-Webentwicklung - Part II - [3 of 3] - Java Server Face...
 
Web Performance Optimierung (WPO)
Web Performance Optimierung (WPO)Web Performance Optimierung (WPO)
Web Performance Optimierung (WPO)
 
Andy bosch-jsf-javascript
Andy bosch-jsf-javascriptAndy bosch-jsf-javascript
Andy bosch-jsf-javascript
 
QS-Tag 2015 - Web Layout Testing mit Galen und webmate
QS-Tag 2015 - Web Layout Testing mit Galen und webmateQS-Tag 2015 - Web Layout Testing mit Galen und webmate
QS-Tag 2015 - Web Layout Testing mit Galen und webmate
 

JSF 2 Kompositkomponenten (JAX 2012)

  • 1. JSF 2-Kompositkomponenten Kompositkomponenten im Einsatz Michael Kurz | IRIAN
  • 2. Agenda • Motivation • JSF 2-Ressourcenverwaltung • ABC der Kompositkomponenten • Erweiterte Konzepte • Beispiele • Ausblick: Integration von Ajax
  • 4. Motivation • Komponente zentraler Bestandteil von JSF • Eigene Komponente nötig/sinnvoll • Klassische Komponenten – Mächtig aber komplex (JSF-Meisterprüfung) • Neuer Ansatz: Kompositkomponenten – Komponenten ohne Java und XML – Wiederverwendung von Seitenfragmenten
  • 5. Klassische Komponenten Komponente Komponente Renderer Tag-Handler Taglib Skript Bild Stylesheet
  • 6. Kompositkomponenten • Komponenten ohne Java und XML Komponente Komposit- Skript Bild Stylesheet komponente
  • 8. Einsatz von Ressourcen • Ressourcen (Bilder, Skripte oder Stylesheets) – In JSF-Seiten über Tags – Als Abhängigkeiten in Komponenten • Ressource hat einen Namen... <h:graphicImage name="image.png"/> • ... und liegt optional in einer Bibliothek <h:graphicImage library="images" name="image.png"/> <h:outputScript library="scripts" name="script.js"/> <h:outputStylesheet library="css" name="style.css"/>
  • 9. Auflösung von Ressourcen • Auflösung von Ressourcen in JSF: 1. In /resources in der Webapplikation 2. In /META-INF/resources im Classpath • Bibliothek als Verzeichnis interpretiert / resources images image.png • Positionierung in der Seite • h:head und h:body nicht vergessen!
  • 11. Einsatz einer Kompositkomponente • Kompositkomponente panelBox.xhtml / resources mygourmet panelBox.xhtml • Verwendung in einer Seite <html xmlns:h="http://java.sun.com/jsf/html" xmlns:mc="http://java.sun.com/jsf/composite/mygourmet"> <mc:panelBox title="Panel-Header"> <h:outputText value="Erster Text"/> <h:outputText value="Zweiter Text"/> </mc:panelBox> </html>
  • 12. Beispiel einer Kompositkomponente • Kompositkomponente panelBox.xhtml <html xmlns:h="http://java.sun.com/jsf/html" xmlns:cc="http://java.sun.com/jsf/composite"> <head><title>Panel box component</title></head><body> <cc:interface> <cc:attribute name="title"/> </cc:interface> <cc:implementation> <h:panelGroup layout="block"> <h:outputText value="#{cc.attrs.title}"/> <cc:insertChildren/> </h:panelGroup> </cc:implementation> </body></html>
  • 13. Resultierender Komponentenbaum • Teilbaum der Komponente panelBox.xhtml Automatisch erstellte UINamingContainer Wurzelkomponente HtmlPanelGroup HtmlOutputText HtmlOutputText HtmlOutputText Komponenten der Komponenten aus Kompositkomponente aufrufender Seite
  • 14. cc:interface • Schnittstelle der Komponente nach außen • Definition von Attributen und Facets – cc:attribute – cc:facet • Verhalten interner Komponenten – cc:valueHolder – cc:editableValueHolder – cc:actionSource
  • 15. Attribute • Attribute <cc:attribute name="label" required="true"/> <cc:attribute name="text" required=false/> <cc:attribute name="header" default="Header"/> • Attribute mit Typ oder Methoden-Signatur <cc:attribute name="max" type="java.lang.Integer"/> <cc:attribute name="cancelAction" method-signature="java.lang.String f()"/> • Spezialfall: action-Attribut <cc:attribute name="action" targets="save"/>
  • 16. Beispiel für cc:interface 1/2 • Kompositkomponente simpleInput.xhtml <cc:interface> <cc:attribute name="label" default="Input"/> <cc:attribute name="action" targets="submit"/> <cc:attribute name="value" required="true"/> <cc:editableValueHolder name="input"/> <cc:actionSource name="submit"/> </cc:interface> <cc:implementation> <h:outputLabel for="in" value="#{cc.attrs.label}"/> <h:inputText id="in" value="#{cc.attrs.value}"/> <h:commandButton id="submit" value="Submit"/> </cc:implementation>
  • 17. Beispiel für cc:interface 2/2 • simpleInput.xhtml im Einsatz <mc:simpleInput action="#{myBean.save}" value="#{myBean.longValue}"> <f:actionListener for="submit" binding="#{myBean.saveListener}"/> <f:validateLength for="input" minimum="10"/> <f:valueChangeListener for="input" binding="#{myBean.valueChanged}"/> </mc:simpleInput>
  • 18. cc:implementation • Implizites Objekt cc – Aktuellen Kompositkomponente – #{cc.attrs.myAttribute} – #{cc.facets.myFacet} • Kindkomponenten einfügen: – <cc:insertChildren/> • Facets aus aufrufender Seite verwenden: – <cc:insertFacet name="header"/> – <cc:renderFacet name="header"/>
  • 19. Beispiel für cc:implementation 1/2 • Kompositkomponente panelBox.xhtml <cc:interface> <cc:facet name="header" required="false"/> </cc:interface> <cc:implementation> <h:panelGroup layout="block"> <c:if test="#{!empty cc.facets.header}"> <p><cc:renderFacet name="header"/></p> </c:if> <cc:insertChildren/> </h:panelGroup> </cc:implementation>
  • 20. Beispiel für cc:implementation 2/2 • Komponente panelBox.xhtml mit Facets <mc:panelBox id="menu"> <f:facet name="header"> <h:outputText value="Menu"/> </f:facet> <h:panelGrid columns="1"> <h:commandLink action="page1" value="Page 1"/> <h:commandLink action="page2" value="Page 2"/> </h:panelGrid> </mc:panelBox> Menu • Mögliche Ausgabe: Page 1 Page 2
  • 23. Ressourcen in Kompositkomponenten • Ressourcen in Kompositkomponenten: <cc:implementation> <h:outputScript library="mygourmet" name="script.js" target="head"/> <h:outputStylesheet name="style.css" library="mygourmet"/> </cc:implementation> • Bibliothek this in JSF 2.1 <cc:implementation> <h:outputScript target="head" value="#{resource['this:script.js']}"/> </cc:implementation>
  • 24. Benutzerdefinierte Wurzelkomponente • Spezielles Verhalten in Java implementieren • Wurzelkomponente über Komponententyp <cc:interface componentType="at.irian.MyComponent"/> @FacesComponent("at.irian.MyComponent") public class MyComponent extends UINamingContainer{} • Direkter Zugriff auf Eigenschaften <h:panelGroup rendered="#{cc.visible}"> <cc:insertChildren/> </h:panelGroup>
  • 25. Demonstration Benutzerdefinierte Wurzelkomponente Kompositkomponente mit benutzerdefinierter Wurzelkomponente Beispiel: https://github.com/jsflive/collapsible02
  • 26. Die eigene Komponentenbibliothek • JAR mit Artefakten erstellen 1. Kompositkomponenten in /META-INF/resources 2. Konfiguration (.taglib.xml) in /META-INF <facelet-taglib version="2.0" ...> <namespace>http://at.irian/mygourmet</namespace> <composite-library-name>mygourmet </composite-library-name> </facelet-taglib> 3. Komponenten, Konverter, Validatoren... 4. faces-config.xml in /META-INF
  • 27. Demonstration Die eigene Komponentenbibliothek Beispiel: https://github.com/jsflive/collapsible03
  • 28. Neugierig? • Marinschek, Kurz, Müllan: JavaServer Faces 2.0, dpunkt.Verlag • Irian JSF@Work Online-Tutorial http://jsfatwork.irian.at • JSFlive Weblog http://jsflive.wordpress.com