Aufgabenstellung AJAX Client Name 1 AnPr Klasse Datum Aufgabenstellung Es soll eine Applikation erstellt werden, welche eine einfache Tabelle mit Name/Value Paaren in einer Webseite anzeigt. Weiterhin soll die Webseite das Löschen einzelner Datensätze ermöglichen und zusätzlich die Option bieten, neue Datensätze anzuhängen. Ein „Refresh“ Button soll die gesamte Tabelle neu laden, um eventuelle Datenänderungen, welche nicht durch die Webseite gemacht wurde, anzuzeigen: Alle folgenden Angaben sind Vorschläge zur Umsetzung. Wenn sie die Funktionalität anders umsetzen ist dies absolut in Ordnung. Die Vorschläge sollen den ungeübteren Programmieren dazu dienen, sich in der Aufgabenstellung erst mal zurecht zu finden. 2 Datenbankstruktur Für diese Aufgabe soll eine eigene Datenbank namens „AJAX“ erstellt werden. In dieser Datenbank befindet sich lediglich die Tabelle für die Name/Value Paare. Folgende Struktur soll die Tabelle haben: Tabellenname: MyAjaxTab 1. Spalte: ID (Primärschlüssel, mit Autoincrement Funktion) 2. Spalte: Name (VARCHAR(20)) 3. Spalte: Value (VARCHAR(20) 3 Servlet Das Servlet soll die asynchronen Anfragen verarbeiten. Hierbei erhält es vom Client über POST drei Parameter: Parameter: myName myValue myCommand Beschreibung: Wenn ein neuer Datensatz vom Client gesendet wird, beinhaltet dieser Parameter den Datenwert für die Tabellenspalte „Name“. Wenn ein neuer Datensatz vom Client gesendet wird, beinhaltet dieser Parameter den Datenwert für die Tabellenspalte „Value“. Für den Fall, dass ein Datensatz gelöscht wird, beinhaltet dieser Parameter den Datenwert für die ID des Datensatzes, der gelöscht werden soll. Hier werden die Befehle als einstellige Kürzel an den Server gesendet. Folgende Kürzel sollen existieren;: n: Ein neuer Datensatz wird gesendet. Hierbei sind die beiden Parameter myName und myValue mit den Daten belegt. d: Ein Datensatz wird gelöscht. Hierbei findet sich im Parameter myValue die ID des zu löschenden Datensatzes. l: Die gesamte Tabelle wird aus der Datenbank gelesen und an den Client geschickt. Abhängig von den Parametern wird die entsprechende Serveraktion durchgeführt. Die einzelnen Funktionalitäten werden in eigenen Methoden durchgeführt. Folgende Servletmethoden sollen umgesetzt werden: Methode: deleteTableData Beschreibung: Die Methode erwartet als Parameter die ID für den Datensatz, der in der Tabelle gelöscht werden soll. Der Rückgabewert ist entweder 0 für „kein Fehler aufgetreten“, oder 2 für „Exception aufgetreten“. Weiterhin wird die DB-Connection benötigt. Der Rückgabewert ist ein JSON String, welches lediglich den Status (Erfolg/Fehler) und ANPR_TSK_AJAX_v02.docx Seite 1 Aufgabenstellung AJAX Client AnPr Methode: Beschreibung: das auslösende Kommando angibt. insertTableRowData Für das Einfügen eines neuen Datensatzes wird diese Methode benötigt. Sie erwartet den Datenwert für die Spalte „Name“ und den Datenwert für die Spalte „Value“. Die ID wird von der Datenbank vergeben. Weiterhin wird die DB-Connection benötigt. Der Rückgabewert ist ein JSON String, welches neben dem Status (Erfolg/Fehler), dem auslösenden Kommando noch zusätzlich die erzeugte ID und die beiden Eingangsdaten enthält. getTableData Diese Methode liest die komplette Tabelle aus und speichert sie in einem JSON String. Dieser enthält neben den Tabellendaten (zweidimensionales Array mit ID, Name, Value) auch den Status (Erfolg/Fehler) und das auslösende Kommando. handleXhttpRequest Diese Methode wird von doPost aufgerufen und erhält die drei Parameter, welche vom myXmlHttp Objekt gesendet wurden (command, name, value). Hier wird entschieden, welche weiteren Verarbeitungsschritte durchgeführt werden. Der Rückgabewert ist der JSON String, welcher von der doPost Methode an den Browser zurückgeschickt wird. buildJSON Da alle Rückmeldungen über JSON geschickt werden, bietet sich eine eigene Methode zur Erzeugung des JSON Strings an. Die Methode erwartet einen replyCode (Erfolg/Fehler), das auslösende Kommando und eine ArrayList, welche entweder null ist (für Fehlermeldungen bzw. Rückmeldung nach dem Löschvorgang) oder eine Liste von String Arrays mit Daten enthält (ID, Name, Value). 4 HTML Seite Die HTML Seite beinhaltet drei verschiedene Kontrollelemente. Zuerst die beiden Buttons „Refresh“ und „Neu: Button „Refresh“: Bei einem Klick hierauf wird eine eventuell vorhandene HTML Tabelle gelöscht und neu beim Server angefragt. Sobald die Daten vorhanden sind, wird die HTML Tabelle neu angelegt. Button „Neu“: Zuerst wird der User per Popup („prompt“) nach dem Namen und anschließend nach dem Wert gefragt. Sobald die beiden Informationen eingegeben wurden, schickt der Client die Informationen an den Server, wo sie abgespeichert werden. Danach schickt der Server die Daten plus der generierten ID wieder zum Client, wo sie an die HTML Tabelle angefügt werden. Neben den beiden Buttons gibt es noch pro Zeile einen Link, der beim Anklicken dazu führt, dass die entsprechende Zeile sowohl auf der Datenbank, als auch in der HTML Tabelle gelöscht werden. Letzteres passiert jedoch erst, wenn der Server einen erfolgreichen Löschvorgang meldet. (Hinweis: aus einem Link heraus kann ein Javascript gestartet werden durch href="javascript:myJsFunction('myParameter');") Wichtig ist noch, dass beim neuen Laden der Seite die Tabelle automatisch aufgebaut wird (Hinweis: dies macht man am besten, indem man im Body-Tag das Attribut „onload“ mit einer Javascript Funktion belegt, welche die Tabelle genauso aufbaut wie der Refresh Button, oder alternativ window.onload = function() {}; aufruft, wobei innerhalb der geschweiften Klammern unser Code steht). 5 Javascript Methoden Der Javascript Teil ist wohl mit der Umfangreichste. Folgende Funktionen werden benötigt: Funktion: getXMLObject doSendAjaxRequest Seite 2 Beschreibung: Erzeugung des XMLHttp Objektes entsprechend des AJAX Infoblattes. Die Methode sendet einen Ajax POST Request, wobei die drei im Servlet Kapitels bereits erwähnten Parameter übermittelt werden: command: n, d oder l name: leer, oder bei neuen Daten der eingegebene „name“ Wert AnPr Aufgabenstellung AJAX Client Funktion: Beschreibung: value: leer, bei neuen Daten der eingegebene „value“ Wert oder beim Löschvorgang die ID des zu löschenden Datensatzes. handleMyServerResponse Hier wird die Serverantwort übernommen und interpretiert. Dabei wird aus dem gesendeten String ein JSON Objekt erzeugt. Je nach Befehl werden die notwendigen Aktionen in der HTML Seite ausgeführt (bspw. Anzeige der Tabelle). buildTable Basierend auf den Responsedaten wird die HTML Tabelle aufgebaut. buildDataRow Fügt an die Tabelle eine neue Datenzeile ein. Hierbei werden die Werte für den Namen, für den Wert und für die ID benötigt. Damit die Zeile angehängt werden kann, benötigt die Funktion noch die Referenz auf das <tbody> Element. removeAllChilds Zum Löschen von Elementen (siehe AJAX Infoblatt) deleteMyTree Zum Löschen von Elementen (siehe AJAX Infoblatt) deleteRow Triggert den Löschvorgang einer Zeile an, indem an die „doSendAjaxRequest“ Methode die ID des zu löschenden Datensatzes übermittelt wird. doCommand Zentrale Methode, welche von den HTML Buttons bzw. Links aufgerufen wird. Sie erwartet das Kommando (n, d oder l) und einen Wert, für den Fall dass eine Zeile gelöscht werden soll. loadTableData Triggert den Lesevorgang der kompletten Tabelle an. insertNewData Triggert die Eingabe und das Versenden eines neuen Datensatzes an. Das JSON Objekt sollte wie folgt aufgebaut sein: var myDataTransferObject = { replyCode: 1, command: 'l', tableData: [[1, 'name1', 'value1'], [2, 'name2', 'value2'], [3, 'name3', 'value3']] }; 6 Allgemeine Hinweise In der vorgelegten Form gibt es noch einige Punkte, welche verbesserungsfähig sind. Vor allem die direkte Erzeugung der SELECT und INSERT Befehle sind eine bedeutende Fehlerquelle. Hier kann neben dem Problem der „SQL Injection“ – also dem injizieren von ausführbaren SQL Befehlen in die Daten – auch eine Exception erzeugt werden, indem lediglich ein Anführungszeichen gesendet wird. Hier wird auf jeden Fall empfohlen, „prepared Statements“ zu verwenden. Seite 3 Aufgabenstellung AJAX Client 7 AnPr Lizenz Diese(s) Werk bzw. Inhalt von Maik Aicher (www.codeconcert.de) steht unter einer Creative Commons Namensnennung - Nicht-kommerziell - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz. Seite 4