# Unified Expression Language

Die Java Unified Expression Language ("vereinheitlichte Ausdrucksprache") ist eine domänenspezifische Sprache, die hauptsächlich in Java-Webanwendungen zum Einbetten von Ausdrücken in Web-Seiten verwendet wird. Die Autoren und Expertengruppen der Java-Spezifikationen der Web-Technologienebene haben dazu eine vereinheitlichte Ausdrucksprache erarbeitet, die erstmals in der JSP-2.1-Spezifikation (JSR-245) integriert und später in JSR-341 als Teil von Java EE 7 referenziert wurde.

## Geschichte

Die Expression Language begann als Teil der JavaServer Pages Standard Tag Library (JSTL) und wurde ursprünglich SPEL (Simplest Possible Expression Language), im Weiteren jedoch nur noch Expression Language (EL) genannt. Es war eine Skriptsprache, die den Zugriff auf Java-Komponenten (JavaBeans) über JSP erlaubte. Seit JSP 2.0 wurde sie innerhalb von JSP-Befehlen genutzt um Java-Quelltext von JSP zu trennen und leichteren Zugriff auf Java-Komponenten (als mittels Java-Code) zu ermöglichen.
Über die Jahre hat sich die Expression Language weiterentwickelt, fortgeschrittenere Funktionalität integriert und wurde letztlich in die JSP 2.0-Spezifikation aufgenommen. Das Erstellen von Skripten wurde für Gestalter von Web-Inhalten vereinfacht, da diese üblicherweise über wenige bis keine Kenntnisse der Kernsprache Java verfügen. Diese Skriptfunktionalität machte aus JSP eine Skriptsprache im eigentlichen Sinn. Vor der Integration der EL bestand JSP aus wenigen speziellen Befehlen, wie Scriptlets, Ausdrücken usw. in die expliziter Java-Quelltext eingefügt wurde. Seit der Integration der EL müssen Gestalter von Web-Inhalten nur noch wissen, wie die Java-Kernmethoden korrekt aufzurufen sind.
EL war, sowohl syntaktisch als auch semantisch, ähnlich zu JavaScript-Ausdrücken:
* es gibt keine ausdrückliche Typumformung
* Typumwandlungen erfolgen üblicherweise implizit
* doppelte und einfache Anführungszeichen sind gleichbedeutend
* object.property hat dieselbe Bedeutung wie object['property']
EL befreite den Programmierer davon, die Einzelheiten, wie auf Werte tatsächlich zugegriffen wird, zu kennen: object.property kann (abhängig, was das object ist) entweder object.get("property") oder object.getProperty("property") oder object.getProperty usw., bedeuten.
Während der Entwicklung von JSP 2.0, wurde die Technik JavaServer Faces veröffentlicht, die ebenfalls eine Expression Language benötigte. Jedoch genügte die, in der JSP 2.0-Spezifikation definierte, Expression Language nicht allen für die Entwicklung mit JSF nötigen Anforderungen. Die offensichtlichsten Einschränkungen lagen darin, dass deren Ausdrücke unmittelbar ausgewertet wurden und dass JSF-Komponenten keine Methoden auf server-seitigen Objekte aufrufen konnten. Deshalb wurde eine mächtige Sprache mit den folgenden neuen Eigenschaften geschaffen:
* Verzögerte Ausdrücke, die nicht unmittelbar ausgewertet wurden
* Ausdrücke die Daten sowohl lesen, als auch schreiben können
* Methodenausdrücke, die Methoden aufrufen können
Die neue Expression Language funktionierte gut für JSF-Belange. Jedoch führte das Integrieren der JSP-EL mit der JSF-EL zu Konflikten. Aufgrund dieser Inkompatibilitäten wurde die Initiative für die Unified Expression Language gestartet um diese Expression Languages zu vereinheitlichen. Mit der Spezifikation JSP 2.1 wurden die Ausdrucksprachen von JSP 2.0 und JSF 1.1 in eine einzige vereinheitlichte Expression Language (EL 2.1) zusammengeführt.
Version 3.0 der Expression Language (das vereinheitlicht wurde nicht länger als nötig erachtet) wurde in JSR-341 unabhängig von den JSP- und JSF-Spezifikationen entwickelt. Einige neue Funktionen wurden hinzugefügt, vor allem die EL-Äquivalente zu Streams and Lambda-Ausrücken aus Java 8.

## Besonderheiten

Die neue vereinheitlichte EL ist eine Verbindung der JSP- und der JSF Expression Languages. Zusätzlich zu den in JSP EL bereits vorhandenen Bestandteilen unterstützt die Unified EL folgende Funktionen:
* Verzögerte Auswertung
* Unterstützung für Ausdrücke, die Werte setzen können und Ausdrücke, die Methoden aufrufen können
* Eine austauschbare API zum Auflösen von Ausdrücken

## Beispiele

Ein einfaches Beispiel der Unified EL wie sie innerhalb eines JSTL "c:out"-Befehls verwendet wird:
Ein Ausdruck, der eine Methode mit einem Parameter aufruft:

## Implementierungen

* Java Expression Language (JEXL) ist eine Bibliothek mit dem Zweck die Implementierung von dynamischen und Skript-Funktionen für in Java geschriebene Anwendungen und Frameworks zu erleichtern. Letzte Veröffentlichung: Version 3.1, 14. April 2017.
* JUEL ist eine quelloffene Implementierung der Unified Expression Language (EL), spezifiziert als Teil des JSP 2.1-Standards (JSR-245). Es wird als stabil und funktionsvollständig betrachtet und steht unter der Apache License 2.0. JUEL ist ebenfalls für die Verwendung in Nicht-JSP-Anwendungen geeignet. Letzte Veröffentlichung: Version 2.2.7, 6. Februar 2014.
* Apache Commons EL ist der JSP 2.0 EL-Interpreter von Apache. Letzte Veröffentlichung: Version 1.0, 20. Juni 2003. Die Verknüpfungen zum Herunterladen des Quelltextes und der Binärdateien sind defekt.