Entwurf eines grundlegenden Prototyps

Werbung
Seminararbeit im Studiengang „Scientific Programming“
Kontextgebundene Bausteine
einer Webseite
mit AJAX dynamisch aktualisieren
Lukas Rüttgers
Matr.-Nr.: 876253
Prüfer: Prof. Dr. rer. nat. Volker Sander, FH Aachen
Betreuer: Martin Jansen, Bauer+Kirch GmbH
Agenda
1.
Motivation
2.
Analyse bestehender Implementierungen
3.
Entwurf eines grundlegenden Prototyps
4.
Abhängigkeiten
5.
Caching
6.
Ausgabeformate
7.
Verwendung
8.
Ausblick
Agenda
1.
Motivation
2.
Analyse bestehender Implementierungen
3.
Entwurf eines grundlegenden Prototyps
4.
Abhängigkeiten
5.
Caching
6.
Ausgabeformate
7.
Verwendung
8.
Ausblick
Motivation

Datenvolumen und Ladezeit von Webseiten reduzieren




In vielen Gegenden nur geringe Datenrate verfügbar
Immer mehr Zugriffe über Mobilfunknetze (→ Kosten)
Aber: Größe und Komplexität vieler Webseiten steigt
Ansatz: AJAX (Asynchronous Javascript and XML)


Teilinhalte nachträglich laden
Hauptinhalt schneller verfügbar
Anwendung: „Admon:CMS“

Unterseiten der Webpräsenz



Baumstruktur
URL-Pfad entspricht Pfad durch Baum
Inhalte (Module)



pro Seite: Baumstruktur
global: gerichteter, nicht zirkulärer Graph (verknüpfte Module)
Wurzel des lokalen Modul-Baums („Seitenmodul“) in Seite verknüpft
Probleme / Anforderungen:

URL zeigt immer auf gesamte Seite






Einzelnes Modul ansprechen / auswählen
Ergebnis ohne restliche Seite ausgeben
Abhängigkeiten auf modul-externe Werte
Ergebnisse müssen im Cache gespeichert werden können
Sicherheitsstandards müssen beachtet werden
Abwärtskompatibilität von Admon:CMS soll erhalten bleiben

Auswirkungen der Änderungen möglichst gering halten
Agenda
1.
Motivation
2.
Analyse bestehender Implementierungen
3.
Entwurf eines grundlegenden Prototyps
4.
Abhängigkeiten
5.
Caching
6.
Ausgabeformate
7.
Verwendung
8.
Ausblick
Analyse bestehender Implementierungen

Reload auf anderen Status des Moduls





Modul kann geänderte Parameter verarbeiten
Abhängigkeiten vollständig auflösbar
Ergebnis kann im Cache gespeichert werden
Komplette Seite muss neu geladen werden
Individuelles API-Modul




Einzelner Inhalt via AJAX abrufbar
Ergebnis kann im Cache gespeichert werden
Abhängigkeiten evtl. nicht auflösbar
Doppelter Code
Agenda
1.
Motivation
2.
Analyse bestehender Implementierungen
3.
Entwurf eines grundlegenden Prototyps
4.
Abhängigkeiten
5.
Caching
6.
Ausgabeformate
7.
Verwendung
8.
Ausblick
Entwurf eines grundlegenden Prototyps

Module erhalten eine implizite API



Kombination der Vorteile der bestehenden Lösungsansätze
Wie kann diese API angesprochen werden?
Wie kann das Ergebnis eines Moduls einzeln ausgegeben werden?
Analyse des Rendering-Vorgangs
Seite anhand des URL-Pfads bestimmen
Seitenmodul auslesen
Modulbaum rekursiv rendern (Tiefensuche):
1.
2.
3.
a.
b.
c.
4.
Direkte Kindmodule ermitteln und jeweils neue Rekursion anstoßen
Gerenderte Untermodule in eigenes Rendering-Ergebnis einbeziehen
Ergebnis im Cache speichern und an übergeordneten Prozess hochreichen
Fertige Seite ausgeben
Analyse des Rendering-Vorgangs
Entwurf eines grundlegenden Prototyps

Angabe des zu rendernden Moduls als GET-Parameter


Modul-ID im Javascript bekannt
Gewähltes Modul statt Seitenmodul in rekursiven Prozess geben



Gewähltes Modul wird samt aller Untermodule normal gerendert
Eltern- und Geschwistermodule werden ignoriert
Nur Ergebnis des Moduls (und etwaiger Untermodule) wird ausgegeben
http://www.example.com/beispielseite/2/
Gewöhnlicher Aufruf einer Seite, auf der im Beispiel ein Listenmodul seine zweite Seite
darstellen soll
http://www.example.com/beispielseite/2/?module=5
Direkte Anfrage an die implizite API des Listenmoduls (hier mit ID 5), die zweite Seite der
Liste darzustellen (ohne die anderen Module außenherum zu rendern)
Agenda
1.
Motivation
2.
Analyse bestehender Implementierungen
3.
Entwurf eines grundlegenden Prototyps
4.
Abhängigkeiten
5.
Caching
6.
Ausgabeformate
7.
Verwendung
8.
Ausblick
Abhängigkeiten

