In JSP-EL sind Funktionsreferenzen in Ausdrücken möglich. Dabei wird das Format <Präfix>:<lokaler Name>(…) verwendet. JSP-EL-basierte Ausdrucksmanager delegieren Auflösung derartiger Funktionsreferenzen an einen Funktions-Mapper. In Java ist der Funktions-Mapper eine Implementierung der javax.servlet.jsp.el.FunctionMapper-Schnittstelle. Die Aufgabe des Funktions-Mappers ist es, das Präfix und den lokalen Namen einer statischen Java-Funktion (einer Instanz von java.lang.reflect.Method) zuzuweisen, die von Expression Manager als Bestandteil der Auswertung von Ausdrücken aufgerufen werden kann.
Im Baustein „Expression Manager“ steht eine Implementierung eines Funktions-Mappers zur Verfügung. Dies ist ein OSGi-Dienst, der als Bestandteil des Expression Manager-Bundles bereitgestellt wird. Diese Implementierung erstellt eine Registrierung für die Funktionen, indem sie in den anderen im selben CRX-Container bereitgestellten Bundles eine Abfrage nach Funktionen durchführt, die von diesen Bundles zur Verwendung in Ausdrücken exportiert werden. Das Präfix und der lokale Name, die für den Funktions-Mapper angegeben werden, müssen danach einer der Funktionen in dieser aggregierten Registrierung zugewiesen werden können. Expression Manager unterstützt zwei Typen von Funktionen für den Export durch Bundles: Remote-Funktionen: Diese Funktionen können Methoden zugewiesen werden, die in durch Beans implementierten Schnittstellen deklariert werden. Host-Bundles exportieren die Beans als OSGi-Dienste und über die Flex-Remoting-Funktionen. Remote-Funktionen können wie folgt aufgerufen werden: über den serverseitigen Expression Manager aufgrund der Bereitstellung im selben CRX-Container
über den clientseitigen Expression Manager, da diese Funktionen über Flex-Remoting bereitgestellt werden
Für Remote-Funktionen werden Präfixe verwendet, die mit dem Schlüsselwort „REMOTE_“ beginnen.
Lokale Funktionen: Diese Funktionen sind lokal und werden nur in der Laufzeit verwendet, in der die Ausdrücke ausgewertet werden. In Java entsprechen diese Funktionen statischen Funktionen, die für Java-Klassen definiert werden. In Flex entsprechen diese Funktionen normalen Methoden, die für ActionScript-Klassen definiert wurden. In der Expression Manager-Implementierung werden symmetrische lokale Funktionen angenommen, für die sowohl in Java als auch in Flex Implementierungen vorhanden sind.
So könnte z. B. eine logische Funktion „str:substring(…)“ vorhanden sein. Die Java-Implementierung dieser Funktion könnte dann eine für die Java-Klasse „com.adobe.exm.java.StringUtils“ definierte „substring“-Methode sein, die Flex-Implementierung eine für die ActionScript-Klasse „com.adobe.exm.flex.StringUtilities“ definierte „substr“-Methode.
Bei jedem Präfix, das nicht mit dem Schlüsselwort „REMOTE_“ beginnt, wird angenommen, dass es zu einer lokalen Funktion gehört. Der Funktions-Mapper in Expression Manager kann beide Funktionstypen verarbeiten. Um sie zu unterscheiden, prüft er, ob das Präfix mit dem Schlüsselwort „REMOTE_“ beginnt oder nicht. Dieser Funktions-Mapper steht nicht als öffentliche Klasse zur Verfügung, die in Spring-Kontexten verwendet werden kann. Er ist ein OSGi-Dienst, der vom Expression Manager-Bundle gehostet wird, und muss mithilfe von BluePrint in benutzerdefinierte Spring-Kontexte der Bundles importiert werden, die die Funktionen nutzen sollen: <bp:reference id="<mapper_id> "
interface="javax.servlet.jsp.el.FunctionMapper"
filter="(exm.function.mapper.id=lc.exm.compositeFunctionMapper)"/>
Der importierte Dienst kann dann in die im benutzerdefinierten Spring-Kontext konfigurierte DefaultEXPEvaluator-Bean injiziert werden, wobei <Mapper-ID> als Referenz verwendet wird.
|
|
|