|
AJAX-Programmierung mit Application Express und der jQuery-Bibliothek
Mit Hilfe von JavaScript und der AJAX-Technologie lässt sich die
Benutzeroberfläche einer Application Express-Anwendung massiv verbessern;
im Internet findet man mittlerweile zahlreiche sehr intuitive Web-Oberflächen,
welche auf dieser Technologie basieren. AJAX macht es möglich, Teile einer
Application Express-Seite zu ändern, ohne die gesamte Seite nochmals
neu laden zu müssen. Sehr gute Hintergrundinformationen zum Thema finden
Sie im deutschsprachigen Wikipedia-Artikel zum Thema AJAX.
Mit Hilfe von JavaScript werden die neuen Daten asynchron (also im Hintergrund)
geladen und mittels DHTML-Technologie in die HTML-Seite eingebaut.
Mittlerweile hat sich die Verwendung der AJAX-Technologie so weit durchgesetzt,
dass Sie als Entwickler nicht mehr den ganzen JavaScript-Code selbst implementieren
müssen - es steht eine Vielzahl von fertigen Bibliotheken zur Verfügung. Eine
davon - die frei verfügbare jQuery-Bibliothek
(www.jquery.com)
wird auch in diesem Tipp verwendet.
In diesem Tipp widmen wir uns einem Problem, vor dem nahezu jeder Application
Express-Entwickler schon mal stand: abhängige Auswahllisten
(cascading select lists).
Dabei haben Sie zwei (oder mehr) Auswahllisten und abhängig von der getätigten
Auswahl in einer werden die anderen (abhängigen) Auswahllisten automatisch
gefiltert - und das mit AJAX, also ohne dass die ganze Anwendungsseite neu geladen werden muss.
Vorbereitungen
Bevor Sie mit der Nutzung der AJAX-Technologie in Ihren Application Express-Anwendungen
beginnen, sind einige Vorbereitungen notwendig.
-
Laden Sie die jQuery-Bibliothek
(www.jquery.com)
herunter und machen Sie diese für Application Express verfügbar:
-
Wenn Sie Application Express mit dem Apache Webserver
nutzen, kopieren Sie
die heruntergeladene Datei jquery-[version].js
in das Verzeichnis, in dem
auch schon die anderen Application-Express-JavaScript-Dateien liegen. Typischerweise
ist dies $APEX_HOME/images/javascript.
-
Wenn Sie das Embedded PL/SQL Gateway
mit OracleXE oder Oracle11g verwenden,
nutzen Sie den FTP-Zugang zum Datenbankrepository und laden Sie die Datei
ins Verzeichnis /images/javascript/ hoch.
-
Natürlich können Sie die Datei auch bei den
Gemeinsamen Komponenten
Ihrer Anwendung als Statische Datei hochladen;
dieser Weg ist allerdings nur zu empfehlen, wenn Sie die anderen Varianten
nicht nutzen können - denn solche Bibliotheken sollten allen Workspaces
global zur Verfügung gestellt werden.
-
JavaScript-Code läuft im Browser. Wenn Ihr JavaScript-Code Fehler enthält,
treten diese demnach im Browser auf. Out-of-the-box sind Web-Browser nur mit
sehr dürftigen Mitteln zur Fehlerdiagnose ausgestattet. Speziell der Microsoft
Internet Explorer gibt sich sehr wortkarg bei auftretenden JavaScript-Fehlern.
Für die Entwicklungsphase ist daher die Arbeit mit dem
Firefox-Browser
sehr zu empfehlen. Das allein reicht jedoch nicht aus: Laden Sie zusätzlich
die Plugings Firebug und die Web Developer Toolbar herunter und installieren
Sie diese in Ihrem Firefox-Browser. In den meisten Fällen sollte mit diesen
Werkzeugen entwickelter Code auch im Microsoft Internet Explorer problemlos laufen. Zur
Sicherheit sollten Sie Ihre Anwendung jedoch nach Abschluß der Entwicklung
ausführlich in beiden Browsern testen.
Binden Sie als nächstes die jQuery-Bibliothek in Ihre Application Express-Anwendung
ein. Wenn Sie auf allen oder auf sehr vielen Seiten AJAX- bzw. JavaScript-Code
planen, können Sie die Einbindung im Seitentemplate im Bereich Header vornehmen, ansonsten
im Seiten-Header der jeweiligen Anwendungsseite. Setzen Sie folgenden HTML-Code ein:
Wenn Sie den JavaScript-Code als Statische Datei
in den Gemeinsamen Komponenten
hochgeladen haben, verwenden Sie anstelle von #IMAGE_PREFIX#
die Platzhalter
#APP_IMAGES# oder
#WORKSPACE_IMAGES#.
Ein erstes einfaches Beispiel
Fügen Sie Ihrer Anwendungsseite eine HTML-Region mit einer Auswahlliste
und einem Textfeld hinzu. Die Auswahlliste P1_EMPNO soll,
basierend auf der Tabelle EMP,
alle dort eingetragenen Mitarbeiter anzeigen. Wird einer der Mitarbeiter
ausgewählt, soll dessen Gehalt im Textfeld P1_SAL
erscheinen und zwar mit Hilfe
der AJAX-Technologie - ohne dass
die Seite neu geladen werden muss.
Abbildung 1: Anwendungsseite mit Auswahlliste und Textfeld
Immer wenn Sie die APEX-Technologie verwenden, benötigen Sie einen
"Server-Prozeß"
und eine "Client-Komponente". Der
Server-Prozeß stellt die gewünschten Daten (hier
das Gehalt des Mitarbeiters) auf Anfrage bereit während die Client-Komponente (JavaScript-Code)
das Ergebnis in die Anwendungsseite einbaut (DHTML).
Der Code dieses Tipps soll "als zusätzliche Anforderung" generisch sein; also
mit beliebigen Tabellen arbeiten können.
Die Tatsache, dass das Textfeld P1_SAL
standardmäßig mit dem Gehalt des in P1_EMPNO ausgewählten
Mitarbeiters belegt werden soll, können Sie mit normalen APEX-Bordmitteln direkt beim
Element hinterlegen. Navigieren Sie zu den Elementeigenschaften
und hinterlegen Sie die entsprechende SQL-Abfrage direkt bei der
Regionsquelle (Abbildung 2).
Abbildung 2: Hinterlegung der SQL-Abfrage direkt als Elementquelle
Achten Sie darauf, dass Sie in der WHERE-Klausel die "V-Syntax"
(v('P1_EMPNO'))
zum Einbinden des Elements P1_EMPNO erwenden.
Wenn Sie die Seite nun neu starten, passiert noch gar nichts. Denn
das Element P1_EMPNO trägt zu
Beginn noch den Inhalt Null - dazu findet
die SQL-Abfrage keine Tabellenzeile und das Element P1_SAL
bleibt demzufolge leer.
1. AJAX-Beispiel: Serverseitige Komponenten erstellen (Anwendungsprozeß)
Als nächstes wird ein Anwendungsprozeß erstellt, der die soeben als
Elementquelle
hinterlegte SQL-Abfrage
aus dem Application Express-Repository ausliest, ausführt und
das Ergebnis zurückgibt. Der Prozeß ist also generisch und kann mit jedem
beliebigen Element verwendet werden. Navigieren Sie also zu den
Gemeinsamen Komponenten,
dort zu den Anwendungsprozessen und erstellen
Sie einen neuen Prozeß namens
getElementDefault. Achten Sie darauf, dass
er Bedarfsgesteuert ausgeführt wird
(Abbildung 3).
Abbildung 3: Neuen bedarfsgesteuerten Anwendungsprozeß erstellen
Hinterlegen Sie folgenden PL/SQL-Code als Prozeßquelle:
Im Code können Sie erkennen, dass der Name des Elements, für welches
der Wert ermittelt werden soll, durch das Anwendungselement
APP_GETDEFAULT_FORITEM
bestimmt wird. Aus der Application-Express-Dictionary-View
APEX_APPLICATION_PAGE_ITEMS
wird die vorhin von Ihnen hinterlegte SQL-Abfrage ausgelesen, mit
EXECUTE IMMEDIATE ausgeführt und das Ergebnis
mit HTP.P zurückgegeben.
Das Anwendungselement APP_GETDEFAULT_FORITEM muss
nun allerdings noch
erstellt werden - tun Sie dies bei den Anwendungelementen
in den Gemeinsamen Komponenten.
1. AJAX-Beispiel: Browserkomponenten erstellen (JavaScript)
Als nächstes geht es daran, die JavaScript-Funktion zu erstellen, welche
den Anwendungsprozeß per AJAX-Technologie aufruft und das Ergebnis mit DHTML in das Textfeld
einträgt. Navigieren Sie zu den Seitenattributen und
hinterlegen Sie folgenden
HTML- und JavaScript-Code im Seiten-Header.
Der Code stellt die JavaScript-Funktion refreshElement()
bereit. Als Parameter
wird der Name des aufzufrischenden Elements und ein Array mit Elementnamen
übergeben. In diesem Array müssen alle Elemente übergeben werden, deren Inhalte
für die Auffrischung nötig sind. In unserem Beispiel wird
P1_SAL aktualisiert und
die ausgewählte EMPNO ( P1_EMPNO) wird dazu
benötigt. Der Aufruf muss dann also
wie folgt lauten:
Interessant sind hier die JavaScript-Funktionen $v,
$s und htmldb_Get. Alle
drei werden von Application Express zur Verfügung gestellt. $v
liefert den Wert des
APEX-Formularelementes zurück, $s setzt denselben (nur im Browser)
und htmldb_Get führt AJAX-Requests
zum Server durch.
Nun muss die Funktion jedesmal aufgerufen werden, wenn sich der in der Auswahlliste
selektierte Wert ändert. Navigieren Sie dazu zu den Eigenschaften des Elements
P1_EMPNO, dort zu den
HTML Form Elementattributen und hinterlegen Sie den folgenden
JavaScript-Event-Handler.
Starten Sie die Seite nun und wählen Sie in der Auswahlliste etwas aus; Sie stellen
fest, dass das Element P1_SAL sich automatisch mit dem
Gehalt (SAL) des ausgewählten Mitarbeiters füllt.
Zweites Beispiel: Abhängige Auswahllisten
Als zweites Beispiel kommen wir nun zum Thema: Nun erfahren Sie, wie Sie zwei (oder mehr)
voneinander abhängige
Auswahllisten mit der AJAX-Technogie realisieren können. Fügen Sie der Anwendungsseite
eine neue Auswahlliste P1_DEPTNO hinzu. Verwenden
Sie select dname, deptno from dept als
Wertelistenabfrage (Abbildung 4).
Abbildung 4: Zwei Auswahllisten, die zweite hängt von der ersten ab
Wenn in der ersten Auswahlliste eine Abteilung ausgewählt wird, soll die
zweite Auswahlliste sich (ohne erneutes Laden der Seite)
auf die Mitarbeiter dieser Abteilung einschränken.
Wiederum nutzen wir das APEX-Repository zum Hinterlegen der Abhängigkeiten
zwischen den Auswahllisten. Navigieren Sie zur Wertelisten-Abfrage der
Auswahlliste P1_EMPNO und ändern
Sie die Quellabfrage wie folgt um:
Abbildung 5: Geänderte SQL-Abfrage für die Werteliste "P1_EMPNO"
Achten Sie (wie im ersten Beispiel) darauf, die "V-Syntax" anstelle der
"Doppelpunkt-Syntax" zu verwenden. Die Oder-Verknüpfung in der WHERE-Klausel
dient dazu, alle Mitarbeiter anzuzeigen, wenn keine Abteilung ausgewählt wurde.
Achten Sie auch darauf, dass (bei allen Ihren Auswahllisten, also auch bei P1_DEPTNO)
die Option Null anzeigen
aktiviert ist und die Felder Null-Anzeigewert
und Null-Rückgabewert mit sinnvollen Werten belegt sind.
Wenn Sie abhängige Auswahllisten per AJAX implementieren, tun Sie sich so wesentlich
leichter.
2. AJAX-Beispiel: Serverseitige Komponenten erstellen (Anwendungsprozeß)
Nun wird der Anwendungsprozeß erstellt: Dieser liest (wie im ersten Beispiel)
die als Wertelisten-Quelle hinterlegte
SQL-Abfrage aus dem Application-Express-Repository aus,
führt sie aus und gibt die Ergebnisse zurück. Der wesentliche Unterschied zum
ersten Beispiel ist, dass hier nicht ein
skalarer Wert, sondern eine Werteliste
zurückgegeben wird.
Navigieren Sie also zu den Gemeinsamen Komponenten,
dort zu den Anwendungsprozessen und erstellen
Sie einen neuen Prozeß namens
getLOV.
Hinterlegen Sie folgenden PL/SQL-Code als Prozeßquelle
(Achten Sie darauf, dass er Bedarfsgesteuert ausgeführt wird).
Der Prozeß arbeitet nach dem gleichen Prinzip wie der im ersten Beispiel; nur dass diesmal anstelle
eines einzigen Wertes die ganze Werteliste abgerufen wird. Außerdem kann die Wertelistenabfrage
nicht nur direkt beim Formularelement, sondern auch als
Benannte Werteliste hinterlegt werden.
Diese Fälle muss der PL/SQL-Code berücksichtigen, daher ist er ein wenig umfangreicher.
Seine Ergebnisse gibt die Werte als HTML-Code so zurück, dass dieser anschließend direkt per DHTML
in die Anwendungsseite eingebaut werden kann.
2. AJAX-Beispiel: Browserkomponenten erstellen (JavaScript)
Anschließend wird die JavaScript-Funktion erstellt. Navigieren Sie zum
Seiten-Header und
hinterlegen Sie zusätzlich zum schon vorhandenen den
folgenden HTML- und JavaScript-Code. Hier wird die eingangs erwähnte
OpenSource-Bibliothek jQuery verwendet.
Die Funktion wird genauso benutzt wie die im ersten Beispiel. Nun muss sie nur noch
jedesmal aufgerufen werden, wenn
sich der in der Auswahlliste P1_DEPTNO selektierte Wert ändert.
Navigieren Sie dazu zu den Eigenschaften des Elements
P1_DEPTNO, dort zu den
HTML Form Elementattributen und hinterlegen Sie den folgenden
JavaScript-Event-Handler.
Achten Sie darauf, dass die Funktion aus dem ersten Beispiel hier ebenfalls aufgerufen wird,
denn wenn sich Auswahlliste P1_EMPNO nun automatisch
gefiltert wird, wird deren Auswahl auf "Bitte wählen"
zurückgesetzt. Demnach
muss auch das Textfeld P1_SAL geleert werden,
damit die Oberfläche wieder konsistent ist.
Nun haben Sie einmalig PL/SQL- und JavaScript-Code hinterlegt, mit dem Sie
beliebige Auswahllisten als AJAX Cascading Select Lists
in Ihre Anwendung
einbauen können. Es können auch mehr als zwei Auswahllisten miteinander
verknüpft werden - Gehen Sie dazu wie folgt vor.
- Erzeugen Sie die Werteliste mit der
entsprechenden SQL-Abfrage. Achten Sie dabei
auf die Einstellungen zu den Null-Werten. Wichtig ist, dass der Datentyp des
NULL-Rückgabewertes dem des Rückgabewerts der LOV-Abfrage
entspricht. Nehmen Sie also
einen numerischen Wert, wenn Ihre LOV numerische Werte zurückliefert. Verwenden
Sie außerdem in der Wertelistenabfrage stets die V-Syntax für Elemente.
- Fügen Sie den onChange-Header, mit dem
Sie die nachgeordneten Auswahllisten
aktualisieren, hinzu. Er wird immer bei der "auslösenden" Auswahlliste eingetragen.
Für jede nachgeordnete Auswahlliste benötigen Sie im
onChange-Handler
einen JavaScript-Aufruf.
3. Die jQuery-Bibliothek nutzen: Der jQuery "DatePicker"
Als letztes Beispiel sei ein Feature der jQuery-Bibliothek vorgestellt: der
jQuery DatePicker.
Die Datumsauswahl von Application Express hat den Nachteil, dass dazu
ein eigenes (wenn auch kleines)
Browserfenster geöffnet wird; dieser Ablauf wirkt für den Endbenutzer ein wenig träge. Eine
Lösung wäre das DatePicker-Widget der jQuery-UI-Bibliothek.
Zusätzlich zur zu Beginn bereits angesprochenen jQuery-Bibliothek benötigen Sie
dazu die Erweiterung jQuery UI. Laden Sie diese von
ui.jquery.com herunter und machen Sie die
JavaScript-Dateien, wie eingangs beschrieben, für Application Express verfügbar. Da
der Download ein ZIP-Archiv mit vielen Dateien ist, empfiehlt sich das Hochladen
in den Workspace als statische Datei hier nicht. Besser ist es, das Archiv
ins Verzeichnis $APEX_HOME/images/javascript
(bei Verwendung des Apache mit mod_plsql)
oder (bei Verwendung des PL/SQL Embedded Gateway)
ins Verzeichnis /images/javascript
des Datenbank-Repositorys auszupacken. Achten Sie beim nachfolgenden HTML-Code
darauf, die Pfade ggfs. an Ihre Umgebung anzupassen.
Binden Sie nun die jQuery-UI-Bibliothek in Ihre Application Express-Seite
ein. Hinterlegen Sie dazu entweder im Seitentemplate oder
im Seiten-Header
folgende HTML-Anweisungen:
Binden Sie zusätzlich das mitgelieferte Stylesheet (CSS) für den Date-Picker ein:
Nun geht es los: Erzeugen Sie ein neues Textfeld namens P1_DATUM,
navigieren Sie
dann zum Seiten-Footer und hinterlegen Sie
(für einen ersten Test) folgenden JavaScript-Code:
Starten Sie die Seite und klicken Sie in das neu erzeugte Textfeld. Es wird sich sofort
ein Datumsauswahlfeld öffnen ...
Abbildung 6: jQuery UI Date Picker in Aktion"
Dieses Feld müsste noch ein wenig konfiguriert werden: Um die deutsche Sprache
zu aktivieren, laden Sie zunächst im Seiten-Header
zusätzlich zu den bereits
vorhandenen jQuery-Bibliotheken die entsprechende Datei.
Die deutsche Sprache wird sofort aktiv. Das folgende Beispiel fügt ein kleines Kalender-Symbol
hinzu und legt den Montag als "ersten Tag der Woche" fest. Ändern Sie den Code im
Seiten-Footer wie folgt:
Abbildung 7: Angepasster jQuery UI Date Picker in Aktion"
Es gibt zahlreiche weitere Elemente und Konfigurationsmöglichkeiten; auf der
jQuery-Webseite finden
Sie eine umfangreiche Dokumentation der gesamten Bibliothek und zahlreiche
Tutorials: So gibt es auch
eine Seite mit den Konfigurationsmöglichkeiten für den Date Picker.
JavaScript-Bibliotheken wie jQuery
und jQuery UI geben Ihnen die Möglichkeit,
Ihre Benutzeroberflächen mit ausgefeilten, intuitiven Elementen auszustatten, ohne
dass Sie in die Feinheiten der JavaScript- und DHTML-Programmierung einsteigen
müssen.
Zurück zur Community-Seite
|