Die wichtigsten Neuerungen in der Java Enterprise Edition 7
Seite 2: JSON, JSF, Servlet, Bean Validation
JSON als Arbeitskollege
Für Letzteres steht jetzt mit der Java API for JSON Processing ein Handwerkszeug zur Arbeit mit JSON (JavaScript Object Notation) bereit. Es werden eine Streaming API (JsonParser, JsonGenerator) und eine DOM API (JsonReader, JsonWriter) angeboten. Während die erste API ereignisgetrieben agiert, lässt sich mit der zweiten auf Objektebene arbeiten. Um JSON mit der Streaming API auf System.out zu schreiben, benötigt man lediglich JsonGenerator:
JsonGeneratorFactory factory = Json.createGeneratorFactory();
JsonGenerator gen = factory.createGenerator(System.out);
Einzelne Objekte werden der Ausgabe direkt hinzugefĂĽgt:
gen.writeStartObject().write("Java EE", "7").write("heise",
"Developer").writeEnd();
JsonWriter geht dabei objektgetrieben vor und ermöglicht das Erzeugen spezieller JSON-Datentypen:
JsonArray jsonArray = new JsonArrayBuilder().add(new JsonObjectBuilder()
.add("Java EE","7")).add(new JsonObjectBuilder()
.add("heise","Developer")).build();
An der Oberfläche
Passend zur Unterstützung zeitgemäßer Webtechniken versteht sich JSF jetzt mit HTML-5-konformem Markup. Die als data-* bekannten eigenen Datenattribute wurden bisher von den JSF-Komponenten verworfen und nicht gerendert. Genau das lässt sich nun mit einem neuen JSF-Tag erreichen.
<h:inputText value="#{person.email}">
<f:passThroughAttribute name="data-length" value="10"/>
</h:inputText>
Alle JSF-Komponenten verstehen den neuen Weg. Entlang dieser Kleinigkeit gibt es viele weitere Änderungen. Dazu gehören die neuen View Actions, die Request-Variablen an das Modell binden können, eine mit AJAX erstellte File-Upload-Komponente, die Einführung von Stateless Views und eine überarbeitete Integration von CDI (Contexts and Dependency Injection) inklusive der Anpassung der Scopes. Eines der großen neuen Funktionspakete stellt Faces Flow dar. Hierbei handelt sich es um eine Erweiterung der Navigation, mit der es einfacher ist, geführte Dialogstrecken für Anwender zur Verfügung zu stellen. Diese werden Wizzard genannt und haben neben einer definierten Abfolge von Dialogen einen eigenen Gültigkeitsbereich für die Daten. Flows lassen sich über den <f:metadata>-Tag direkt in Facelets verwenden, aber auch programmatisch erzeugen. Sie werden ähnlich der impliziten Navigation direkt als Action gestartet, beispielsweise über:
<h:commandLink value="Enter flow" action="someFlowName" />
Wenn es definiert ist, ist eine zugehörige JavaBean während des Flows verfügbar:
@Named
@FlowScoped(id = "someFlowName")
public class SomBean {
public String someReturn() {
return "/somePage.xhtml";
}
}
Zu Ihren Diensten
Hinter der neuen Version der Servlets verbergen sich hauptsächlich drei kleinere Erweiterungen. Wichtigster Aspekt ist die Umsetzung des seit HTTP 1.1 (RFC 2616) möglichen Protokoll-Upgrades – dieser Mechanismus ermöglicht die neue WebSockets-Spezifikation erst. Der neue javax.servlet.http.HttpUpgradeHandler ist dafür zuständig. Ein schönes Beispiel liefert Spezifikations-Lead Shing Wai Chan in seinem Blog.
Auch in Sachen Sicherheit hat sich etwas getan. So werden bisher nur die HTTP-Methoden geschützt, die explizit in der web.xml definiert sind. Vielfach sind das nur GET und POST gewesen. Die übrigen (HEAD, PUT, DELETE etc.) verblieben zumeist per Standardeinstellung ungeschützt. Das lässt sich nun umdrehen und somit alles schützen, was nicht explizit freigegeben wird (<deny-uncovered-http-methods/>). Auch hat man eine neue Semantik "Jeder authentisierte User" eingeführt, was die Prüfung auf die Gesamtsumme aller Rollen vereinfacht. Dabei gibt es einen Unterschied: "*" bezieht sich auf jede in der web.xml definierte Rolle und "**" auf jeden authentifizierten Nutzer.
Viel gewonnen
Die Zusammenarbeit mit der Bean-Validation-Spezifikation wurde deutlich verbessert. Jetzt lassen sich Methodenparameter validieren, nicht nur mit Standard-Validatoren (@NotNull), sondern auch mit eigenen, nutzerdefinierten Constraints. Damit ist gleich die größte Neuerung in Bean Validation beschrieben. Neben der Methodenvalidierung kann man Konstruktor-Validierungen durchführen, und auch hier wurde die Integration in die CDI-Spezifikation vorangetrieben. Es ist jetzt beispielsweise möglich, @Inject in Validatoren zu verwenden. In Meldungen können Entwickler jetzt Expression-Language-Ausdrücke einsetzen. Das führt zu einer deutlich flexibleren Darstellung.
javax.validation.constraints.DecimalMax.message= Muss weniger
${inclusive == true ? 'gleich sein zu ' : ''}{value}
Die Expression Language unterstützt in Version 3.0 neben neuen Operatoren nun Collections und Lambda-Ausdrücke. Letztere allerdings nur zukünftig unter Java SE 8. Die EL lässt sich jetzt auch alleinstehend verwenden:
ELProcessor el = new ELProcessor;
Object result = el.eval("'Hello, ' + user.name");
Und es lassen sich eigene Resolver oder Klassen hinzufügen. Eigene Typ-Konverter und EvaluationListener runden das Bild ab und machen sie zu einer komplett eigenständigen und mächtigen Spezifikation.