JAX 07: Session: Apache Trinidad – 1st Class JSF

Trinidad ist ein Framework

  • Render Kit für HTML + Ajax
  • Beinhaltet Dialoge, optimierte Komponentenspeicherung
  • Maven 2 Faces – Plugin
  • Personalisierung / Layout-Anpassungen
  • Skinning: CSS-Eigenschaften

Historie

  • Trinidad wurde ursprünglich von Oracle geschenkt
  • Eingliederung in Apache MyFaces
  • Seit Sonntag, 22. April 2007, nicht mehr im Inkubator! Trinidad ist nun eine „offizielle“ Apache MyFaces Komponentenbibliothek
  • Lizenz: Apache 2.0

Neuerungen in Trinidad

  • Menu Model Abstraction
  • Maven 2 Faces Plugin
  • >> generiert Komponenten, Tags, XML-Files
  • Unterstützung von Facelets
  • CSS-Styles / Skinning ist möglich
  • Personalizaton Framework ist enthalten

Core Components (not complete)

  • tr:breadCrumbs – Navigation
  • tr:chart – Diagramm (wird vollständig per Vekorgrafik gerendert!)
  • tr:chooseColor – Farbeingabe
  • tr:chooseDate – Datumseingabe
  • tr:document – Seitencontainer, generiert die Elemente html, body und form.
  • tr:goButton & tr:goLink – Buttons / Links ohne Navigation
  • tr:icon – Skin
  • tr:image – Bild
  • tr:importScript – Script Imports
  • tr:inputFile – Upload
  • tr:navigationPane – Tabs, Bars oder Buttons als Navi-Leiste
  • tr:objectMedia – Multimedia-Inhalte
  • tr:inputNumberSpinbox – rauf/runter Pfeile, min / max-Values
  • tr:page – Layout
  • tr:panel* – verschiedene Layout- udn Visualisierungskomponenten
  • tr:poll – nutzt tr:progressIndicator, Partals Reload der Seite, progressIndicator triggert tr:poll und erzeugt Updates der Daten, tr:poll besitzt timer und bringt Daten ins GUI. „PPR“: Partial Page Rendering
  • tr:select* – Vielzahl an Auswahl-Komponenten
  • tr:seperator – Seperator (zB in Menüs, Select-Comps…)
  • tr:table – Table, mit Scrolling bereits enthalten
  • tr:train – Rendert Navigation
  • etc

Verwendung von PPR (Partial Page Rendering)

  • autoSubmit – für input-Komponenten, um eine action abzufeuern
  • partialSubmit – für command-Komponenten (link / button)
  • partialTriggers – für listener, beziehen sich auf eine Komponente (connect per Properties id / partialTriggers)
  • Alternativ: eine gewöhnliche Komponente in einem Poll ( tr:poll ) einfassen.

Dialog Framework

  • dialog:wizard, useWindow-Attribut setzen
  • Darstellung der Seite (nach Request) per Navi-Regel in einem eigenen (Browser-)Fenster

Links:

  • Sample App: http://code.google.com/ …trinidad

thanks to Mathias Weßendorf 🙂

JSF Bibliotheken manipulieren (@ JAX 07)

  • Bekannt: Apache MyFaces, Sun RI
  • Aufsätze: Apache Shale, Seam, Ajax4JSF (Interaktion zwischen Ajax und JSF), Facelets
  • Komponenten-Bibliotheken: Apache MyFaces Tomahawk / Trinidad / Tobago, ICEFaces, Rich Faces, etc…

Rederklassen und Komponenten sind austauschbar!

  • Renderer implementieren Konvertierungen, De- und Encoding…
  • In der „faces-config.xml“ kann der Renderer ausgewechselt werden
  • Komponenten enthalten Eigenschaften, aber auch selbst En- / Decoding, Validierung und Konvertierung

Auch Kernklassen sind austauschbar. Zum Beispiel der Navigation Handler, State Manager, View Handler, Variable Resolver etc…

