Anwendungsentwicklung 1
Anwendungsentwicklung 1
Anwendungsentwicklung 1
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Jörg Krüger<br />
Christian Uhlig<br />
Geschäftsprozessmodellierung WS13/14<br />
<strong>Anwendungsentwicklung</strong> 1
Agenda<br />
Geschäftsprozesse und IT<br />
Betriebliche Informationssysteme<br />
Masken-Oberflächen<br />
Desktop-Anwendungen<br />
Web-Anwendungen<br />
Implementierung von Web-Anwendungen<br />
Allgemeine Problemstellungen und Ansätze<br />
Webanwendungen in Java<br />
GWT<br />
UiBinder<br />
Editoren<br />
Validatoren<br />
Übung Prozessmodellierung WS13/14<br />
Seite 2
Start Event<br />
Kunde = Gast?<br />
nein<br />
Kunde bekannt?<br />
ja<br />
nein<br />
Kundendaten<br />
wiederverwenden<br />
Kundendaten<br />
erfassen<br />
ja<br />
Daten aktuell?<br />
nein<br />
ja<br />
Gast bekannt?<br />
Kundendaten<br />
aktualisieren<br />
ja<br />
nein<br />
Gästedaten<br />
wiederverwenden<br />
Gästedaten erfassen<br />
ja<br />
Gästedaten aktuell?<br />
nein<br />
ja<br />
Weitere Gäste?<br />
Gästedaten<br />
aktualisieren<br />
Beziehungstyp<br />
nein<br />
Kundennr<br />
Personendaten erfasst<br />
1<br />
Adresse_ID Straße PLZ Ort<br />
Person_ID<br />
Name<br />
Vorname<br />
Firma<br />
Person<br />
Generalisierung<br />
Inhalt<br />
1<br />
n<br />
Kunde Teilnehmer Dozent<br />
1<br />
Beziehungstyp<br />
Beziehungstyp<br />
ist fachlich<br />
verantwortlich für<br />
Teilnehmernr<br />
Adresse<br />
1<br />
n<br />
Hotelbuchung<br />
Hotel<br />
Reservierung<br />
Rezeption<br />
n<br />
m<br />
n<br />
1<br />
m<br />
führt aus<br />
Inhalt_ID<br />
Beziehungstyp<br />
Beziehungstyp<br />
n<br />
n<br />
Rechnung_I<br />
D<br />
Teilnahmeerfolg<br />
Beziehungstyp<br />
Beziehungstyp<br />
Dozentennr<br />
E-Mail<br />
m<br />
n<br />
Beziehungstyp<br />
m<br />
1 n<br />
n<br />
1<br />
Rechnung Beziehungstyp<br />
Rechnungsposition Beziehungstyp<br />
Artikel<br />
Schulungsplan<br />
Bezeichnung<br />
1<br />
Rechnungsnu<br />
mmer<br />
n<br />
n<br />
Beziehungstyp<br />
Beziehungstyp<br />
Rechnungsdatum<br />
Schulungsp<br />
lan_ID<br />
Beziehungstyp<br />
1 n<br />
Beziehungstyp<br />
Beziehungstyp<br />
Zeitraum_I<br />
D<br />
n<br />
Beziehungstyp<br />
Buchung_I<br />
D<br />
b-Attribut (ERM)<br />
Quartal Anzahl Preis<br />
Zeitraum<br />
Anfang<br />
Min<br />
Max<br />
Preis<br />
Ende<br />
1<br />
n<br />
n<br />
n<br />
n<br />
1<br />
Schulungstyp<br />
1<br />
n<br />
Schulung<br />
1<br />
n<br />
Buchung<br />
Buchungszeit<br />
punkt<br />
Schulungst<br />
yp_ID<br />
m<br />
Rechnungs<br />
position_ID<br />
Beziehungstyp<br />
Beziehungstyp<br />
Bezeichnung Dauer Honorar<br />
Beziehungstyp<br />
m 1<br />
Status<br />
Buchungsstat<br />
us<br />
Beziehungstyp<br />
Schulung_I<br />
D<br />
Starttag<br />
Endetag<br />
Status<br />
Gebucht Storniert Durchgeführt Abgerechnet<br />
Positionsnr Preis USt<br />
Anzahl<br />
Schulungsstat<br />
us<br />
Generalisierung<br />
Beziehungstyp<br />
Storniert<br />
Abgeschlosse<br />
n<br />
Läuft<br />
Buchung<br />
Planung<br />
Anzahl<br />
n<br />
Ausstattung<br />
n<br />
m<br />
Raum<br />
Artikel_ID<br />
1<br />
Beziehungstyp<br />
Bezeichnung<br />
Ausstattung<br />
_ID<br />
Bezeichnung<br />
Raum_ID<br />
Bezeichnung<br />
Etage<br />
Platzzahl<br />
Tagesmiete<br />
ist Vorgänger von ist Vorgänger von<br />
ist Vorgänger von ist Vorgänger von ist Vorgänger von<br />
Einchecken<br />
Leistungserstellung Rechnungslegung<br />
Auschecken Abrechnung<br />
ist fachlich<br />
verantwortlich für<br />
führt aus<br />
führt aus<br />
Service<br />
Zimmer<br />
ist fachlich<br />
verantwortlich für<br />
Gültig von<br />
ist fachlich<br />
verantwortlich für<br />
Beziehungstyp<br />
Gültig bis<br />
Rechnungswesen<br />
n<br />
führt aus<br />
Preis_ID<br />
Preis<br />
Betrag<br />
USt-Satz<br />
ist fachlich<br />
verantwortlich für<br />
führt aus<br />
ist fachlich<br />
verantwortlich für<br />
führt aus<br />
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
Geschäftsprozesse und IT (1)<br />
Ein wichtiger Fokus des Geschäftsprozessmanagement ist die Unterstützung<br />
von Prozessen durch Informationssysteme<br />
Unternehmensrealität<br />
Ist-<br />
Prozesse<br />
Soll-<br />
Prozesse<br />
Prozesscontrolling<br />
(z.B. Überwachung von operativen<br />
Kennzahlen wie Durchlaufzeiten)<br />
Prozessmodelle<br />
zur Beschreibung von<br />
Soll- und Ist-Prozessen<br />
(umfassend Ablauflogik,<br />
Daten,<br />
Organisationseinheiten,<br />
Anwendungssysteme,<br />
…)<br />
Prozessdefinition<br />
Prozessanalyse<br />
(z.B. Simulation zur Bestimmung<br />
notwendiger Ressourcen)<br />
…<br />
Standard/Branchensoftware<br />
betriebliche<br />
Individualsoftware<br />
Workflow Management<br />
(ausgehend von Prozess- bzw.<br />
Workflow-Modellen Unterstützung<br />
oder Automatisierung von Abläufen)<br />
Übung Prozessmodellierung WS13/14<br />
Seite 3
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
Geschäftsprozesse und IT (2)<br />
Vielgestaltige IT-Unterstützung von Geschäftsprozessen<br />
Standardsoftware (z.B. Office)<br />
Branchensoftware (z.B. Hotelbuchungssoftware)<br />
Individualsoftware<br />
Unterschiedliche Unterstützungstiefe<br />
Unterstützung einzelner Prozessschritte (z.B. Erstellen eines Anschreibens in Word)<br />
Gezielte Unterstützung einer Folge von Prozessschritten durch ein spezialisiertes<br />
Informationssystem (z.B. Anlegen einer Buchung im Hotel), allerdings nach wie vor<br />
menschlicher Sachbearbeiter<br />
Steuerung von Prozessabläufen z.B. durch ein Workflow-Management-System<br />
Automatisierte Ausführung von Teilen eines Prozesses oder von einem gesamten<br />
Prozess (z.B. durch eine entsprechende Individualsoftware oder ein Workflow-<br />
Management-System/ein Prozessmanagement-Werkzeug auf Basis von Web<br />
Services)<br />
Übung Prozessmodellierung WS13/14<br />
Seite 4
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
Geschäftsprozesse und IT (3)<br />
Fokus für uns: Individualsoftware zur Unterstützung von Geschäftsprozessen<br />
Nach wie vor Ausrichtung auf menschlichen Sachbearbeiter, allerdings kann<br />
die Software naturgemäß einige Prozessteile eigenständig ausführen<br />
Prozessmodelle liefern Informationen zur Spezifikation und Implementierung<br />
der Software. Darüber hinaus können in einem integrierten System wie ARIS<br />
Modelle aus dem Software-Engineering hinzugefügt und verknüpft werden.<br />
Extremfall: Automatische Ableitung von ausführbarer (oder fast ausführbarer)<br />
Individualsoftware aus Modellen (model driven architecture)<br />
In unserem Fall sehen wir für die Ableitung der Software einen Prozess vor:<br />
Modellierung der Geschäftsprozesse (Fachkonzept 2)<br />
Entwicklung des Datenmodells zum Fachkonzept<br />
Modellierung von Masken und Funktionen, die Prozessschritte unterstützen<br />
Ergebnis: Requirement Definition<br />
Vorgehensmodell zur Ableitung der Implementierung aus der Requirement Definition<br />
Übung Prozessmodellierung WS13/14<br />
Seite 5
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
Betriebliche Anwendungssysteme (1)<br />
Typische Anforderungen und Eigenschaften von betrieblichen<br />
Anwendungssystemen<br />
Client/Server-Anwendung für den Mehr-Benutzer-Betrieb<br />
Gemeinsame (d.h. serverbasierte) persistente Datenhaltung mit Archivierung<br />
Orientierung an der Verwaltung von Geschäftsobjekten (d.h. Anlegen, Ändern,<br />
Suchen, usw.) und ihren Beziehungen<br />
Nutzung von Masken zur Pflege von Geschäftsobjekten<br />
Benutzerabhängige Zugriffs- und Funktionsrechte mit Nachverfolgbarkeit<br />
…<br />
Übung Prozessmodellierung WS13/14<br />
Seite 6
Daten<br />
Layout<br />
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
Betriebliche Anwendungssysteme (2)<br />
Typische Elemente von Maskenoberflächen<br />
Ausrichtung einer Maske auf einen bestimmten<br />
Objekttyp (hier Kunde) oder eine bestimmte<br />
Funktion (z.B. "Abrechnungen erstellen")<br />
Darstellung der verfügbaren Objektinstanzen<br />
(hier per Kundenliste), gegebenenfalls mit<br />
Filterung / Suchfunktion<br />
K u n d e n l i s t e<br />
K u n d e n v e r w a l t u n g<br />
V o r n a m e<br />
N a c h n a m e<br />
K u n d e n b e r a t e r (C o m b o b o x)<br />
Darstellung der elementaren Objekteigenschaften<br />
mit entsprechenden UI-Elementen (Textfelder,<br />
Comboboxen, …)<br />
N e u e r<br />
K u n d e<br />
K u n d e<br />
s p e i c h e r n<br />
Darstellung von Unterobjekten (bei Aggregaten,<br />
z.B. Positionen einer Rechnung) und<br />
verknüpften Objekten (hier Aufträge des<br />
Kunden) per Listen<br />
A u f t r ä g e<br />
Funktionen (hier über Buttons) zum Anlegen,<br />
Löschen und Ändern eines Objektes<br />
N e u e r<br />
A u f t r a g<br />
A u f t r a g<br />
b e a r b e i t e n<br />
A u f t r a g<br />
l ö s c h e n<br />
Übung Prozessmodellierung WS13/14<br />
Seite 7
Daten<br />
Layout<br />
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
Betriebliche Anwendungssysteme (3)<br />
Typische Elemente von Maskenoberflächen<br />
Funktionen (hier über Buttons) zum Anlegen,<br />
Löschen und Ändern von verbundenen<br />
Objekten; hier z.B. Wechsel in die Maske<br />
zu einem Auftrag per Klick auf "Auftrag<br />
bearbeiten"<br />
Durchsetzen von Geschäftsregeln<br />
(z.B. Validierung von Feldeingaben,<br />
Einschränkung von Eingabemöglichkeiten<br />
z.B. per Comboboxen usw.)<br />
K u n d e n l i s t e<br />
K u n d e n v e r w a l t u n g<br />
V o r n a m e<br />
N a c h n a m e<br />
K u n d e n b e r a t e r (C o m b o b o x)<br />
N e u e r<br />
K u n d e<br />
K u n d e s p e i c h e r n<br />
A u f t r ä g e<br />
N e u e r<br />
A u f t r a g<br />
A u f t r a g<br />
b e a r b e i t e n<br />
A u f t r a g<br />
l ö s c h e n<br />
Übung Prozessmodellierung WS13/14<br />
Seite 8
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
Betriebliche Anwendungssysteme (4)<br />
Umsetzung per klassischer Desktop-Anwendung (1)<br />
Jeweils eine Maske oder eine zusammenhängende Anordnung von Masken wird in<br />
einem Fenster dargestellt, damit auch flexible Navigation (z.B. im Beispiel zum<br />
Anlegen eines Auftrages Öffnen eines weiteren Fensters mit der Auftragsmaske )<br />
Ereignisorientierte Programmierung: Elemente der GUI werden mit Prozeduren<br />
bzw. Methoden verknüpft, die auf bestimmte Ereignisse reagieren; auf Ebene des<br />
Programmcodes besteht damit immer ein unmittelbarer Bezug zu einzelnen<br />
Elementen der Benutzeroberfläche genau einer Benutzersitzung<br />
Direkte Nutzung der Betriebssystem-UI und –Bibliotheken, damit auch leicht<br />
verfügbare komplexe Steuerelemente (z.B. DatePicker, komplexe Tabellen mit<br />
Unter-Steuerelementen usw.)<br />
Kommunikation mit dem Server per Netzwerkstack des Betriebssystems (z.B. RPC-<br />
Aufrufe, eigenes Protokoll, …)<br />
Vergleichsweise leichter Zugang zu spezieller Hardware (z.B. Mikrofon, GPS, usw.)<br />
-> für betriebliche Anwendungen aber nicht sehr typisch<br />
Übung Prozessmodellierung WS13/14<br />
Seite 9
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
Betriebliche Anwendungssysteme (5)<br />
Umsetzung per klassischer Desktop-Anwendung (2)<br />
Übung Prozessmodellierung WS13/14<br />
Seite 10
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
Betriebliche Anwendungssysteme (6)<br />
Umsetzung per Web-Anwendung<br />
Darstellung der Anwendung im Internet-Browser, d.h. die Masken der Anwendung<br />
werden als HTML-Seiten repräsentiert, die per HTTP von einem Server ausgeliefert<br />
werden<br />
Interaktion mit der Oberfläche wird durch dynamische HTML-Seiten erreicht<br />
Häufig Umsetzung der Netzwerkdienste auf Serverseite, d.h. auf Clientseite findet<br />
dann lediglich Browser-HTTP statt<br />
Motive für Web-Anwendungen<br />
Portabilität: Anwendung prinzipiell auf jedem Endgerät mit Internet-Browser<br />
ausführ- bzw. darstellbar, unabhängig vom Betriebssystem und Gerätetyp<br />
Deployment: Keine Installation erforderlich<br />
Deployment: Updates werden auf Serverseite eingespielt und erfordern keinen<br />
Eingriff auf den Clients<br />
Deployment: Integration in Internet-Auftritte / Portale<br />
Design: Vergleichsweise leichte Anpassung der Optik (CSS)<br />
Übung Prozessmodellierung WS13/14<br />
Seite 11
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
Web-Anwendungen (1)<br />
Dynamische Erzeugung von HTML-Seiten (d.h. Masken im HTML-Format)<br />
Daten<br />
Layout<br />
durch den Server<br />
Klassisch: Verwendung von HTML-Formularen, um Auswahl- und<br />
Eingabemöglichkeiten für den Benutzer zu schaffen<br />
Beispielablauf für die Kundenverwaltung<br />
Der Anwender ruft eine Webseite von einer<br />
entsprechenden URL ab, z.B.<br />
http://www.meinewebanwendung.de/kunden<br />
Der Server erzeugt ein HTML-Dokument zur<br />
Kundenmaske; dabei füllt er die textuellen Angaben<br />
und die Formular-Steuerelemente mit Daten aus der<br />
Datenhaltung (hier im ersten Schritt nur die Kundenliste)<br />
Das erzeugte HTML-Dokument wird per HTTP an den<br />
Client ausgeliefert und im Browser dargestellt<br />
K u n d e n l i s t e<br />
K u n d e n v e r w a l t u n g<br />
N e u e r<br />
A u f t r a g<br />
V o r n a m e<br />
N a c h n a m e<br />
K u n d e n b e r a t e r (C o m b o b o x)<br />
N e u e r<br />
K u n d e<br />
A u f t r ä g e<br />
A u f t r a g<br />
b e a r b e i t e n<br />
K u n d e<br />
s p e i c h e r n<br />
A u f t r a g<br />
l ö s c h e n<br />
Übung Prozessmodellierung WS13/14<br />
Seite 12
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen Daten / GWT<br />
Web-Anwendungen (2)<br />
Layout<br />
Beispielablauf für die Kundenverwaltung (Fs.)<br />
Der Anwender wählt ein Element der Kundenliste aus.<br />
Die Auswahl wird per HTTP-GET an den Server<br />
übertragen, d.h. es wird nun z.B. die Seite<br />
http://www.meinewebanwendung.de/kunden?custid=5<br />
abgerufen<br />
Die Anwendung auf dem Server wird erneut aufgerufen<br />
und erhält per CGI den per URL übermittelten Parameter<br />
(custid). Sie erzeugt daraufhin ein neues<br />
HTML-Dokument, in dem nun das Kundenformular mit<br />
den Werten des ausgewählten Kunden ausgefüllt ist.<br />
K u n d e n l i s t e<br />
K u n d e n v e r w a l t u n g<br />
V o r n a m e<br />
N a c h n a m e<br />
K u n d e n b e r a t e r (C o m b o b o x)<br />
N e u e r<br />
K u n d e<br />
K u n d e s p e i c h e r n<br />
A u f t r ä g e<br />
Das erzeugte HTML-Dokument wird per HTTP an den<br />
Client ausgeliefert und im Browser dargestellt<br />
N e u e r<br />
A u f t r a g<br />
A u f t r a g<br />
b e a r b e i t e n<br />
A u f t r a g<br />
l ö s c h e n<br />
Der Anwender ändert Angaben zum Kunden, z.B. den Vornamen. Per Klick auf<br />
"Kunde speichern" wird erneut per HTTP-GET eine Anfrage an den Server der Form<br />
http://www.meinewebanwendung.de/kunden?custid=5&mode=save&name=Hansel&<br />
vorname=Hans<br />
Übung Prozessmodellierung WS13/14<br />
Seite 13
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen Daten / GWT<br />
Web-Anwendungen (3)<br />
Layout<br />
Beispielablauf für die Kundenverwaltung (Fs.)<br />
Die Anwendung erhält die Anfrage per CGI; aus den<br />
Parametern leitet sie ab, dass der Datensatz zum<br />
entsprechenden Kunden zu aktualisieren ist.<br />
Anschließend liefert sie das gleiche HTML-Dokument<br />
erneut aus, nun mit den aktualisierten Angaben und<br />
möglicherweise einen Hinweis auf das erfolgreiche<br />
Speichern<br />
usw.<br />
K u n d e n l i s t e<br />
K u n d e n v e r w a l t u n g<br />
V o r n a m e<br />
N a c h n a m e<br />
K u n d e n b e r a t e r (C o m b o b o x)<br />
N e u e r<br />
K u n d e<br />
K u n d e s p e i c h e r n<br />
A u f t r ä g e<br />
N e u e r<br />
A u f t r a g<br />
A u f t r a g<br />
b e a r b e i t e n<br />
A u f t r a g<br />
l ö s c h e n<br />
Übung Prozessmodellierung WS13/14<br />
Seite 14
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
Web-Anwendungen (4)<br />
Benutzer<br />
Eingaben in Formular<br />
Absenden des Formulars<br />
Browser<br />
HTTP-Request<br />
zu URL mit<br />
Formular-<br />
Parametern<br />
HTTP-Response<br />
Datenhaltung<br />
HTTP-Request /<br />
URL und Parameter<br />
Ändern/<br />
Anlegen/<br />
Löschen<br />
von Objekten<br />
Suchen/Lesen<br />
von Objekten<br />
HTTP-Server<br />
Anwendung<br />
HTTP-Response /<br />
HTML-Dokument<br />
Statische<br />
Dateien<br />
(HTML,<br />
Bilder, CSS,<br />
...)<br />
Weitere<br />
Dienste (z.B.<br />
SMS-<br />
Gateway, E-<br />
Mail, usw.)<br />
Übung Prozessmodellierung WS13/14<br />
Seite 15
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
Web-Anwendungen (5)<br />
Also…<br />
Interaktionen mit der Benutzeroberfläche werden umgesetzt in ein entsprechendes<br />
HTTP-Request, dass die vom Anwender vorgenommenen Eingaben und die<br />
gewünschte Operation (z.B. Speichern) als Parameter enthält.<br />
Verwendung von HTTP-GET bzw. -POST zur Übermittlung der Parameter<br />
Aufruf einer Anwendungssoftware auf dem Server mit der gewünschten URL des<br />
Requests; die darüber hinaus übermittelten Parameter werden per CGI übergeben<br />
Die Anwendung auf dem Server erzeugt ein HTML-Dokument, das den neuen<br />
Zustand der Benutzeroberfläche nach Ausführung der Operation repräsentiert.<br />
Dieses Dokument wird ausgeliefert und dargestellt.<br />
Übung Prozessmodellierung WS13/14<br />
Seite 16
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
Web-Anwendungen (6)<br />
Herausforderungen<br />
Request-Response-Paradigma von HTTP, HTML eher auf Informationsaufbereitung<br />
denn auf Dateneingabe und Interaktion ausgerichtet<br />
Die Oberfläche wird als HTML-Dokument repräsentiert, das als ganzes ausgetauscht<br />
wird; für jede Änderung der Oberfläche, die vom Server durchgeführt wird, muss also<br />
das gesamte Dokument und damit die gesamte Oberfläche ausgetauscht werden<br />
HTTP ist als Protokoll zustandslos, d.h. jedes Request ist unabhängig von den<br />
übrigen. In der Folge können keine Informationen auf eine Benutzersitzung bezogen<br />
werden und der Zustand der Oberfläche muss mit jedem Request explizit oder<br />
implizit mitgeliefert werden.<br />
Ereignisorientierte Programmierung der Anwendung damit nicht ohne Umwege<br />
möglich: Anders als bei der Desktop-Anwendung erhält eine Web-Anwendung keine<br />
Ereignisse von eines einzelnen Benutzers, sondern einzelne Requests vieler Nutzer.<br />
Ereignisse eingeschränkt auf Submits (Übertragung von Forms auf Knopfdruck)<br />
Keine server-side Änderungen der Oberfläche – wenn der Benutzer nichts macht,<br />
ändert sich auch die Oberfläche nicht<br />
Übung Prozessmodellierung WS13/14<br />
Seite 17
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
Web-Anwendungen (7)<br />
User Experience schlechter als bei Desktop-Anwendungen, viele bekannte<br />
Konzepte (z.B. Fenster) nicht anwendbar<br />
Form-Submit -> auf Serverantwort warten -> komplette Seite neu rendern<br />
Anwendung fühlt sich daher eher nach Seitenblättern denn nach Interaktion an<br />
Steuerelemente primitiv<br />
Keine Effekte wie z.B. Überblendungen (außer eigenmächtig durch den Browser)<br />
Erweiterungen, um inhärente Probleme zu überwinden<br />
Fehlende Sitzungen -> Session-Management / Cookies<br />
Statisches Look&Feel / Serverzentrierung -> JavaScript<br />
Ziel: Rich Internet Applications (RIA)<br />
Schwammiges Buzzword, bezeichnet die Umsetzung der User Experience von<br />
Desktop-Anwendungen in internetbasierten Anwendungen (zumeist, aber nicht<br />
immer, im Browser)<br />
Übung Prozessmodellierung WS13/14<br />
Seite 18
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
Web-Anwendungen (8)<br />
Zentrales Konzept: AJAX (Asynchronous JavaScript and XML)<br />
AJAX: Per HTTP eine Anfrage an einen Serverdienst richten, wobei die Antwort<br />
asynchron eingeht, d.h. parallel zur Bearbeitung auf dem Server bleibt die<br />
Webanwendung reaktionsfähig<br />
Nach dem Eintreffen der Antwort wird diese per JavaScript asynchron<br />
verarbeitet und in die Webseite "eingearbeitet" (z.B. durch Austausch von<br />
DOM-Teilen); die Seite wird also typischerweise nicht neu geladen<br />
Die Payload kann vielgestaltig sein, z.B. HTML-Code oder JSON-Objekte<br />
Weiterhin machen RIAs intensiven Gebrauch von JavaScript-Bibliotheken wie<br />
JQuery, um komplexe Steuerelemente (z.B. Tabs, Dialogboxen usw.),<br />
Bedienkonzepte (z.B. Drap&Drop) und Effekte (z.B. Fading-Animationen)<br />
umzusetzen<br />
Übung Prozessmodellierung WS13/14<br />
Seite 19
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
Web-Anwendungen (9)<br />
Quelle:<br />
Wikipedia<br />
Übung Prozessmodellierung WS13/14<br />
Seite 20
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
Implementierung von Web-Anwendungen<br />
Ansätze zur Implementierung von Web-Anwendungen<br />
Bereits bekannt: Zur Beantwortung einer Benutzeraktion<br />
wird das HTTP-Request bzw. sein Gegenstand an eine<br />
Anwendung weitergeleitet, die die Antwort<br />
(typischerweise ein HTML-Dokument) erzeugt<br />
HTTP-Request /<br />
URL und Parameter<br />
HTTP-Server<br />
HTTP-Response /<br />
HTML-Dokument<br />
Die Art der Implementierung dieser „Anwendung“ jedoch<br />
bisher eine Black Box…<br />
Anwendung<br />
Grundsätzlich kann eine solche Anwendung in jeder Umgebung realisiert werden,<br />
die eine CGI-Schnittstelle bietet (was lediglich Zugriff auf Umgebungsvariablen und<br />
Standard-Ausgabe/Eingabeströme erfordert).<br />
Damit können z.B. schon mit Shellskripten HTTP-Requests verarbeitet und<br />
dynamische Antworten geliefert werden<br />
Jede Programmiersprache mit CGI-Interface ist prinzipiell geeignet<br />
Häufig Skriptsprachen, insbesondere spezialisierte Sprachen wie z.B. PHP<br />
Java-Konzept: Servlets<br />
Übung Prozessmodellierung WS13/14<br />
Seite 21
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
Java Web-Anwendungen (1)<br />
Ausgangspunkt: Java Servlets<br />
Servlets sind Java-Klassen, die zur Verarbeitung eines HTTP-Requests<br />
bestimmte Methoden der folgenden Form implementieren:<br />
protected void doGet(HttpServletRequest req, HttpServletResponse resp)<br />
Beim Aufruf verarbeitet beispielsweise die doGet-Methode das Objekt req, das<br />
alle notwendigen Informationen über die erhaltene HTTP-Anfrage enthält.<br />
Die Antwort wird per Methodenaufrufe an resp konstruiert – standardmäßig<br />
dadurch, dass HTML-Code in Stringform konstruiert und als Antwort-Payload<br />
an resp übergeben wird<br />
Servlet Container: Servlets sind zunächst nur Klassen, im laufenden Betrieb<br />
der Anwendung müssen zu jeder Anfrage Instanzen erzeugt werden – diese<br />
Aufgabe übernimmt ein sogenannter Servlet Container (der typischerweise<br />
identisch mit dem HTTP-Server ist)<br />
Übung Prozessmodellierung WS13/14<br />
Seite 22
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
Java Web-Anwendungen (2)<br />
Servlets eigentlich Teil von J2EE / Java Enterprise Edition, allerdings wird das<br />
Konzept auch von Servern (z.B. Apache Tomcat, Jetty) genutzt, die nicht Teil<br />
von Java EE sind<br />
Eigenschaften des Konzeptes in Rohform<br />
Im Grunde zunächst nur „CGI für Java“, alleine ausgehend von der Servlet-<br />
Schnittstelle Web-Anwendungen zu bauen ist aufwendig<br />
Nützlich: Unterstützung durch Technologien und Bibliotheken der Java-Welt<br />
Weniger nützlich: HTML-Code im Programmcode zusammenbauen; zum einen<br />
vermischt dies verschiedene Schichten der Anwendung, zum anderen ist HTML-<br />
Code inzwischen sehr aufwendig und teilweise browserspezifisch<br />
Daher: Zahlreiche Ansätze und Frameworks, die ausgehend vom Servlet-<br />
Konzept versuchen, dem Programmierer bestimmte weniger wertschöpfende<br />
Tätigkeiten abzunehmen bzw. durch Abstraktionen zu ersetzen (Bereitstellung<br />
einer Sitzungsumgebung, Templates, Daten automatisch in Seiten einfügen…)<br />
Übung Prozessmodellierung WS13/14<br />
Seite 23
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT – Google Web Toolkit (1)<br />
Unsere Umgebung wird das Google Web Toolkit (GWT, "GWiT") sein<br />
Grundidee: Übergang von der Desktop-Applikation zur Web-Applikation<br />
automatisieren<br />
Entwicklung einer Desktop-Anwendung in Java, wobei nach einer Konvention<br />
zwischen clientseitigen und serverseitigen Klassen unterschieden wird<br />
GWT-Compiler: Erzeugen einer clientseitigen Anwendung auf Basis von JavaScript<br />
Erzeugen einer serverseitigen Anwendung auf Basis von Servlets<br />
Binden als WAR-File und Bereitstellung in einem Servlet Container<br />
Client-Klassen: Implementieren die Business Objects (Kunde, Auftrag, usw.)<br />
und die graphische Benutzeroberfläche<br />
Server-Klassen: Implementieren serverseitiger Dienste wie der Zugriff auf die<br />
Datenhaltung oder geschäftsobjektübergreifende Funktionen<br />
Shared-Klassen: Klassen, die sowohl auf Client- als auch auf Serverseite<br />
genutzt werden (z.B. Validatoren, siehe weiter unten)<br />
Übung Prozessmodellierung WS13/14<br />
Seite 24
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT – Google Web Toolkit (2)<br />
Der GWT-Compiler generiert für die Clients eine Anwendung auf Basis von<br />
JavaScript und implementiert automatisch die Kommunikation mit den<br />
Serverdiensten<br />
Rich Internet Applications: Die generierte Anwendung nutzt AJAX und<br />
ermöglicht damit das Anpassen der Benutzeroberfläche ohne Neuladen;<br />
weiterhin werden GUI-Elemente wie Tabs angeboten, sowie<br />
Bedienungskonzepte wie Drag&Drop<br />
Der GWT-Compiler generiert die Client-Anwendung dabei für unterschiedliche<br />
Ziel-Browser; die von GWT erzeugte serverseitige Anwendung liefert<br />
entsprecht das Kompilat für den tatsächlich genutzten Browser aus<br />
Da die Client-Klassen später direkt auf dem Client laufen, ist ein<br />
Sitzungskontext ohne weiteres Zutun bereits gegeben<br />
Debug Mode: GWT bringt zum Testen einen integrierten Jetty Servlet<br />
Container mit; außerdem können Änderungen on the fly getestet werden -><br />
iterative Entwicklung<br />
Übung Prozessmodellierung WS13/14<br />
Seite 25
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT - Clientseitige Klassen (1)<br />
Fachkonzeptklassen<br />
(Business Objects): Die<br />
in der Anwendung genutzten<br />
Geschäftsobjekte müssen in<br />
Form von Klassen definiert<br />
werden<br />
package de.mygwtproject.client;<br />
/* ... */<br />
public class Customer implements Serializable {<br />
private int cust_id;<br />
private String name;<br />
public Customer() { }<br />
public Customer(int id, String name) {<br />
this.cust_id = id;<br />
this.setName(name);<br />
}<br />
Diese Klassen gehören zum<br />
Client-Teil der Anwendung,<br />
können und werden jedoch<br />
auch in den Server-Klassen<br />
verwendet<br />
Müssen serializable sein, da<br />
sie im Betrieb zwischen Client<br />
und Server ausgetauscht werden<br />
Typischerweise JavaBeans<br />
}<br />
public Integer getID() {<br />
return cust_id;<br />
}<br />
public String getName() {<br />
return this.name;<br />
}<br />
public Customer setName(String name) {<br />
this.name = name;<br />
return this;<br />
}<br />
public int getAnnualTurnover() {<br />
/* ... */<br />
}<br />
Übung Prozessmodellierung WS13/14<br />
Seite 26
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT - Clientseitige Klassen (2)<br />
Als Ausgangsklasse für die GUI<br />
ist ein EntryPoint zu implementieren,<br />
an den der erste Request einer Sitzung<br />
gerichtet wird<br />
Der Code der EntryPoint-Klasse erzeugt<br />
die Ausgangs-Benutzeroberfläche über<br />
die Methode onModuleLoad()<br />
package de.mygwtproject.client;<br />
/* ... */<br />
public class ExampleEP implements EntryPoint {<br />
public void onModuleLoad() {<br />
final Widget foo = new Button();<br />
}<br />
}<br />
RootPanel.get("main").add(foo);<br />
Die UI wird dabei auf Basis einer eigenen Widget-Klassenhierarchie<br />
beschrieben<br />
RootPanel: Ein Panel, das als Wurzel einer GUI fungiert; das Default-RootPanel<br />
(eine HTML-Datei) erhält man mit RootPanel.get(). Alternativ kann man das<br />
RootPanel aus einem Element der HTML-Datei erzeugen<br />
Beispiel: Es wird ein simpler Button erzeugt und in das Element main des<br />
HTML-Templates eingefügt<br />
Übung Prozessmodellierung WS13/14<br />
Seite 27
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT - Clientseitige Klassen (3)<br />
Widget-Hierarchie für die GUI<br />
Wurzel ist die Klasse Widget<br />
Panel: Container für andere Widgets, z.B. für Layoutzwecke (VerticalPanel, …)<br />
Composite: Proxy-Panel für genau ein anderes Widget<br />
TabPanel: Ein Panel aus mehreren Tabs, wobei in jedem Tab ein anderes Widget<br />
dargestellt wird<br />
TextBox, TextArea, Label, CheckBox: Die üblichen verdächtigen Steuerelemente…<br />
HTML: Ein Widget generiert aus HTML-Code<br />
Tree: Darstellung eines Baumes von anderen Widgets<br />
DialogBox: Ein konfigurierbarer Popup-Dialog zur Abfrage einer Benutzereingabe<br />
usw.<br />
Formatierung per CSS kann genutzt werden z.B. setStyleName("gwt-Button")<br />
Übung Prozessmodellierung WS13/14<br />
Seite 28
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT - Clientseitige Klassen (4)<br />
An Widgets können EventHandler<br />
registriert werden (ereignisorientierte<br />
Programmierung<br />
analog zu Desktop-Anwendungen)<br />
Beispiel: Maske zur Verwaltung<br />
eines Kunden, vorerst nur mit<br />
einem einzigen Button<br />
Maske wird als Ableitung von<br />
Composite implementiert<br />
Im EntryPoint wird eine Instanz der<br />
CustomerMask in das RootPanel<br />
eingefügt<br />
Registrierung eines<br />
OnClick-Handlers in der<br />
CustomerMask-Klasse<br />
package de.mygwtproject.client;<br />
/* ... */<br />
public class ExampleEP implements EntryPoint {<br />
public void onModuleLoad() {<br />
final Widget cust_mask = new CustomerMask();<br />
RootPanel.get("main").add(cust_mask);<br />
}<br />
}<br />
package de.mygwtproject.client;<br />
/* ... */<br />
public class CustomerMask extends Composite {<br />
Button button = new Button();<br />
TextBox name = new TextBox();<br />
}<br />
public CustomerMask() {<br />
Panel p = new VerticalPanel();<br />
button.addClickHandler(new ClickHandler() {<br />
public void onClick(ClickEvent event) {<br />
Window.alert("Hallo!");<br />
}<br />
});<br />
p.add(name);<br />
p.add(button);<br />
this.initWidget(p);<br />
}<br />
Übung Prozessmodellierung WS13/14<br />
Seite 29
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT – Serverseitige Klassen (1)<br />
Implementierung der serverseitigen Funktionalität, insbesondere Methoden für<br />
den Zugriff auf die Anwendungslogik und Fachkonzeptobjekte (z.B.<br />
getCustomer(), deleteCustomer() usw.), also auf die Datenhaltungsschicht<br />
Beispiel: Clientseitige Klassen zur Implementierung einer Maske zum Anlegen<br />
einer Hotelbuchung, serverseitige Klassen zum Abrufen von Stammdaten<br />
(Zimmern, Kunden usw.), zum Suchen von freien Zimmern für den<br />
Buchungszeitraum und zum Anlegen der Buchung<br />
1. Schritt: Schnittstelle mit den Methoden des Services definieren (hier<br />
CustomerService für unser Kunden-Beispiel)<br />
package de.mygwtproject.client;<br />
/* ... */<br />
@RemoteServiceRelativePath("customer")<br />
public interface CustomerService extends RemoteService {<br />
public List getCustomers();<br />
public Customer getCustomer(int id);<br />
}<br />
Übung Prozessmodellierung WS13/14<br />
Seite 30
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT – Serverseitige Klassen (2)<br />
2. Schritt: Aus der synchronen Schnittstelle eine asynchrone Schnittstelle<br />
ableiten<br />
package de.mygwtproject.client;<br />
/* ... */<br />
public interface CustomerServiceAsync {<br />
void getCustomers(AsyncCallback callback);<br />
void getCustomer(int id, AsyncCallback callback);<br />
}<br />
Die asynchrone Schnittstelle ist für die Client-Klassen notwendig, um in der<br />
späteren clientseitigen JavaScript-Anwendung AJAX-Anfragen ausführen zu<br />
können (d.h. die Benutzeroberfläche reagiert weiter, während auf die Antwort<br />
eines Services gewartet wird).<br />
D.h. in den Client-Klassen muss konsequent die asynchrone Schnittstelle<br />
genutzt werden!<br />
Übung Prozessmodellierung WS13/14<br />
Seite 31
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT – Serverseitige Klassen (3)<br />
3. Schritt: In den Client-Klassen auf die Services zugreifen<br />
Dazu wird vom Framework mit der Methode GWT.create() eine Instanz des<br />
asynchronen Dienstes angefordert<br />
Aufrufe an eine Methode des Services erfolgen mit einer anonymen Callback-<br />
Instanz, die auf die spätere AJAX-Antwort reagiert<br />
public class CustomerMask extends Composite {<br />
private final CustomerServiceAsync customerService = GWT.create(CustomerService.class);<br />
/* ... */<br />
TextBox name = new TextBox();<br />
/* ... */<br />
private void selectCustomer(int id) {<br />
customerService.getCustomer(id, new AsyncCallback() {<br />
public void onFailure(Throwable caught) { }<br />
public void onSuccess(List result) {<br />
name.setValue(result.getName());<br />
}<br />
});<br />
}<br />
}<br />
Übung Prozessmodellierung WS13/14<br />
Seite 32
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT – Serverseitige Klassen (4)<br />
4. Schritt: Es wird eine serverseitige Klasse zur Implementierung des<br />
asynchronen Interfaces angelegt<br />
package de.mygwtproject.server;<br />
/* ... */<br />
public class CustomerServiceImpl<br />
extends RemoteServiceServlet<br />
Implements CustomerService {<br />
}<br />
public List getCustomers() {<br />
/* ... */<br />
}<br />
public Customer getCustomer(int id) {<br />
/* ... */<br />
}<br />
Übung Prozessmodellierung WS13/14<br />
Seite 33
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT – UiBinder (1)<br />
Bisher haben wir die Benutzeroberfläche per Java-Code zusammengesetzt,<br />
d.h. Codesequenzen, die Widget-Klassen instanziieren, konfigurieren und zu<br />
einer Baumstruktur zusammenfügen<br />
Zwar besser als selbst HTML-Code zu schreiben, aber für komplexe<br />
Benutzeroberfläche trotzdem ausgesprochen unhandlich<br />
Alternative UiBinder<br />
Beschreibung einer Widget-Benutzeroberfläche per XML<br />
Verknüpfen einer solchen XML-UI per Framework-Aufruf mit einer Java-Klasse<br />
Einführung von Instanzvariablen zur Repräsentation von UI-Elementen, die im Code<br />
benötigt werden, und automatisches Initialisieren durch UiBinder<br />
Registrieren von Ereignis-Handlern durch UiBinder<br />
Übung Prozessmodellierung WS13/14<br />
Seite 34
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT – UiBinder (2)<br />
Beispiel UI-XML für unsere Kundenmaske; es werden in einem vertikalen Panel<br />
ein Textfeld für den Namen und ein Button zum Speichern dargestellt<br />
[...]<br />
<br />
<br />
<br />
<br />
<br />
[...]<br />
Beispielhaft bereits eine DialogBox zu sehen; Dialoge können mit dem Attribut<br />
visible=false in den UI-Dateien angelegt und später bei Bedarf angezeigt werden<br />
Die Namen (ui:field) sind signifikant; über diese werden später die<br />
Verknüpfungen zu Instanzvariablen der Java-Klasse hergestellt<br />
Übung Prozessmodellierung WS13/14<br />
Seite 35
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT – UiBinder (3)<br />
In der eigenen Masken-Klasse kann nun ein passendes UiBinder-Interface (hier<br />
UiBinder) definiert warden. Ein Objekt dieses Typs wird<br />
dann durch vom Framework per GWT.create() erzeugt.<br />
public class CustomerMask<br />
extends Composite {<br />
interface CustomerMaskUiBinder extends UiBinder {}<br />
private final CustomerMaskUiBinder uiBinder = GWT.create(CustomerMaskUiBinder.class);<br />
@UiField Button button;<br />
@UiField TextBox name;<br />
public CustomerMask() {<br />
this.initWidget( uiBinder.createAndBindUi(this) );<br />
}<br />
}<br />
@UiHandler("button")<br />
void onButtonClick(ClickEvent event) {<br />
/* ... */<br />
}<br />
Übung Prozessmodellierung WS13/14<br />
Seite 36
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT – UiBinder (4)<br />
Das uiBinder-Objekt erzeugt zu einem Objekt (hier die CustomerMask-Instanz)<br />
die GUI und gibt das Wurzelobjekt zurück (hier generisch vom Typ Widget)<br />
Beim Erzeugen der Oberfläche sucht der uiBinder nach einer XML-Datei mit<br />
dem Namen .ui.xml; in diesem Fall muss die XML-Beschreibung der UI<br />
also in der Datei CustomerMask.ui.xml vorliegen<br />
public class CustomerMask<br />
extends Composite {<br />
interface CustomerMaskUiBinder extends UiBinder {}<br />
private final CustomerMaskUiBinder uiBinder = GWT.create(CustomerMaskUiBinder.class);<br />
@UiField Button button;<br />
@UiField TextBox name;<br />
public CustomerMask() {<br />
this.initWidget( uiBinder.createAndBindUi(this) );<br />
}<br />
}<br />
@UiHandler("button")<br />
void onButtonClick(ClickEvent event) {<br />
/* ... */<br />
}<br />
Übung Prozessmodellierung WS13/14<br />
Seite 37
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT – UiBinder (5)<br />
Die Annotation @UiField bewirkt, dass der uiBinder das entsprechende Widget-<br />
Objekt auf die Instanzvariable zuweist; die Auswahl erfolgt anhand des<br />
Variablennamens (der dem Widget-Attribut ui:field entsprechen muss)<br />
public class CustomerMask<br />
extends Composite {<br />
interface CustomerMaskUiBinder extends UiBinder {}<br />
private final CustomerMaskUiBinder uiBinder = GWT.create(CustomerMaskUiBinder.class);<br />
@UiField Button button;<br />
@UiField TextBox name;<br />
public CustomerMask() {<br />
this.initWidget( uiBinder.createAndBindUi(this) );<br />
}<br />
}<br />
@UiHandler("button")<br />
void onButtonClick(ClickEvent event) {<br />
/* ... */<br />
}<br />
Übung Prozessmodellierung WS13/14<br />
Seite 38
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT – UiBinder (6)<br />
Die Annotation @UiHandler bewirkt, dass der uiBinder einen Event-Handler im<br />
entsprechenden Widget erzeugt, der die annotierte Methode aufruft; die<br />
Auswahl des Events erfolgt anhand des Parametertyps der Funktion<br />
public class CustomerMask<br />
extends Composite {<br />
interface CustomerMaskUiBinder extends UiBinder {}<br />
private final CustomerMaskUiBinder uiBinder = GWT.create(CustomerMaskUiBinder.class);<br />
@UiField Button button;<br />
@UiField TextBox name;<br />
public CustomerMask() {<br />
this.initWidget( uiBinder.createAndBindUi(this) );<br />
}<br />
}<br />
@UiHandler("button")<br />
void onButtonClick(ClickEvent event) {<br />
/* ... */<br />
}<br />
Übung Prozessmodellierung WS13/14<br />
Seite 39
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT – Editoren (1)<br />
Bisher: Wird ein Business Object in eine Maske geladen, müssen die<br />
Attributwerte (z.B. beim Kunden der Name, die Adresse usw.) mit einzelnen<br />
Statements in die entsprechenden UI-Felder geladen werden,<br />
z.B.<br />
name.setValue( cust.getName() );<br />
surname.setValue( cust.getSurName() );<br />
...<br />
Das gleiche ist in umgekehrte Richtung beim Abspeichern nach Änderungen<br />
oder beim Anlegen neuer Objekte erforderlich<br />
z.B.<br />
cust.setName( name.getValue() );<br />
cust.setSurName( surname.getValue() );<br />
...<br />
Sehr langweiliger Quellcode, langweiliges Programmieren, sinnlose<br />
Fehlerquelle<br />
Übung Prozessmodellierung WS13/14<br />
Seite 40
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT – Editoren (2)<br />
Lösungsansatz: Editoren<br />
Bei Editoren handelt es sich um Objekte, die das Laden von Business Objects<br />
in Widgets und das Zurückschreiben übernehmen<br />
Editoren können durch den GWT-Framework automatisch zu einer Kombination<br />
aus Business Object-Klasse und Masken-Klasse erzeugt werden<br />
Für unser Beispiel wäre ein Editor erforderlich, also<br />
ein Editor, der ein Customer-Objekt in ein Widget vom Typ CustomerMask lädt<br />
bzw. daraus zurückschreibt<br />
Editoren stellen eine Verbindung zwischen bestehenden Oberflächen (Widgets)<br />
und bestehenden Geschäftsobjekten her; sie stellen selbst keine<br />
Benutzeroberfläche dar und dienen auch nicht z.B. der automatischen<br />
Erzeugung einer Benutzeroberfläche<br />
Das Matching von Objekteigenschaften und Widgets findet standardmäßig über<br />
den Feldnamen (ui:field) statt<br />
Übung Prozessmodellierung WS13/14<br />
Seite 41
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT – Editoren (3)<br />
1. Schritt: Definition eines Interfaces mit dem passenden Editor-Typ<br />
2. Schritt: Konstruktion des Editors auf Basis des Interfaces per GWT.create()<br />
3. Schritt: Verknüpfen mit der Maskeninstanz per initialize()<br />
public class CustomerMask<br />
extends Composite {<br />
interface CustomerEditorDriver extends SimpleBeanEditorDriver {}<br />
private final CustomerEditorDriver editorDriver = GWT.create(CustomerEditorDriver.class);<br />
@UiField TextBox name;<br />
/* ... */<br />
public CustomerMask() {<br />
/* ... */<br />
this.editorDriver.initialize(this);<br />
}<br />
void editCustomer(Customer c) {<br />
editorDriver.edit(c);<br />
}<br />
}<br />
void saveCustomer() {<br />
editorDriver.flush();<br />
}<br />
Übung Prozessmodellierung WS13/14<br />
Seite 42
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT – Editoren (4)<br />
Nun kann ein Customer-Objekt per edit()-Methode in die Maske geladen bzw.<br />
per flush()-Methode mit dem aktuellen Maskenzustand aktualisiert werden<br />
Java Beans als Grundlage, d.h. ui:field="name" => getName()- / setName()-<br />
Methoden in der Customer-Klasse<br />
public class CustomerMask<br />
extends Composite {<br />
interface CustomerEditorDriver extends SimpleBeanEditorDriver {}<br />
private final CustomerEditorDriver editorDriver = GWT.create(CustomerEditorDriver.class);<br />
@UiField TextBox name;<br />
/* ... */<br />
public CustomerMask() {<br />
/* ... */<br />
this.editorDriver.initialize(this);<br />
}<br />
void editCustomer(Customer c) {<br />
editorDriver.edit(c);<br />
}<br />
}<br />
void saveCustomer() {<br />
editorDriver.flush();<br />
}<br />
Übung Prozessmodellierung WS13/14<br />
Seite 43
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT – Validatoren (1)<br />
Problemstellung: Geschäftsregeln, d.h. hier einfache Bedingungen bzgl. des<br />
Zustandes von Geschäftsobjekten definieren und durchsetzen<br />
Praktisch relevant insbesondere für die Überprüfung von Benutzereingaben<br />
Abbilden in Quellcode ist umständlich und fehlerträchtig, außerdem werden die<br />
Regeln dadurch mit der übrigen Anwendungslogik vermischt<br />
Obskure Lösung ohne viel Code: Alles akzeptieren, Bedingungen im DB-<br />
Schema festlegen und auf SQL-Exception warten...<br />
Probleme: Unsinnige Serverbelastung, keine ex ante Reaktion möglich, Fehlerquelle<br />
geht u.U. verloren, damit womöglich keine aussagekräftige Fehlermeldung usw.<br />
Besser: Prüfung bereits auf der Benutzeroberfläche<br />
Aber: Gefahr von Redundanz, da auch bei Prüfung in der GUI trotzdem<br />
Prüfungen in der Geschäftslogik und in der Datenbank notwendig sind<br />
Lösungsansatz: Integration von Java Validators in GWT<br />
Übung Prozessmodellierung WS13/14<br />
Seite 44
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT – Validatoren (2)<br />
1. Schritt: Java Validator-Annotationen in Geschäftsobjekt-Klasse ergänzen<br />
package de.mygwtproject.client;<br />
/* ... */<br />
public class Customer implements Serializable {<br />
/* ... */<br />
}<br />
@Size(min=7, max=10, message="Name length invalid")<br />
private String name;<br />
/* ... */<br />
Beispiel hier: Länge des Namensattributes auf 7 bis 10 Zeichen einschränken<br />
(ziemlich sinnlose Geschäftsregel…); mit der eigentlichen Restriktion kann<br />
zusätzlich eine passende Fehlermeldung bei Verletzen definiert werden<br />
Übung Prozessmodellierung WS13/14<br />
Seite 45
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT – Validatoren (3)<br />
1. Schritt: Notwendige Bibliotheken bereitstellen (teilweise etwas anstrengend<br />
von wegen passende Versionen…)<br />
2. Schritt: Validation-Fabrik definieren; die Fabrik hat nur eine Methode zum<br />
Erzeugen von Validatoren; die Erzeugung wird dabei erneut an die<br />
GWT.create()-Methode des Frameworks deligiert<br />
Achtung: Die Fabrik wird gleichberechtigt durch Client und Server genutzt,<br />
daher shared-Package<br />
package de.mygwtproject.shared;<br />
/* ... */<br />
public final class ValidationFactory extends<br />
AbstractGwtValidatorFactory {<br />
@GwtValidation(Customer.class)<br />
public interface GwtValidator extends Validator {<br />
}<br />
}<br />
@Override<br />
public AbstractGwtValidator createValidator() {<br />
return GWT.create(GwtValidator.class);<br />
}<br />
Übung Prozessmodellierung WS13/14<br />
Seite 46
Geschäftsprozesse und IT / Implementierung von Web-Anwendungen / GWT<br />
GWT – Validatoren (4)<br />
3. Schritt: Validation in der Konfigurationsdatei der Anwendung aktivieren (für<br />
automatische Prüfung bei UI-Eingaben)<br />
Nun kann in der Anwendungslogik validiert werden, z.B.:<br />
Customer c;<br />
/* ... */<br />
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();<br />
Set violations = validator.validate(this.c);<br />
String s = "";<br />
for(ConstraintViolation v : violations)<br />
s += v.getMessage();<br />
Window.alert("Mist: " + s);<br />
/* ... */<br />
Regeln können in Validierungsgruppen zusammengefasst werden, um z.B.<br />
bestimmte Regeln nur auf der Clientseite und andere Regeln nur auf der<br />
Serverseite zu prüfen<br />
Es können eigene Regeltypen definiert werden, um z.B. auf der Serverseite<br />
komplexe Geschäftsregeln auf Basis der Datenhaltung zu prüfen<br />
Übung Prozessmodellierung WS13/14<br />
Seite 47
Nächstes Mal…<br />
Persistente Datenhaltung / Bezug zur Datenmodellierung<br />
Unser Vorgehensmodell (Modellerweiterungen, Konventionen, Ablauf)<br />
Demonstration einer kleinen Web-Anwendung mit GWT<br />
Iterative Entwicklung<br />
Deployment<br />
Installationen<br />
GWT<br />
Eclipse-Plugin / Browser-Plugin<br />
MySQL / EclipseLink<br />
Je nach Zeit etwas zu<br />
… Java EE<br />
… Alternativen zu GWT<br />
… Web Services<br />
Übung Prozessmodellierung WS13/14<br />
Seite 48