23. März 2015 | 2 min lesezeit

Request Optimierung in JSF Teil 3

Leider werden in JSFs‘ aktueller Implementierung der Ajax-API auf Grund eines Designfehlers oftmals zu viele Daten vom Browser an den Server übermittelt. In diesem Blogeintrag wird ein konkreter Lösungsweg zu Behebung dieses Problems gezeigt.

Im letzten Blog-Post wurde ein Lösungsansatz für die Probleme mit JSF Partial Requests vorgestellt. Dieser wird nun im Detail erläutert.

Um JSFs‘ Implementierung der Formularserialisierung  zu erweitern, mussten folgende Probleme gelöst werden:

  • Überschreiben von JSFs‘ JavaScript-Code
  • Übergabe des execute-Strings an die Erweiterung
  • Filterung unter Berücksichtigung von JSF-Keywords und Pflichtfeldern

Das Überschreiben von Funktionen ist in JavaScript auf Grund der hohen Dynamik der Sprache problemlos umzusetzen. Damit der Code der JSF JavaScript-API nicht direkt verändern werden muss, wurde der jsf.getViewState-Variablen, welche normalerweise die Funktion mit dem Code zur Formularserialisierung enthält, in einer externen JavaScript-Datei eine neue Funktion zugewiesen. Diese neue Funktion enthält den Code zur Erweiterung der API. Die JavaScript-Datei muss nach der von JSF verwendeten JavaScript-Bibliothek im HTML eingebunden werden .

Überschreiben der getViewState-Funtkion in der Datei lilli.js:

Einbinden der Erweiterung:

Die getViewState-Funktion erhält als einzigen Parameter das zu serialisierende Formular. Weiterhin wird sie nicht von außen, sondern nur intern aus einer anderen API-Funktion (jsf.ajax.request()) aufgerufen wird. Es ist also nicht ohne weiteres möglich, die IDs aus dem execute-String direkt an die überschriebene getViewState-Funktion zu übergeben. Daher ist es am einfachsten, auch die jsf.ajax.request-Funktion zu überschreiben. So können die benötigten Parameter temporär zwischengespeichert und dann in der neuen getViewState-Funktion für die Filterung genutzt werden (Listing 1).

Listing 1:

Der Code für die Filterung der Elemente ist hingegen simpel. Eine einfache Überprüfung, ob der Name des aktuell iterierten Formularelements in den execute-Optionen des Ajax-Requests hinterlegt ist, reicht aus. Der entsprechende Code wird als Erweiterung in die jsf.getViewState-Funktion eingefügt (Listing 2). Vor der Filterung der Elemente muss zusätzlich kontrolliert werden, ob in den execute-Optionen eines der Key-Wörter @none (nichts übermitteln), @all oder @form (das gesamte Formular übermitteln), gesetzt wurde. Ist das nicht der Fall, können die Werte entsprechend der Optionen gefiltert werden.

Listing 2:

So gut die beschriebene Lösung auch funktioniert, sie hat ihre Grenzen. Wird in der execute-Option die ID eines (oder mehrerer) Container-Elemente (z.B. die ID einer h:panelGroup) angegeben, müssen alle in diesem Container enthaltenen Formularelemente an der Server übermittelt werden (Listing 4). Die Suche, welche JSF-Elemente mit Wertebindung sich in dem auszuführenden Containerelement befinden, ist aber sehr Aufwendig. Weil außerdem auf dem DOM-Tree gesucht werden müsste, kann vor allem bei älteren Browsern ein spürbarer Geschwindigkeitsnachteil entstehen. Deshalb ist es in diesem Fall für die Performanz des gesamten Requests günstiger, auf JSFs‘ Standardverhalten zurückzugreifen und das gesamte Formular an den Server zu übertragen.

Der gesamte Code zur vorgestellten Lösung befindet sich unter https://github.com/dskgry/lilly.


Keine Kommentare

Kontakt

OPEN KNOWLEDGE GmbH

Standort Oldenburg:
Poststraße 1, 26122 Oldenburg

Standort Essen:
II. Hagen 7, 45127 Essen