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

Socket-Programmierung in Java

Java als plattformunabhängige Programmiersprache unterstützt im Package java.net unmittelbar die Socket-Programmierung. Das zeigt die Betriebssystemunabhängigkeit des Socket-Konzeptes. Die Implementierung der Sockets für die verschiedenen Plattformen (Linux, Windows, Spezialsysteme) erfolgt in der Klassenbibliothek der virtuellen Maschine.

Die Klassen für die Socket-Programmierung sind Socket und ServerSocket. Folgendes Kurzbeispiel zeigt die Verwendung:

ServerSocket serverSocket = new ServerSocket(port);
//Serversocket mit bestimmter Portnummer erstellen
while(true) {
Socket clientSocket = serverSocket.accept();
//auf Anfragen warten
InputStream input = clientSocket.getInputStream();
//InputStream-Objekt öffnen
int data = input.read();
//Daten lesen
clientSocket.close();
//Verbindung schließen
}

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“ />

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.

Tabellenzellen in t:dataTable

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 Methoden ergänzt, die boolsche Werte zurückliefern. Je nach Wert wird dann nur eine Komponente gerendert:

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

</f:facet>

<t:outputText rendered=“#{myValue.testTooLow}“ value=“#{myValue.mywert}“ style=“color:blue;“></t:outputText>
<t:outputText rendered=“#{myValue.testCorrect}“ value=“#{myValue.mywert}“></t:outputText>

</t:column>