Java Persistence API Basics (@ JAX 07)

  • Standard für Persistenz in Java; Teil von EJB 3.0 (JSR220); RI = Toplink Essentials (Glassfish)
  • Vereinfachung von EJB 2.0
  • Java5 Annotations (und XML…)
  • ORM-Frameworks: Eclipse Link (Oracle Toplink), Hibernate (JBoss), OpenJPA & Cayenne (Apache)

Annotationen:

  • @Entity für Class, @Generated für Felder
  • @Temporal, @OneToOne für eigene Felder und Beziehungen

Spring Framework:

  • Apache 2.0 License
  • Als eine Art „Abhilfe“ für Java EE (J2EE) -> Einfach!
  • Sehr mächtiges Tool (AOP, Transactionsm DI, JDBC), Anbindung an verschiedenFrameworks (JSF, Struts, EJB, Hibernate, AspectJ…)
  • Direkter Support vorhanden für Hbernate, OpenJPA, Toplink
  • Integration in JSF: JSF View -> JSF Bean (View Controller) -> Service -> DAO/Repository

Anbindung:

  • Deklaration eines EntityManager via konkreter Implementierung einer Bean
  • Dann: TransactionManager deklarieren, direkte Übergabe an EntityManagerFactory-Bean

Links:

Facelets – Basics (@ JAX 07)

Intro:

  • Einsatz möglich in JSF 1.2. In JSF 2.0 wird voraussichtlich ein Templating-Ansatz von Haus aus vorhanden sein.
  • Verschiedene Komponenten können zusammengefasst als neue Komponente definiert werden, was wesentich schneller funktionieren kann als eine eigenen neue Komponente zu schreiben.
  • Nur Doc-Type „xhtml:transitional“ möglich

Konfiguration:

  • in web.xml oder über Wildcard (siehe Doku)

Templating:

  • Template-Datei wird angelegt, z.B. „/myTemplate.xhtml“
  • Aufbau wie JSP-Seite mit HTML-Tags undeinigen Sonderfeldern für die Faclets-Steuerung
  • Tag: „<ui:insert>
  • Neue Seiten werden einfach als xhtml-Content angelegt und via faces gerendert. Dabei wird sich, wie in der Content-Datei via Tag „<ui:comosition>“ angegeben, auf das (Master-) Template bezogen.

Komponenten verbinden / neue Komponenten:

  • Definition von neuen Komponenten auf Basis der herkömmlichen Komponenten, z.B., „verkleben“ von „h:outputLabel“ und „h:inpuText“.
  • xhtml-Datei beschreibt die neue Komponente (im Ordner „WEB-INF“)
  • Angabe weiterer Eigenschaften in Definitionsdatei möglich
  • Definition einer Taglib für die neue Komponente, z.B. jax.taglib.xml.
  • In der Taglib: Angabe des Namespaces, Tagname, Sourcefile etc
  • Die Taglib wird anschliessend noch in der web.xml registriert
  • Komponente kann nun durch Einbinden des Namespaces via „xmlns:“ in den Content-Files genutzt werden

Bean Scopes

Bean Scopes (in Reihenfolge der Lebensdauer):

  • NONE: das Objekt wird bei jedem Zugriff neu angelegt
  • REQUEST: das Objek wird beim Start des Request Lifecycles angelegt und wieder entfernt, wenn der Cycle durchlaufen ist
  • FLASH: Ein State des Tomahawk-Projektes. Objekt wird auf Anweisung in den Komponentenbaum mit aufgenommen und bleibt bis zum nächsten Request erhalten. Bleib also auf der „gleichen“ Seite und noch genau bis zur nächsten Seite erhalten. Field muss mit „t:saveState“ in den Flash-Fokus gehoben werden.
  • DIALOG: Verschiedene Komponentenbibliotheken implemetieren eine Variante, die Objekte zwischen 2 definierten Punkten leben lassen. U.a. erfüllen Trinidad und Shale diese Technik. Bsp: „s:conversationStart“ / „s:conversationEnd“
  • SESSION: Statis bleiben genau während der (per Coockie) gespeicherten Session erhalten. Dies ist allerdings extrem speicherineffizient.
  • APPLICATION: Zentrale Settings, Basisdaten, für alle Benutzer identisch

JSF & MyFaces: Session terminieren

