Neues aus der Java-Welt: JavaServer Faces 2.3

Seite 2: Neuigkeiten I

Inhaltsverzeichnis

Version 2.3 wird eine Reihe größerer und kleinerer Erweiterungen bringen, genannt "Big Ticket Features" und "Other Features". Letztere enthalten eine Vielzahl weniger wichtigerer Ergänzungen oder Änderungen wie die Einführung eines Disabled-Attributs für Buttons und zusätzliche Event-Listener. Im Folgenden legt der Autor den Fokus jedoch auf die großen Änderungen.

Eine Neuerung ist die Unterstützung der mit Java 8 eingeführten Date Time API nebst entsprechendem Konverter. Sie fügt sich nahezu nahtlos in den bestehenden Konverter ein und wäre kaum bemerkenswert, wenn nicht für die Nutzung der neuen API Java 8 für den Betrieb des Application Server erforderlich wird. Im Hinblick auf den abgekündigten Support der Java-Versionen bis 7 ist dieser Schritt nur konsequent.

Der Konverter wurde um ein type-Attribut erweitert, das die Werte both, date, time, localDate, localTime, localDateTime, offsetTime, offsetDateTime und zonedDateTime entsprechend der Möglichkeiten der neuen API annehmen kann. Die Konvertierung erfolgt für die neue API unter Angabe des type-Attributs und gestaltet sich bei einem deutschen Datum so:

<f:convertDateTime type="localDate" pattern="dd.MM.yyyy"/>

Seit Java EE 6 ist CDI Bestandteil der Spezifikation und wurde auch gleich von JSF unterstützt. Das wird in der kommenden Version nochmals deutlich ausgebaut. Es werden die JSF-spezifischen impliziten EL-Objekte (Expression Language) direkt injizierbar sein. Beispiele hierfür sind Annotationen wie @ApplicationMap oder @SessionMap, die als Qualifier im Java-Code die entsprechenden Objekte auf einfache Art und Weise zur Verfügung stellen.

Die zusätzlichen Annotationen und Injektionsmöglichkeiten stehen nach aktuellem Stand erst nach Eintrag eines Kontextparameters in die Datei web.xml zur Verfügung.

<context-param>
<param-name>javax.faces.ENABLE_CDI_RESOLVER_CHAIN</param-name>
<param-value>true</param-value>
</context-param>

Möglicherweise ändert sich das bis zur finalen Version dahingehend, dass alle neuen Features, sofern sie nicht die Kompatibilität brechen, ohne besondere Konfiguration zur Verfügung stehen. Hier bleibt die Entwicklung abzuwarten.

Die neuen Annotationen sind neben @Inject als Qualifier im Einsatz. Um beispielsweise die SessionMap zu erhalten, war bisher Folgendes erforderlich:

FacesContext context = FacesContext.getCurrentInstance();
Map<String, Object> sessionMap = context.getExternalContext()
.getSessionMap();

Künftig reicht an der Stelle;

@Inject @SessionMap
private Map<String, Object> sessionMap;

Solch einfache Möglichkeiten an die passenden Objekte zu bringen, spart nicht nur Tipparbeit, sondern ist auch weniger fehleranfällig. Das allein ist schon hilfreich.

Deutlich interessanter ist jedoch die Möglichkeit, nun auch in Konverter und Validatoren injizieren zu können. Diese ließen sich in den früheren Versionen nicht als Injektionsziel nutzen, sodass teilweise recht aufwendige Klimmzüge notwendig waren, um an die benötigten Informationen zu gelangen. Die Injektionspunkte werden dabei wie gewohnt definiert, sodass sich ein Codebeispiel erübrigt.

Wer sich schon einmal geärgert hat, in <ui:repeat>, <c:forEach> oder <h:dataTable> nicht über eine Map oder manch andere Spielarten der Collections iterieren zu können, wird JSF 2.3 begrüßen. Neben einem erweiterten Support für Iterables werden endlich auch die Maps unterstützt. Mit ihnen lässt sich über alle Elemente iterieren und dabei sowohl auf den Schlüssel als auch den Wert der Map zugreifen. Um den Inhalt der oben genutzen SessionMap auszugeben, reicht folgender Code:

<ui:repeat value="#{annotationTest.sessionMap}" var="entry">
<p>
Key: #{entry.key} Value: #{entry.value}
</p>
</ui:repeat>

In vergleichbarer Form gilt das auch für die beiden anderen genannten Tags. Und wenn das nicht reicht, besteht die Möglichkeit, über einen Wrapper eigene Klassen iterierbar zu gestalten.