2 UML-based Web Engineering - UWE - Ludwig-Maximilians ...
2 UML-based Web Engineering - UWE - Ludwig-Maximilians ...
2 UML-based Web Engineering - UWE - Ludwig-Maximilians ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
typspezifische Dateneingabe zuständig ist 74 . Sie bestimmt in Abhängigkeit des Typs des<br />
Publikationsobjekts, das dem Formular zugrunde liegt (@publication) , das erforderliche<br />
Partial und lässt es über eine render-Anweisung in das Haupt-Template einbinden. Hier<br />
wird ersichtlich, wie ein Template auf Daten zugreifen kann, die im Controller definiert<br />
wurden: In der Controller-Action, die das Template als Request-Antwort bestimmt hat, wurde<br />
die Instanzvariable @publication mit einem Publikations-Objekt gesetzt – entweder mit<br />
einer aus der Datenbank gelesenen Publikation, die über das Formular editiert werden soll,<br />
oder einem neuen, noch leeren Objekt (wenn dem PVS über das Formular eine neue<br />
Publikation hinzugefügt werden soll). Auf diese Instanzvariable kann das Template nun<br />
zugreifen und in unserem Falle den Publikationstyp extrahieren, für den passende<br />
Eingabefelder bereitgestellt werden sollen.<br />
7.3.4 Umsetzung der RIA-Modellierung<br />
Die RIA-Modellierung für das PVS umfasste einerseits die Beschreibung zahlreicher RIA-<br />
Features durch Zustandsmaschinen («concreteRIAFeature»s), andererseits die<br />
Markierung von Prozesslinks als asynchronous, um asynchrone HTTP-Requests zur<br />
Durchführung von serverseitigen Prozessen zu modellieren. Dieses Kapitel ist der<br />
Realisierung beider Aspekte der RIA-Modellierung gewidmet. Zuvor jedoch zwei allgemeine<br />
Bemerkungen zur Vorgehensweise bei der Implementierung der RIA-Features: Erstens wurde<br />
JavaScript-Code, so weit es möglich war, in JavaScript-Dateien ausgelagert, um die<br />
Templates 'sauber' zu halten. Diese js-Dateien werden je nach Bedarf in diejenigen Templates<br />
eingebunden, in die eines oder mehrere in der Datei definierten RIA-Features integriert<br />
werden sollen. Zweitens wurde ein relativ hoher Grad an Abwärtskompatibilität realisiert, um<br />
das PVS auch für Benutzer verwendbar zu machen, die JavaScript in ihrem Browser<br />
deaktiviert haben und damit auf RIA-Features verzichten müssen (bzw. wollen). Immer dann,<br />
wenn durch ein Feature essentielle Funktionalität zur Verfügung gestellt wird, ohne die<br />
zentrale Anwendungsfälle des PVS nicht durchgeführt werden können, wurde zusätzlich eine<br />
Alternativlösung implementiert, über die die benötigte Funktionalität auch ohne JavaScript in<br />
Anspruch genommen werden kann. Nur um ein einfaches Beispiel zu nennen: Der Login-<br />
Mechanismus des PVS wird primär über einen AJAX-Request realisiert. Für Browser ohne<br />
JavaScript-Unterstützung wird das Absenden des Login-Formulars jedoch 'altmodisch'<br />
synchron durchgeführt.<br />
Die Umsetzung der RIA-Zustandsmaschinen in knapper und allgemeiner Form zu<br />
beschreiben, fällt nicht ganz leicht, da jedes RIA-Pattern Charakteristika besitzt, die sie von<br />
anderen Patterns unterscheidet und bei der Implementierung berücksichtigt werden müssen.<br />
Die Grundstruktur der Implementierung kann jedoch im Wesentlichen anhand des in<br />
Abschnitt 2.3.2 dargelegten, typischen Aufbaus eines RIA-Patterns nachvollzogen werden.<br />
Die Interaktion des Benutzers, durch die ein RIA-Feature ausgelöst wird, wird durch ein<br />
DOM-Event-Objekt erfasst, welches seinerseits einen für dieses Ereignis registrierten<br />
Eventhandler aktiviert. Der Handler ist eine JavaScript-Funktion, welche in der Regel für den<br />
zweiten Bestandteil des allgemeinen RIA-Musters verantwortlich zeichnet, nämlich die als<br />
Reaktion auf die Benutzeraktivität auszuführende Operation. Diese wird häufig, wie z.B. bei<br />
vielen Live Validierungen, vollständig auf Clientseite durchgeführt. Manchmal werden zur<br />
Durchführung der Operation jedoch Daten benötigt, auf die nur der Server Zugriff hat (wie<br />
74 Die Implementierung dieser Methode erfolgte in einem sogenannten Helper-Modul. Komplexere Ruby-<br />
Anweisungen, die in einem Template benötigt werden, werden als Methoden in solche Module ausgelagert,<br />
um den Code eines Templates zu verschlanken und weitestgehend frei von Programmierlogik zu halten. Im<br />
Template selbst erfolgt dann nur noch der Aufruf einer solchen ausgelagerten Methode.<br />
89