Die klassische Methode, um eine JSF-Session zu beenden, ist über den Zugriff auf die Session via dem externen Kontext der Webanwendung in der entsprechenden Backingbean:

public String logout() {
FacesContext fc = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) fc.getExternalContext().getSession(false);
session.invalidate();
return „logout_success“;
}

Bei Verwendung der MyFaces-Implementierung >= 1.4 fehlt jedoch das HttpSession – Objekt. In der JSP ist der Zugriff jedoch ohne Probleme möglich:

<% session.invalidate(); %>
<c:redirect url=“login.jsf“ />

MyFaces

MyFaces ist der zur Zeit popumärste frei verfügbare Kompenentenstamm für JSF-Anwendungen. In dem Myfaces-Projekt werden zur Zeit 3 verscheidene Kompeonentenstränge gebündelt:

  • Tomahawk: Original MyFaces Komponenten-Bibliothek. Ist zur Zeit die populärste Bibliothek, jedoch ist die Dokumentation nicht besonders umfassend.
  • Tobago: Ursprünglich durch das Apache-Projekt gegründeter Komponentenstamm, der nun in MyFaces eingegliedert wurde. Kommt gemessen am Grad der Verbreitung gleich nach Tomahawk.
  • Trinidad: Entwicklung von Oracle (Oracle ADF). Wurden in 2006 von Oracle an Apache gespendet. Die Komponenten sind sehr gut erweiterbar und professionell geschrieben, jedoch gibt es aufgrund der kürzlichen Eingliederung noch keine gute Dokumentation. Allerdings könnten diese Komponenten aufgrund der guten Qualität zu den popumlärsten Stamm wachsen.

Tabellenzellen in t:dataTable (2)

Die dataTable ist an sich ein gutes Werkzeug, um Daten übersichtlich darzustellen. Allerdings wird machmal auch eine unterschiedliche Farbgebung der einzelnen Zellen benötigt, um bestimmte Informationen schneller auffindbar zu machen. In dem folgenden Beispiel wird ein möglicher Lösungsweg dargestellt.

Die entsprechende Backing Bean wird um eine Methode ergänzt, die einen HTML-Farbcolde zurückliefert. Der Wert wird dann direkt in die entsprechende style-Eigenschaft geschrieben:

 <t:column sortable=”true”>
<f:facet name=”header”>
<t:outputText value=”#{bundle.colHeader1}” />
</f:facet>

<t:outputText value=”#{myValue.mywert}” style=”#{myValue.style}”></t:outputText>

</t:column>

MyFaces – panelNavigation2 und CSS

Dynamische Menüs sind toll, und wenn diese Session Save sind ist es noch viel besser! Das Apache MyFaces Projekt hat dazu eine Komponente entwickelt: panelNavigation2. Doch die passende Dokumentation ist noch im Entstehen, und einige Examples lassen sich leider nicht vollständig laden. So bleiben wichtige Teile des JSP-Sourcecodes verborgen, was vor allem Neueinsteigern das Leben schwer machen kann… somit folgt hier also der komplette Sourcecode einer JSP mit der Komponente:

<div>
<f:loadBundle basename=“org.yourdomain.resource.ResourcesMenu“ var=“ResourcesMenu“ />
<h:form>
<t:div id=“subnavigation_outer“ forceId=“true“>
<t:div id=“subnavigation“ forceId=“true“>
<t:panelNavigation2 id=“nav1″ layout=“list“ itemClass=“mypage“
activeItemClass=“selected“
disabledStyle=“color:red;padding: 2px 20px 2px 25px“>
<t:navigationMenuItems id=“navitems“
value=“#{navigationMenu.panelNavigationItems}“ />
</t:panelNavigation2>
</t:div>
</t:div>
</h:form>
</div>

Wichtig – und nicht dokumentiert – ist u.a. dass man die Komponente in einem form-Tag wrappt, denn nur dann kann ja auch die hinterlegte Action ausgewertet werden. Außerdem sollte man bei dem einrahmenden DIV’s auch den forceId-Parameter auf true setzen, denn sonst würde, sobald man den Snippet in ein <jsp:include setzt, das CSS nicht mehr greifen.