Prehandler



Callback, der zu Beginn des Renderings eines Moduls ausgeführt wird
Kann Informationen, die dem Modul exklusiv bekannt sind, an Kinder
weitergeben
Posthandler



Callback, der auf dem Rendering-Ergebnis ausgeführt wird
Nachdem das Ergebnis im Cache gespeichert wurde (→ Änderung nicht im Cache)
Kann für Edge Side Includes verwendet werden
Anpassung des Prototyps

Seitenmodul und gesuchtes Modul in rekursiven Prozess geben


Wird gesuchtes Modul gerendert, zusätzlichen Parameter leeren


Seite wird „normal“ gerendert, gesuchtes Modul als zusätzlicher Parameter
Gesuchtes Modul und Kinder werden ohne zus. Parameter gerendert
Ist gesuchtes Modul gesetzt, das eigentliche Rendering überspringen

Stattdessen nichts oder Ergebnis eines Kindes zurückgeben, sofern vorhanden
→ nur gesuchtes Modul und Kinder werden gerendert, für alle anderen
Module der Seite werden aber u.a. Pre- und Posthandler ausgeführt.
Agenda
1.
Motivation
2.
Analyse bestehender Implementierungen
3.
Entwurf eines grundlegenden Prototyps
4.
Abhängigkeiten
5.
Caching
6.
Ausgabeformate
7.
Verwendung
8.
Ausblick
Caching

URL-Pfad als Cache-Key für gesamte Seite


Neuen GET-Parameter ebenfalls in den Key übernehmen
Einzelne Module unter ID gespeichert

Bei leer gerenderten Modulen Cache-Key mit ID des gesuchten Moduls erweitern
Agenda
1.
Motivation
2.
Analyse bestehender Implementierungen
3.
Entwurf eines grundlegenden Prototyps
4.
Abhängigkeiten
5.
Caching
6.
Ausgabeformate
7.
Verwendung
8.
Ausblick
Ausgabeformate

Rohdaten als JSON



Fertige HTML-Bausteine



Geringes Datenvolumen
Nahtlose Einbettung in bestehende Daten möglich
Komplexere Rendering-Prozesse serverseitig erledigen
Direkte Ersetzung des alten Bausteins möglich
Beliebige weitere Formate

Individuelle Bedürfnisse
Umsetzung

Modul-Parameter (GET)



Im Modulcode entsprechende Ausgabe steuerbar
Bei normalem Seitenaufruf viele leere Parameter → unschöne URL
Channel


Automatisch passendes Template genutzt
Bestehender HTTP-GET-Parameter
Agenda
1.
Motivation
2.
Analyse bestehender Implementierungen
3.
Entwurf eines grundlegenden Prototyps
4.
Abhängigkeiten
5.
Caching
6.
Ausgabeformate
7.
Verwendung
8.
Ausblick
Verwendung

Erzeuge URL zu aktueller Seite mit Modul-ID und Channel



Anfrage im Javascript abschicken


z.B. mit jQuery.ajax() oder den spezialisierten post() und get()
Antwort im Javascript verarbeiten


z.B. mit Smarty-Plugin admon_generate_link
Zusätzlich benötigte Modul-Parameter sind im Modul selbst bekannt
z.B. mit jQuery alten HTML-Baustein selektieren und durch neuen ersetzen
Webcrawler und Nutzer ohne JS berücksichtigen


Parallele Implementierung mit vollständigem Neuladen individuell je Modul
Javascript-Variante deaktiviert Parallel-Implementierung
Agenda
1.
Motivation
2.
Analyse bestehender Implementierungen
3.
Entwurf eines grundlegenden Prototyps
4.
Abhängigkeiten
5.
Caching
6.
Ausgabeformate
7.
Verwendung
8.
Ausblick
Ausblick


Feature in erarbeiteter Form bereits verwendbar
Problem: HTTP-Requests für Nutzer sichtbar


Manipulation möglich
Für sensible Daten nur bedingt nutzbar
→ Vereinigung von Geschwindigkeit und Sicherheit für Bachelorarbeit
geplant
Verwendete Literatur

[Jes05] Jesse James Garrett, A New Approach to Web Applications,
http://adaptivepath.org/ideas/ajax-new-approach-web-applications/,
2005 (besucht 13.12.2015)

[jqua] (jQuery-Dokumentation) jQuery.ajax(),
http://api.jquery.com/jquery.ajax/,

(besucht 13.12.2015)
[jqub] (jQuery-Dokumentation) jQuery.get(),
http://api.jquery.com/jquery.get/, (besucht

13.12.2015)
[jquc] (jQuery-Dokumentation) jQuery.post(),
http://api.jquery.com/jquery.post/,
(besucht 13.12.2015)
Fragen?
Vielen Dank für die
Aufmerksamkeit!
Herunterladen