Wirklich unabhängige Composite Components

Im (sehr übersichtlichen) Blog von Michael Kurz habe ich eine sehr interessante Umsetzung einer Composite Component für JSF 2.0 gefunden, die einen komponentenspezifischen Zustand/Information völlig unabhängig von der aufrufenden Seite im JSF Komponentenbaum speichern kann. Die aufrufende Seite muss somit nichts über die Internas der Composite Component wissen und für die Komponente auch keine extra definierten Attribute in einer Managed Bean zur Verfügung stellen. best places to visit . Wenn die Composite Component auf vielen verschiedenen Seiten benutzt wird, führte das meist dazu, dass ein Zustand der Composite Component in vielen verschiedenen Managed Beans gespeichert wurde.

Mit der Lösung von Michael kann eine Composite Component jedoch völlig unabhängig von der aufrufenden Seite Informationen über interne Zustände im JSF Komponentenbaum ablegen, obwohl es weiterhin eine Composite Component bleibt und deutlich schlanker erheblich unkomplizierteer als eine “full fledged” Komponente ist.

Dabei ist zusätzlich zur bekannten XHTML-Datei der Composite Component nur eine weitere Java-Klasse zu erstellen, die noch dazu sehr übersichtlich und unkompliziert ausfällt.

Als ersten Schritt muss man im Kopf der Composite Component auf eine eigene Komponentenklasse verweisen:

<cc:interface componentType="at.jsflive.CollapsiblePanel">
  <cc:attribute name="collapsed"/>
  <cc:actionSource name="toggle"/>
  <cc:facet name="header"/>
</cc:interface>

Die Implementation dieser Klasse könnte so aussehen:

@FacesComponent("at.jsflive.CollapsiblePanel")
public class CollapsiblePanel extends UINamingContainer {

  enum PropertyKeys {collapsed}

  public boolean isCollapsed() {
    return (Boolean)getStateHelper().eval(
        PropertyKeys.collapsed, Boolean.FALSE);
  }

  public void setCollapsed(boolean collapsed) {
    getStateHelper().put(PropertyKeys.collapsed, collapsed);
  }

  public void toggle(ActionEvent e) {
    setCollapsed(!isCollapsed());
  }
}

Neben der Annotation muss man sich ausschließlich um das Speichern eines Zustands und das Verändern dieses Zustands kümmern. Auf die Methoden kann man innerhalb der Composite Component über das implizite “cc”-Objekt zugreifen, diesmal aber nicht über das attrs-Attribut sondern direkt:

<cc:implementation>
    ....
    <h:commandButton id="toggle" actionListener="#{cc.toggle}"
      image="#{resource[cc.collapsed
          ? 'jsflive:plus.png' : 'jsflive:minus.png']}"/>
    ....
</cc:implementation>

That’s it.

Das ausführliches Beispiel findet ihr im oben verlinkten Blog. Michael Kurz ist übrigens einer der Autoren von Java Server Faces 2.0. Außerdem betreut er das umfangreiche JSF-Tutorial jsfatwork

Leave a Reply

Your email address will not be published. Required fields are marked *

*