Fachbereich Informatik Internetanwendungen auf Javabasis Diplomarbeit von Andreas Billmann Mannheim, Januar 2001 Betreuer der Diplomarbeit: Prof. Dr. R. Gerten Abstract Die Diplomarbeit beschreibt den Aufbau verschiedener Internetanwendungen. Im Speziellen werden hierbei die Internetportale betrachtet. Nach einer kurzen Analyse zweier vorhandener Internetportale wird ein Rahmen für die Umsetzung eines Portals für den Fachbereich Informatik der FH Mannheim entworfen. Der Schwerpunkt liegt hierbei auf den Teilbereichen Inhalt, Struktur und Design. Nach der Auswertung der Vor- und Nachteile verschiedener Architekturen wird die 3-Tier-Architektur zur Umsetzung ausgewählt. Anschließend erfolgt eine Betrachtung verschiedener Softwaretechniken für Internetanwendungen. Nach einem Vergleich der Softwaretechniken bezüglich ihrer Verwendung für das Internetportal werden die JavaServlets als zu verwendende Technik bestimmt. Im weiteren Verlauf bilden die Entscheidungen, die aus der Auswertung der Architekturen und der Betrachtung der Softwaretechniken begründet sind, die Basis für den Lösungsvorschlag für die Erstellung des Internetportals. Da die JavaServlets in Java programmiert sind, wird im Folgenden die Programmiersprache Java vorgestellt. Der Hauptaugenmerk liegt hierbei auf der Unterstützung moderner (objektorientierter) Softwaretechniken durch Java. Der Lösungsvorschlag für die Erstellung des Internetportals umfaßt die Anwendungsschichten Datenbanksystem, Geschäftslogik und Präsentation. Jede Anwendungsschicht wird im Hinblick auf ihre Teilbereiche erläutert. Zusätzlich zur Erläuterung wird die Implementierung jeder Anwendungsschicht am Beispiel des Internetportals des Fachbereichs Informatik aufgezeigt. -2- Kapitelverzeichnis 1. Motivation und Zielsetzung der Diplomarbeit ...............7 2. Portal des Fachbereichs ..............................................10 3. Internetanwendungen ..................................................18 4. Java...............................................................................27 5. Anwendungsschichten .................................................36 6. Implementierungshinweise..........................................50 7. Schlußbetrachtung .......................................................52 -3- Inhaltsverzeichnis 1. 1.1. 1.2. 1.3. 2. 2.1. 2.1.1. 2.1.2. 2.2. 2.2.1. 2.2.2. 2.2.3. 2.2.4. 3. 3.1. 3.1.1. 3.1.2. 3.1.3. 3.2. 3.2.1. 3.2.2. 3.2.3. 3.2.4. 3.2.5. 3.3. 4. 4.1. 4.1.1. 4.1.2. 4.2. 4.2.1. 4.2.2. 4.2.3. 4.2.4. Motivation und Zielsetzung der Diplomarbeit ...............7 Einführende Betrachtung des Themas.................................... 7 Ziel und Aufbau der Diplomarbeit............................................ 7 Grundlegende Begriffe ............................................................. 8 Portal des Fachbereichs ..............................................10 Betrachtung bestehender Portale.......................................... 10 Inhaltsanalyse ........................................................................... 10 Designanalyse........................................................................... 10 Entwurf des Portals................................................................. 11 Inhalte ....................................................................................... 11 Interaktive Elemente.................................................................. 12 Struktur...................................................................................... 14 Design ....................................................................................... 16 Internetanwendungen ..................................................18 N-Tier-Architekturen ............................................................... 18 2-Tier-Architektur....................................................................... 18 3-Tier-Architektur....................................................................... 19 4-Tier-Architektur....................................................................... 19 Serverseitige Programmiertechniken.................................... 20 Common Gateway Interface (CGI)............................................ 21 Webserver-APIs ........................................................................ 22 Servlets ..................................................................................... 23 Java Server Pages (JSP) .......................................................... 24 Vergleich der Techniken............................................................ 25 Begründung der Auswahl der Techniken zur Portalimplementierung ........................................................... 26 Java...............................................................................27 Allgemeine Grundlagen von Java.......................................... 27 Grundlegende Anforderungen bei der Entwicklung von Java.... 27 Java Architektur ........................................................................ 29 Objektorientierte Konzepte von Java .................................... 30 Abstraktion ................................................................................ 31 Kapselung ................................................................................. 31 Wiederverwendung ................................................................... 31 Beziehungen ............................................................................. 32 -4- 4.2.5. 4.2.6. 4.2.7. 4.2.8. 4.2.9. 4.2.10. 5. 5.1. 5.1.1. 5.1.2. 5.1.3. 5.1.4. 5.1.5. 5.2. 5.2.1. 5.2.2. 5.2.3. 5.2.4. 5.3. 5.3.1. 5.3.2. 5.3.3. 6. 6.1. 6.1.1. 6.1.2. 6.1.3. 6.2. 6.2.1. 6.2.2. 7. 7.1. 7.2. Vererbung ................................................................................. 32 Polymorphismus........................................................................ 33 Statische Elemente ................................................................... 33 Schnittstelle............................................................................... 34 Abstrakte Klassen ..................................................................... 34 Entwurfsmuster ......................................................................... 35 Anwendungsschichten .................................................36 Datenbanksystem.................................................................... 36 Leistungsmerkmale von relationalen Datenbankmanagementsystemen ........................................ 36 Structured Query Language (SQL) ........................................... 37 Java Database Connectivity (JDBC) ......................................... 37 Zugriffsschicht ........................................................................... 38 Implementierung ....................................................................... 39 Geschäftslogik ........................................................................ 42 Geschäftsprozeß....................................................................... 42 Geschäftsobjekte ...................................................................... 42 JavaBeans ................................................................................ 43 Implementierung ....................................................................... 43 Präsentation ............................................................................ 45 Hypertext Markup Language (Html) .......................................... 45 Servlets ..................................................................................... 46 Implementierung ....................................................................... 47 Implementierungshinweise..........................................50 Programmierumgebung.......................................................... 50 JDK 1.2.2 .................................................................................. 50 Servlets 2.2 ............................................................................... 50 Dokumentation .......................................................................... 50 Systemumgebung ................................................................... 50 Webserver................................................................................. 50 Servlet Engine........................................................................... 51 Schlußbetrachtung .......................................................52 Resümee .................................................................................. 52 Ausblick auf aktuelle und zukünftige Entwicklungen .......... 53 -5- Eidesstattliche Erklärung Hiermit versichere ich an Eides statt, daß ich die vorliegende Arbeit selbständig angefertigt und keine fremde Hilfe in Anspruch genommen habe. Alle Stellen, die wörtlich aus veröffentlichten oder nicht veröffentlichten Schriften entnommen sind, habe ich als solche einzeln kenntlich gemacht. Ferner erkläre ich, daß die vorliegende Arbeit in keinem anderen Studiengang und an keiner anderen Stelle als Prüfungsleistung verwendet wurde. Mannheim, . Januar 2001 Andreas Billmann -6- 1. Motivation und Zielsetzung der Diplomarbeit 1.1. Einführende Betrachtung des Themas Die Entwicklung von „Internetportalen“ nimmt immer mehr zu. Es reicht heutzutage nicht mehr aus, Information in statischer Form im World Wide Web bereitzustellen. Die Webseiten sollten themenorientiert und dynamisch dargestellt werden, um eine leichtere Wartbarkeit des Systems zu gewährleisten. Zudem sollte eine Interaktion zwischen dem „Websurfer“ und dem Portal möglich sein. Erst dadurch kann man Dienste wie Diskussionsforen, Newsletter oder ähnliches anbieten, die den Mehrwert für den Benutzer steigern. Im Rahmen dieser Diplomarbeit soll ein Portal für den Fachbereich Informatik erstellt werden, das zum einen Informationen bereitstellt, zum anderen aber auch Möglichkeiten zur Kommunikation bietet. Thematisch orientiert sich das Portal am Fachbereich Informatik der FH Mannheim. Die hier gezeigten Techniken sind aber nicht nur für Portale gedacht und anwendbar, sondern eignen sich grundsätzlich für fast alle Internetanwendungen. 1.2. Ziel und Aufbau der Diplomarbeit Die Diplomarbeit soll der Aufbau von Internetanwendungen im Allgemeinen aufzeigen und analysieren. Hierbei liegt der Schwerpunkt auf der Betrachtung von Portalen. Die Basis bilden bereits bestehende Portale, die in Bezug auf verschiedene Kriterien bewertet werden. Ausgehend von dieser Analyse erfolgt der Entwurf des Portals für den Fachbereich Informatik der FH Mannheim. Das Hauptziel dieser Diplomarbeit ist es, die für die Umsetzung einer Internetanwendung allgemein möglichen Techniken in Bezug auf ihre Eignung differenziert zu betrachten und im Hinblick auf unterschiedliche Anforderungen zu bewerten. Somit ergibt sich die Möglichkeit, die einzelnen zur Verfügung stehenden Techniken miteinander zu vergleichen. Hierbei wird besonders Java als ausgewählte Technik betrachtet. Anschließend wird die Aufteilung einer Internetanwendung nach softwaretechnischen Gesichtspunkten vorgenommen und die Art der Implementierung im Portal vorgestellt. Abschließend werden die Ergebnisse und Schwerpunkte dieser Diplomarbeit in einem Resümee zusammengefaßt. In diesem Rahmen erfolgt insbesondere ein -7- Ausblick auf aktuelle und zukünftige Entwicklungsrichtungen von Internetanwendungen. 1.3. Grundlegende Begriffe Aufgrund der Begriffsvielfalt in der Informatik sollen hier einige der benutzten Begriffe vorab kurz vorgestellt und erläutert werden. Datenbank und Datenbankmanagementsystem „Unter einer Datenbank versteht man den Speicherort für persistente Datensätze und unter einem Datenbankmanagementsystem (DBMS) die Software, die den Zugriff auf die Datenbank vornimmt. Das Datenbankmanagementsystem und die von ihm kontrollierten Datenbank(en) bilden zusammen das Datenbanksystem.“1 Entwurfsmuster (Design Pattern) „Eine objektorientierte Technik, die Aspekte einer nützlichen Designstruktur identifiziert, benennt und abstrahiert. Das Design Pattern identifiziert Klassen und Instanzen, ihre Rollen, ihre Kollaborationen und Verantwortlichkeiten unter Berücksichtigung eines spezifischen objektorientierten Designproblems.“2 Geschäftsprozess „Ein Geschäftsprozess besteht aus einer Reihe von Aktivitäten und erzeugt ein Ergebnis, das für den Klienten von Wert ist.“3 Geschäftsobjekt „Ein Geschäftsobjekt repräsentiert ein Objekt der echten Welt aus dem geschäftlichen Bereich.“4 Internetanwendung Eine Internetanwendung ist grundsätzlich jede Anwendung die über das Internet arbeitet. Im Rahmen der Diplomarbeit werden nur Internetanwendungen die über das World Wide Web realisiert werden, betrachtet. 1 [ZB00, S. 127] [DS00, S. 430] 3 [DS00, S. 432] 4 [DS00, S. 432] 2 -8- Internet Portal Unter einem Internet Portal versteht man eine Internetseite, die Informationen und Dienste zu einem oder mehreren definierten Themen bieten. Java Beans „Als Beans werden in Java eigenständige, wiederverwendbare Softwarekomponenten zum Aufbau von Applets und Applikationen bezeichnet. Obwohl sie nicht zwangsläufig eine für den Anwender sichtbare Oberfläche haben müssen, werden Beans doch typischerweise als grafische Komponenten zur Verfügung gestellt und können mit Hilfe eines GUIEditors (GUI= Graphical User Interface) interaktiv zu komplexen Anwendungen zusammengesetzt werden.“5 Komponente „Eine Komponente ist ein unabhängiges Softwaremodul, das für die ‚plug&play’-Wiederverwendung bestimmt ist. Komponenten enthalten eine oder mehrere Schnittstellenbeschreibungen (interface). Die meisten Komponenten können entsprechend den Anforderungen der ContainerAnwendung konfiguriert werden. Beispiele für Komponentenmodelle sind JavaBeans, Enterprise Java Beans, CORBA und ActiveX/COM/DCOM.“6 Statische und dynamische Webseite Als statischen Webseite bezeichne ich eine Webseite, die nur aus Dateien besteht. Die einzige Möglichkeit, die Webseite zu ändern, besteht in der Änderung einer Datei. Im Gegensatz dazu wird eine dynamische Webseite mit Hilfe von Programmen zur Laufzeit erzeugt. Das heißt, Html-Seiten werden erst bei Anfrage generiert. Dies geschieht meist im Zusammenspiel mit einem Datenbanksystem. 5 6 [K00, S. 1002] [DS00, S. 436] -9- 2. Portal des Fachbereichs 2.1. Betrachtung bestehender Portale Eine kurze Analyse bestehender Portale bilden die Basis des Entwurfs für das Portal der Fachbereichs Informatik der FHT Mannheim. Im Folgenden werden exemplarisch die Portale „heise.de“7 und „Geeksworld“8 betrachtet. 2.1.1. Inhaltsanalyse Bei „heise.de“ ist das Thema des Portals alles rund um die IT Branche. Als Dienste bietet „heise.de“ aktuelle Nachrichtenanzeige mit der Möglichkeit, diese zu kommentieren, verschiedene Diskussionsforen, Tarifrechner und einen Chat. „Geeksworld“ befasst sich mit dem Thema Webdesign und Webseitenprogrammierung. Als interaktive Elemente bietet „Geeksworld“ Diskussionsforen, Newsletter, aktuelle Nachrichten und einen Downloadbereich. Beide Portale zeigen, daß neben der reinen Informationsdarstellung besonders vor allem die Dienste Diskussionsforum und aktuelle Nachrichten einen hohen Stellenwert haben. Die aktuellen Nachrichten erscheinen bei beiden Portalen direkt als Startseite, und die Diskussionsforen zeigen durch ihre hohe Anzahl an Benutzereinträgen, daß der Dienst genutzt wird. 2.1.2. Designanalyse Das Portal „heise.de“ ist in drei Spalten aufgeteilt. In der linken Spalte findet man das Menü, in der Mitte ist der Hauptteil, in dem sich der Inhalt befindet, und rechts sind die wichtigsten Links aufgelistet. Diese Form der Darstellung wird im Moment sehr häufig benutzt, um eine optimale Ausnutzung des Platzes zu erreichen, da Bildschirme in der Regel mehr Pixel in der Breite als in der Höhe bieten. Allerdings wird das Menü recht unübersichtlich, wenn man in die tieferen Ebenen geht, denn zusätzlich zu dem Hauptmenüeintrag wird direkt darunter das entsprechende Untermenü dargestellt. 7 8 http://www.heise.de http://www.geeksworld.de/ - 10 - „Geeksworld“ hat ein Hauptmenü oben quer, in dem sich sieben Einträge befinden. Zu jedem der sieben Einträge wird auf der linken Seite ein Untermenü dargestellt. Durch ein „flaches“ Hauptmenü ist eine optimale Platzaufteilung gewährleistet und die Navigation ist auch in tieferen Ebenen noch übersichtlich. 2.2. Entwurf des Portals Der Entwurf des Portals läßt sich in mehrere Teile gliedern. Als erstes muß der Inhalt spezifiziert werden. Dieser Inhalt läßt sich dann in Bereiche aufteilen. Auch die interaktiven Elemente werden diesen Bereichen untergeordnet. Somit gewinnt man für die Webseite eine Struktur, die die Aufteilung der Inhalte und interaktiven Elemente in Bereiche und Teilbereiche weiter fördert und den Benutzer der Webseite in seiner Navigation unterstützt. Nach der Strukturbildung muß dann ein geeignetes Design gewählt werden, das die Struktur unterstützt und die Navigation vereinfacht. 2.2.1. Inhalte Die Inhalte des Portals werden in erster Linie aus den zur Verfügung stehenden Informationen des Fachbereiches gewonnen. Die folgenden Punkte sollen eine kurze Aufzählung der wichtigsten Inhalte darstellen. • Der Fachbereich stellt sich, das Dekanat und das dazugehörige Sekretariat vor. • Eine Professorenliste mit den nötigsten Eckdaten zu den Professoren soll abrufbar sein. • Eine Verlinkung bestehender Professorenseiten soll möglich sein. • Eine Auflistung der Institute, die den Fachbereich angegliedert sind, soll abrufbar sein. • Die Daten zur Fachschaftsvertretung sollen angezeigt werden. • Der aktuelle Stundenplan soll abrufbar sein. • Das Herunterladen von Unterlagen, Vorlesungsskripten oder Tutorien soll möglich sein. - 11 - 2.2.2. Interaktive Elemente Um dem Portal einen zusätzlichen Mehrwert zu geben, werden verschiedene Dienste angeboten. Die hier vorgestellten Dienste sollen eine Auswahl der am weitesten verbreiteten Dienste sein. • Diskussionsforum Angemeldete Benutzer haben die Möglichkeit, sich zu verschiedenen Diskussionsthemen auszutauschen. Der Ablauf innerhalb des Diskussionsforums wird in Abbildung 1 dargestellt. • Nachrichtendienst Aktuelle Nachrichten, die den Fachbereich betreffen, werden auf der Startseite mit den Überschriften aufgelistet und zum Lesen bereitgestellt. So kann jeder Benutzer die neusten Nachrichten auf den ersten Blick erfassen. • Linkkatalog Der Benutzer findet hier ausgewählte Links, die nach Themen sortiert sind. Er hat auch die Möglichkeit, ihm bekannte Links anzumelden. - 12 - Benutzer meldet sich an Existiert Benutzer ? NEIN Fehlermeldung JA Bestätigung Liste aller Foren anzeigen JA Eingabe ok ? NEIN Fehlermeldung Bestätigung der Speicherung Liste aller Fragen und Anzahl der Antworten anzeigen, Formular zur Eingabe einer eigenen Frage anzeigen JA Eingabe ok ? NEIN Fehlermeldung Antwort anzeigen, Formular zur Beantwortung der Frage anzeigen Abbildung 1: Ablauf innerhalb des Diskussionsforums Die Abbildung zeigt den Ablauf des Dienstes „Diskussionsforum“. Es beschreibt die Möglichkeiten die ein Benutzer von seinem Anmelden bis zu seinem Abmelden hat. - 13 - 2.2.3. Struktur Die Struktur einer Internetseite wird als Hierarchie angegeben. In folgenden Schaubildern werden die zwei Extreme der Hierarchie dargestellt: die flache und die tiefe Hierarchie. Abbildung 1 zeigt eine flache Hierarchie, in der alle Links in der ersten Ebene sichtbar sind. Der Nachteil der flachen Hierarchie ist die Unübersichtlichkeit, die bei einer größeren Anzahl von Menüpunkten auftritt. Deswegen empfiehlt sich diese Struktur generell für vier bis acht Menüpunkte. Abbildung 2: Flache Hierarchie einer Internetseite In Abbildung 2 wird die tiefe Hierarchie dargestellt. Jeder Punkt ist einem anderen untergliedert. Der Vorteil der tiefen Hierarchie ist die übersichtliche Gliederung der Menüpunkte. Nachteilig ist allerdings, daß ein Benutzer, der auf eine Information, die weit unten in der Hierarchie gespeichert ist, zugreifen will, viele Menüpunkte passieren muß. Die Tiefe der Ebenen sollte somit nicht größer als vier sein, da sonst die Gefahr besteht, daß der Benutzer lieber die Seite verläßt, anstatt weiter nach der Information zu suchen. Abbildung 3: Tiefe Hierarchie einer Internetseite Idealerweise sollte eine Struktur entstehen, die die beiden oben gezeigten Extreme kombiniert und somit Übersichtlichkeit und schnelle Informationsfindung vereint. Eine solche Struktur wird üblicherweise in drei Schritten gebildet: Erster Schritt: Die Oberbegriffe werden aus dem vorgegebenen Inhalt extrahiert. Aus diesen Oberbegriffen entsteht dann das Hauptmenü. Hierbei ist muß man darauf achten, daß es weder zu wenige, noch zu viele Begriffe sind. Üblicherweise verwendet man zwischen vier und acht Oberbegriffe. - 14 - Zweiter Schritt: Die Unterbegriffe werden den Oberbegriffen zugeordnet. Dritter Schritt: Die Reihenfolge der Unterbegriffe wird durch deren Gewichtung festgelegt. Die in Abbildung 3 dargestellte Struktur ergibt sich aus den angegebenen Inhalten und interaktiven Elementen. Abbildung 4: Struktur des Portals Aus den in Kapitel 2.2.1 gewonnen Inhalte und den interaktiven Elementen aus Kapitel 2.2.2 kann eine Hauptmenü erzeugt werden. Eine Aufteilung in zwei Ebenen ist hierbei sehr günstig, denn innerhalb des Fachbereiches gibt es verschiedene Organisationseinheiten, die eigene Inhalte haben. Des weiteren lassen sich die angebotenen Dienste in einer Ebene darstellen. Die genaue Darstellung wird im folgenden Kapitel zum Thema Design gezeigt. Im Hauptmenü sind die folgenden Punkte 1-4 in einer Ebene und die Punkte 5-8. 1. 2. 3. 4. 5. 6. 7. 8. Fachbereich Professoren Fachschaft Institute Stundenplan Unterlagen Service Links - 15 - 2.2.4. Design Das Design hat das Ziel, die Struktur der Webseite zu unterstützen. Aus diesem Grunde wird eine Dreiteilung der Internetseite vorgenommen. Die drei Hauptteile werden im Folgenden erläutert und in Abbildung 5 dargestellt. Teil 1: Teil 1 ist der Kopf der Internetseite. In ihm werden die acht Hauptmenüpunkte und das Logo dargestellt. Teil 2: Teil 2 beinhaltet das dynamische Untermenü der Internetseite. Teil 3: Teil 3 umfaßt den eigentlichen Inhalt. Teil 1 Teil 2 Teil 3 Abbildung 5: Dreiteilung der Internetseite zur Strukturunterstützung Im ersten Teil erfolgt eine Zerlegung des Kopfes der Seite in das Logo und das Hauptmenü. Das Hauptmenü wird wiederum in die organisatorische Ebene und die Dienstebene untergliedert. Logo Fachbereich Professoren Fachschaft Stundenplan Unterlagen Service Institute Links Organisationseinheiten Dienste Abbildung 6: Struktur des Hauptmenüs - 16 - Das Untermenü wird im zweiten Teil dargestellt. Das Untermenü weist als Überschrift die entsprechende Zuordnung der Kategorie auf. Unter der Überschrift werden die jeweiligen einzelnen Unterpunkte in alphabetischer Reihenfolge aufgelistet. Besonderes Merkmal dieses Untermenüs ist seine Dynamik, d.h. daß neu hinzugefügte Seiten automatisch als neuer Unterpunkt in das Menü aufgenommen und angezeigt werden. Innerhalb des dritten Teils werden die eigentlichen Informationen Internetseite abgebildet. Diese Informationen können sowohl in Form von Texten, als auch von Grafiken, dargestellt werden. Das Design der Informationen hängt im Wesentlichen von ihrem Inhalt ab. - 17 - 3. Internetanwendungen 3.1. N-Tier-Architekturen Eine N-Tier-Architektur9 (N-Ebenen-Architektur) ist eine Architektur, die in N Ebenen aufgeteilt ist. Die Ebenenbildung geschieht durch die Trennung der verschiedenen Aufgaben einer Anwendung, wobei dann im Idealfall jede Aufgabe seine eigene Ebene bekommt. Eine Anwendung läßt sich im Regelfall in die Aufgaben Präsentation, Anwendungslogik und Datenhaltung trennen. Eine Internetanwendung ist immer eine Architektur mit mehreren Ebenen. Im einfachsten Fall handelt es sich um eine 2-Tier-Architektur. Im Folgenden wird nun dargestellt, wie die derzeit eingesetzten Architekturen für Internetanwendungen diese Aufgaben verteilen. 3.1.1. 2-Tier-Architektur Die typische 2-Tier-Architektur stellt die Client-Server-Architektur dar. Der Client übernimmt in dieser Architektur die Präsentation der Aufgaben und der Server bietet die Anwendungslogik und die Datenhaltung. Tier 1: Präsentationsebene Tier 2: Anwendung und Daten Abbildung 7: 2-Tier Architektur [EF00] 9 Das englische Wort Tier bedeutet übersetzt Ebene/ Stufe. Somit werden Architekturen, die in mehrere Ebenen eingeteilt sind als n-Tier-Architekturen bezeichnet. - 18 - 3.1.2. 3-Tier-Architektur Die 3-Tier Architektur verteilt die Aufgaben der Präsentation, Anwendungslogik und der Datenhaltung in jeweils eigene Ebenen. Auf dem Client sorgt ein Browser für die Präsentation der Daten. Ein Web- oder Applikationsserver bietet die Verarbeitung der Anwendungslogik und ein Datenbankserver übernimmt die Datenhaltung. Dies ist die gängigste Form bei Internetanwendungen. Tier 1: Präsentation Tier 2: Anwendung Tier 3: Datenbanken Abbildung 8: 3-Tier-Architektur [EF00] 3.1.3. 4-Tier-Architektur Bei der 4-Tier-Architektur teilt man die Anwendung weiter auf. Man unterscheidet hierbei zwischen Serverschnittstelle (Web-Server) und Anwendungslogik. Da die Serverschnittstelle jetzt als zusätzliche Aufgabe zu verstehen ist, wird die Schnittstelle in eine eigene Ebene eingegliedert. Tier 1: Präsentation Tier 2: Web-Server Tier 3: Anwendung Tier 4: Datenbanken Abbildung 9: 4-Tier-Architektur [EF00] - 19 - 3.2. Serverseitige Programmiertechniken Um Internetanwendungen erstellen zu können, reicht die ursprüngliche Technik zur Darstellung von Information, die Hypertext Markup Language (Html), nicht aus. Denn Html selbst ist keine Programmiersprache, mit ihr sind lediglich Layoutinformationen und Verknüpfungen von Informationen möglich. Die Informationsverarbeitung und Sicherung muß daher mit anderen Techniken vorgenommen werden. Diese Aufgaben werden wie im Kapitel 3.1 beschrieben auf Seiten des Servers ausgeführt. Aus diesem Grunde werden hier verschiedene Programmiertechniken angesprochen, die eine serverseitige Anwendungsentwicklung unterstützen. Die Präsentation auf dem Client wird mit Html beschrieben, denn Html hat sich als Darstellungssprache bewährt und ist am weitesten verbreitet. Es unterstützt die Verarbeitung von Daten nur indirekt, indem es die Darstellung von Formularen erlaubt. In diese kann der Benutzer seine Daten eingeben und der Browser, das Programm, das die Html-Seiten anzeigt, überträgt die Daten dann über das Internet an eine Internetanwendung. Die Daten werden als key-value-Paar übertragen. Key-value –Paar bedeutet, daß jedes Eingabefeld im Formular einen Schlüssel (key) und einen Wert (Value), der eingegeben wird, hat. Die Internetanwendung erhält eine Zeichenkette, die sich nach dem folgenden Muster aufbaut: key1=value1&key2=value2&key3=... Name=Billmann Vorname=Andreas ... Client: Ein Formular wird in der Html-Seite dargestellt. Die Formulardaten werden als key-valuePaar übertragen. Internetanwendung: Die Daten werden verarbeitet Abbildung 10: Formulardaten werden versandt und verarbeitet. Die Internetanwendung verarbeitet die gesandten Daten, (Speicherung, Berechnung, etc.) und generiert eine neue Html-Seite, die an den Client zurückgesandt wird. Die meisten Anwendungen bestehen nicht nur aus einem einzigen Schritt, sondern aus einer Abfolge mehrerer Ein- und Ausgaben. Die Gliederung und Aufreihung der Abfolgen stellen einen Ablauf dar. Da die Internetanwendung nicht nur Html zur Darstellung, sondern auch noch ein neues Formular erzeugt, kann dieser Ablauf abgearbeitet werden. - 20 - <html> <head> </head> <body> … Client: Html-Seite wird dargestellt. Es wird nur eine Html-Seite an den Client zurückgesandt. Internetanwendung Eine neue HtmlSeite wird generiert. Abbildung 11: Neue Html-Seite wird generiert und zurückgesandt. Nachfolgend werden einige Techniken vorgestellt, die genau diese Abläufe unterstützen und die sich für die Entwicklung von Internetanwendungen anbieten. 3.2.1. Common Gateway Interface (CGI) „Das Common Gateway Interface (CGI) ist eine Schnittstelle zu dem Web-Server, die es ermöglicht, die Funktionalität des Servers zu erweitern.“10 Das Common Gateway Interface ist wohl die bekannteste Möglichkeit, Webseiten Interaktivität zu verleihen. Jedes ausführbare Programm kann als CGI dienen, somit gibt es hier keine Beschränkung auf eine bestimmte Programmiersprache. Die Programmiersprache muß nur einigen Mindestanforderungen genügen. Sie muß: • in die Standardausgabe schreiben, • von der Standardeingabe lesen, • Umgebungsvariablen einlesen können. Als CGI Programme eignen sich sowohl klassische, kompilierte Programmiersprachen, wie C, als auch interpretierbare Programmiersprechen wie Perl oder TCL. Zu den Vorteilen von CGI zählen die weite Verbreitung des Systems11, die einfache Schnittstelle und die Programmiersprachenunabhängigkeit. Aus diesen Gründen können CGI-Anwendungen leicht auf verschiedene Webserver portiert werden. 10 11 [K97, S. 27] Es gibt kaum einen Webserver, der nicht das CGI anbietet. - 21 - Bei den CGI-Programmen sind jedoch die Nachteile so gravierend, daß sie heute nicht mehr zur Realisierung großer Anwendungen eingesetzt werden. Der entscheidendste Nachteil ist, daß ein CGI-Programm als eigenständiger Prozess ausgeführt wird. Der mit jeder Anfrage einhergehende Verbrauch von Betriebssystemressourcen kann sich zudem negativ auf die Serververfügbarkeit auswirken. „Die Konsequenzen können erdrückend sein: Stellen Sie sich einen gutbesuchten Server vor, dessen Hauptattraktion eine Anwendung ist, die über CGI gestartet wird. Nehmen wir an, diese Anwendung ist aufwendig und benötigt zur Ausführung fünf Sekunden auf einem unbelasteten System. Was passiert, wenn in einer Minute tausend Anfragen auf diesen Rechner einprasseln, dürfte klar sein.“12 Einem CGI-Programm ist es auch nicht möglich, auf Interna des Webservers zuzugreifen. Hier seien nur kurz die Zugangskontrolle und die Authentifizierung erwähnt. 3.2.2. Webserver-APIs Aufgrund dieser Defizite der CGI-Programme wurden die Webserver-APIs entwickelt. Die Application Programming Interfaces (APIs) zeichnen sich dadurch aus, daß sie dynamisch geladen werden. Es handelt sich hierbei um Bibliotheken, die, ab dem Moment, an in dem sie geladen wurden, für weitere Anfragen im Speicher bleiben. Durch die Tatsache, daß die APIs im gleichen Adreßraum wie die Webserver arbeiten, kann auf die Ressourcen des Webservers zugegriffen werden und die Performance wird gesteigert. Aufgrund dieser Vorteile eignen sich die APIs besonders zur Programmierung komplexer Anwendungen. Die Vorteile, die das CGI bot, werden bei den APIs allerdings zu Nachteilen. Die komplexen und unterschiedlichen Schnittstellen haben zur Folge, daß die Programmierung der Anwendung komplizierter und eine leichte Portierbarkeit auch nicht gewährleistet wird. Es ist nun auch möglich, den Webserver durch unsaubere Programmierung zum Absturz zu bringen. Die Programmiersprachenunabhängigkeit ist auch nicht mehr gewährleistet, sondern hängt von der eingesetzten API ab. 12 [RS00, S. 6] - 22 - 3.2.3. Servlets Die Servlet API von SUN Microsystems ist die Grundlage für Java Servlets. Diese Schnittstelle ermöglicht es, serverseitige Java-Anwendungen zu entwickeln. Es gibt sehr viele kommerzielle Programme, die entweder die Servlet API von SUN implementiert haben, oder die eine eigene API zum Ausführen von Servlets programmiert haben. Deshalb besteht eigentlich für jeden Webserver auf jedem Betriebssystem die Möglichkeit, Servlets als Programmiertechnik anzubieten. Java bietet sich an dieser Stelle aus mehreren Gründen zur Anwendungsentwicklung an. Durch die Betriebsystemunabhängigkeit ist eine einfache Portierung der Anwendung auf verschiedene Webserver und auch Betriebssysteme gewährleistet. Ein weiterer Vorteil ist das Fehlen von Zeigern. Denn eine unsaubere Programmierung mit Zeigern ist die Hauptursache für kritische Abstürze der Anwendung und meist auch des Webservers. Der Lebenszyklus eines Servlets wird in der Abbildung 12: Lebenszyklus eines Servlet-Objektes dargestellt. Das Interessante an diesem Lebenszyklus ist, daß es vorgesehen ist, ein Servlet erst einmal für weitere Anfragen am Leben zu erhalten. Das Servlet besitzt eine Initialisierungsmethode, die nur einmal, nach dem Laden der Servlet-Klasse und der Erzeugung eines Objektes, aufgerufen wird. In dieser Methode werden Variablen initialisiert, die sich nicht mehr ändern, beispielsweise Zuweisung einer Datenbankverbindung oder Werte die aus einer Property-Datei ausgelesen werden soll. Weitere Variablen die in der Initialisierungsmethode häufig gesetzt werden sind Counter. Nach der Initialisierung wird eine ServletInstanz ausgewählt, denn es können natürlich auch mehrere Instanzen existieren. Von der ausgewählten Instanz wird die Servicemethode aufgerufen, welches die Abarbeitung des Servletcodes zur Folge hat. Die vom Servlet generierte Antwort wird an den Client gesandt. Nun wird das Objekt für eine in der Serverkonfiguration angegebene Dauer im Speicher gehalten. Sobald eine neue Anfrage an dieses Servlet gestellt wird, überprüft der Server, ob noch eine Instanz der Servlet-Klasse im Speicher ist. Ist dies der Fall, dann wird eine ausgewählt und wieder die Servicemethode aufgerufen. Sollte keine Instanz im Speicher existieren, dann wird die Servlet-Klasse wieder geladen und der oben vorgestellte Ablauf beginnt von neuem. Der Vorteil dieses Lebenszyklus ist eindeutig die Steigerung der Performance, denn Servlets die häufig angefragt werden bleiben fast immer im Speicher und stehen damit sofort zur Abarbeitung zur Verfügung. Deshalb wird versucht bei der Programmierung von Servlets nur ein Servlet zu programmieren, das mit Hilfe - 23 - von Parametern den Workflow realisiert und intern verschiedene Objekte zur Abarbeitung des Workflows erstellt. Diese Technik wird in Kapitel 4.3.4 näher vorgestellt. Anfrage an ein Servlet Existiert eine Instanz ? Laden der ServletKlasse Erzeugen eines Objektes und Aufruf der Methode init() Auswahl einer Servlet-Instanz Aufruf der Methode service() Abarbeitung der Methode und versenden der generierten Antwort an den Client Neue Anfrage Innerhalb des Timeouts? Aufruf der Methode destroy() Abbildung 12: Lebenszyklus eines Servlet-Objektes Die Verarbeitung der Anfrage des Clients und die Generierung einer Antwort wird im Kapitel 4.3.3 erläutert. 3.2.4. Java Server Pages (JSP) Eine neue Entwicklung im Bereich serverseitige Javaanwendungen hat SUN mit den Java Server Pages geschaffen. Im Unterschied zu den Servlets wird hier der Javacode in die Html-Seite eingebettet. - 24 - Dies ist vor allem dann ein Vorteil, wenn die Gestaltung der einzelnen Seiten von einem Designer vorgenommen werden soll, und wenn viele unterschiedliche Darstellungen auf den Seiten benötigt werden. Die Anwendungslogik wird im idealen Fall in JavaBeans gekapselt und der Designer muß neben seinen HtmlKenntnissen nur wissen, wie er an die Daten der Beans kommt. Durch die Tatsache, daß man in JSP eigene Tags definieren kann, kann man die Anforderung und die Speicherung der Daten aus bzw. in einem Bean in einer dem Designer vertrauten Technik anbieten. Der Designer benutzt diese Tags wie die Html-Tags, die er kennt. Dieses Konzept wird auch von anderen serverseitigen Skriptsprachen wie PHP oder ASP verwendet. Ein Nachteil bei serverseitigen Skriptsprachen ist die Performance, denn der Quellcode muß zur Laufzeit interpretiert werden. Die Java Server Pages gehen da einen anderen Weg, sie werden beim ersten Aufruf in Bytecode kompiliert und stehen dann als Servlet zur Verfügung. Und nur wenn der Code geändert wird, wird wieder neu übersetzt. So machen sich die Java Server Pages die Vorteil der höheren Performance kompilierter Programme zu nutzen. In der neueren Entwicklung wird diese Technik auch in anderen Programmiersprachen verwendet. 3.2.5. Vergleich der Techniken Die Tabelle stellt einen Vergleich der Techniken bezüglich Portierbarkeit, Performance und Programmierung dar. Die Programmierung wird hierbei unterteilt in die Programmierung der Präsentationsschicht und der Anwendungsschicht. Programmierung Programmierung (Präsentation) (Anwendungslogik) Portierbarkeit Performance Common Gateway Interface hoch niedrig komplex komplex Server-APIs niedrig hoch komplex komplex Servlets hoch hoch komplex komplex Java Server Pages hoch hoch einfach komplex Abbildung 13: Vergleich der serverseitigen Programmiertechniken Ein Vergleich der Techniken zeigt, daß der Einsatz von Servlets oder Java Server Pages zu bevorzugen ist. Im folgenden Kapitel wird die Auswahl der im Portal des Fachbereichs eingesetzten Technik begründet und festgelegt. - 25 - 3.3. Begründung der Auswahl der Techniken zur Portalimplementierung Die Implementierung des Portals stützt sich auf die 3-Tier-Architektur. Da die 3Tier-Architektur am weitesten verbreitet ist, sind die benötigten Komponenten, (Browser, Web-Server und Datenbank) überall vorhanden. Im Gegensatz dazu wird für die 4-Tier-Architektur noch zusätzlich ein Applikationsserver benötigt. Obwohl derzeit sehr viele Applikationsserver entwickelt werden, konnte sich in diesem Bereich noch keine konkrete Technik (Corba, EJB etc.) durchsetzen. Somit ist eine spätere Neuprogrammierung des Portals nicht ausgeschlossen. Um einen späteren Austausch der Komponenten (Browser, Web-Server und Datenbank)zu ermöglichen, ist die Anwendung in sich durch ein Mehrschichtenmodell unterteilt. Dieses Mehrschichtenmodell separiert die Anwendung in Präsentationsschicht , Geschäftslogik und Zugriffsschicht. Dies entspricht der Einteilung der 3-Tier-Architektur dahingehend, daß die Präsentations- und die Zugriffsschicht die Schnittstellen zur Präsentations- und Datenhaltungsebene bilden. Auf die einzelnen Schichten wird im Rahmen von Kapitel 4 näher eingegangen. Das Portal ist in Java als Servlet programmiert, um eine einfache Portierung zu ermöglichen. Diese einfache Portierung ist sehr wichtig, da der Web-Server und das Betriebssystem, auf dem das Portal installiert werden soll, noch nicht bekannt sind bzw. sich auch zu einem späteren Zeitpunkt noch ändern können. Durch die JDBC-Schnittstelle bietet Java außerdem eine elegante Möglichkeit, die Unabhängigkeit von Datenbankmanagementsystemen in der Zugriffsschicht zu erreichen. Des weiteren bietet Java die Unterstützung moderner Programmier- und Webtechniken (Komponentenmodell, Corba, EJB etc.). Die Implementierung des Portals in Java Server Pages bietet sich in diesem Fall nicht an, da sie eine hohe Disziplin des Entwicklers voraussetzt. Denn hier besteht die Gefahr, daß bei einer Weiterentwicklung des Systems die Trennung der Präsentationsschicht und der Anwendungsschicht aufgehoben wird. - 26 - 4. Java 4.1. Allgemeine Grundlagen von Java Die Servlets, deren Verwendung in Kapitel 3.2.5 begründet und beschlossen wurde, werden in Java programmiert. Um die Grundlagen der Programmiersprache Java näher vorzustellen, werden die Anforderungen an Java und die Java Architektur in den folgenden Kapiteln beschrieben. 4.1.1. Grundlegende Anforderungen bei der Entwicklung von Java SUN Microsystems hatte ursprünglich die Idee, JAVA als eine Programmiersprache zu konzipieren, die für die Entwicklung von Programmen für Kleingeräte (Toaster, Videorecorder etc.) eingesetzt wird. Die Programme sollten folgenden Anforderungen genügen: • geringe Größe der Programme: Es sollten kleine Programme entwickelt werden, da Kleingeräte wie Toaster o.ä. nur über sehr begrenzte Speicherkapazitäten verfügen. • Portabilität: Die Programme sollten auch mit den verschiedenen Chips der Gerätehersteller kompatibel sind, ohne daß sie neu übersetzt werden müssen. • Robustheit: Es soll ausgeschlossen werden, daß die Kleingeräte aufgrund von Programmabstürzen ausfallen. Wegen der rasanten Entwicklung des World Wide Webs und der geringeren Nachfrage nach Java als Programmiersprache für Kleingeräte änderte SUN Microsystems die Strategie für Java. Es stellte sich heraus, daß sich Java aufgrund der ursprünglichen Anforderungen an die Sprache insbesondere für verteilte Anwendungen im Web (Applet) eignet. „Ein Applet kann damit als eine neue Art von Binärprogramm angesehen werden, das über verschiedene Hardware- und Betriebssystemplattformen hinweg portabel ist und auf einfache Weise im Internet verteilt werden kann.“13 Aufgrund der geringen Größe von Javaprogrammen ist die Verteilung der Anwendung über das World Wide Web in einer für den Benutzer akzeptablen Zeit möglich. Da das World Wide Web von Betriebssystemen unabhängig ist, kann nicht klar festgelegt werden, über welches Betriebssystem der einzelne Benutzer verfügt. Um zu garantieren, daß verteilte Programme trotz dieser Problematik 13 [K00, S. 31] - 27 - funktionieren, ohne mehrere, auf die verschiedenen Betriebssysteme individuell zugeschnittene Versionen eines Programms entwickeln zu müssen, müssen die verteilten Programme portierbar sein. Da Java die Anforderung der Portierbarkeit auch schon auf Chipebene unterstützt, wurde es um die Fähigkeit der Betriebssystemunabhängigkeit erweitert. Derzeit entwickelt SUN Microsystems ein reines Javabetriebssystem, das in der Lage sein soll, die optimale Ressourcenverteilung selbst vorzunehmen. Diese zusätzliche Fähigkeit würde die Performance weiter zu erhöhen. Das World Wide Web beinhaltet die Gefahr, daß Programme aus dem World Wide Web, die in der Lage sind, sich selbst zu starten, private Daten der Benutzer lesen oder gar bearbeiten. Diese Gefahr stellt eine Bedrohung für die Privatsphäre und die Persönlichkeitsrechte der Benutzer dar. Sie würde somit den Datenschutz außer Kraft setzen und alle Benutzer auf lange Sicht zu „gläsernen“ Menschen machen. Um diese Gefahr auszuschalten, wurde die Programmiersprache Java zusätzlich zur Robustheit um die Anforderung der Sicherheit erweitert. Die Robustheit wurde mit dem Sicherheitskonzept kombiniert. Beide Anforderungen wurden durch das Sandkastenprinzip abgedeckt. Unter dem Sandkastenprinzip versteht man die Kapselung des Programms in einem eigenen Prozeß, aus welchem es nicht auf andere Bereiche (Speicher, Festplatten u.v.m.) zugreifen kann. Wenn nun ein Fehler im Programm auftauchen sollte, wird das Betriebssystem davon nicht beeinträchtigt, es wird lediglich der Prozeß des Programms gestoppt. Dies ist bei Programmen, die in anderen Programmiersprachen erstellt wurde, leider nicht der Fall. Das am häufigsten auftretende Problem ist eine fehlerhafte Programmierung der Zeiger auf Speicherbereiche. Wenn die Zeiger nicht mit ausreichender Sorgfalt programmiert werden, besteht leicht die Gefahr, daß Speicherbereiche, die für andere Programme gedacht waren, überschrieben werden. Im schlimmsten Fall sind dies die Speicherbereiche für die Betriebssystemfunktionen. Aus diesem Grund wird in Java nicht mit Zeigern programmiert. Java ist selbst für die Verwaltung des Speicherplatzes verantwortlich und übernimmt alle Funktionen, die zuvor der Entwickler ausführen mußte. Im Laufe der Zeit zeigte sich, daß Java nicht nur für die Applets geeignet ist, sondern man mit Java auch „richtige“ Anwendungen programmieren kann. Um die Entwicklung von Applikationen zu unterstützen, werden die Grundfunktionalitäten durch weitere dynamisch verfügbare Bibliotheken erweitert. Beispielsweise wurde die Bibliothek zur Programmierung von grafischen Oberflächen recht früh in die Standardbibliotheken von Java eingefügt. Mittlerweile hat man das Konzept der Bibliothek zur Programmierung von grafischen Oberflächen um eine neue Bibliothek (Swing Bibliothek) erweitert. Die Standardbibliotheken umfassen in der Zwischenzeit alle Dienste, die bei der Programmierung von Applikationen benötigt werden (Datenbankzugriff, Netzwerkzugriff, uvm.). Zusätzlich zu den - 28 - Standardbibliotheken sind spezialisierte Bibliotheken (Servlets, Mail, uvm.) von SUN Microsystems oder einem Drittanbieter erhältlich. 4.1.2. Java Architektur Die Java Architektur wird prinzipiell in zwei Teile aufgeteilt: die Java Virtual Machine und das Java Application Programming Interface (API). Die Basis der Ausführung von Javaprogrammen bildet die Java Virtual Machine. Der Quellcode von Java wird von einem Javacompiler in den sogenannten Bytecode übersetzt. Bei der Ausführung des Programms interpretiert die Java Virtual Machine den Bytecode. Der Unterschied, der dieses Konzept grundlegend von den anderen Compilersprachen wie C oder C++ trennt, ist die Tatsache, daß der Javacompiler den Quellcode nicht direkt in Maschinencode übersetzt. Dies hat den Vorteil, daß das Programm portierbar ist. Die Anforderung der Portierbarkeit wurde bereits in Kapitel 4.1.1. angesprochen. Während Maschinencode von dem Betriebssystem und der Maschine abhängig ist, wird der Bytecode erst zur Laufzeit für ein spezielles Betriebssystem umgesetzt. Somit ist die alleinige Prämisse, die an ein System gestellt werden muß, das Vorhandensein einer Java Virtual Machine. Da interpretierbare Sprachen wie Perl oder Basic schon länger existieren, stellt sich die Frage, worin der Unterschied zwischen Java und diesen Sprachen liegt. Ein allgemeiner Nachteil der interpretierbare Sprachen ist die Tatsache, daß sie eine geringere Performance als Compilersprachen haben. Die Ursache dieses Problems ist, daß eine Syntaxüberprüfung des Quellcodes erst zur Laufzeit vorgenommen wird und dadurch die Ausführgeschwindigkeit des Programms erheblich reduziert wird. Im Gegensatz dazu entfällt bei Java die Syntaxüberprüfung zur Laufzeit, da diese schon bei der Übersetzung des Quellcodes in den Bytecode durchgeführt wurde. Außerdem ist der Quellcode der interpretierbaren Sprachen unkomprimiert, was zu einer erhöhten Komplexität bei der Findung von Tokens führt. Während die Java Virtual Machine die Abstraktion vom Betriebsystem übernimmt, abstrahiert das API von verschiedenen Diensten des jeweiligen Betriebsystems. Beispielsweise werden in der Bibliothek „java.awt“ 14Klassen zur Programmierung von grafischen Oberflächen bereitgestellt. Die Klassen der Bibliothek kümmern sich um die spezifische Umsetzung der Oberfläche auf dem jeweiligen Betriebsystem. So findet sich für jeden Dienst, den ein Betriebsystem bietet, eine entsprechende Bibliothek, die diesen Dienst abstrahiert. Ein Entwickler muß sich daher auch nur mit den Programmierkonzepten von Java auseinandersetzen und nicht mit den verschiedenen Konzepten der einzelnen Betriebsysteme. Dies verkürzt die Entwicklungszeit von Programmen, die auf verschiedenen Betriebsystemen laufen sollen, erheblich und schafft durch ein größeres Detailwissen in einer Konzeption eine höhere Stabilität der Programme. 14 Der Begriff „Klasse“ wird in Kapitel 4.2.1 näher erläutert. - 29 - Ein weiterer Vorteil der Abstraktion ist, daß sich ein Entwickler auf das Wesentliche, nämlich die Funktionalität seiner Anwendung, konzentrieren kann. Applets und Applications Java Base API Java Standard Extension API Java Base Classes Java Standard Extension Classes Java Virtual Machine Porting Interface Adapter Adapter Adapter JavaOS Browser OS OS OS Hardware Hardware Hardware Java on a Browser Java on a desktop OS Java on a smaller OS Hardware Java on JavaOS Network Abbildung 14: Java Base Platform [DS00] Die Abbildung stellt das zugrundeliegende System, auf dem eine Javaanwendung ausgeführt werden soll, weiß dar. Die dunklen Bereiche zeigen das Basissystem, das zum Ausführen der Anwendung benötigt wird. Die hellgrauen Adapter stellen die Verbindung zwischen dem System und der Java Virtual Machine her. Interessant ist hierbei, daß das Javabetriebsystem keinen Adapter benötigt. 4.2. Objektorientierte Konzepte von Java Da es sich bei Java um eine objektorientierte Programmiersprache handelt, werden hier die wichtigsten objektorientierten Konzepte von Java vorgestellt. Im Regelfall besteht eine Internetanwendung aus vielen einzelnen Teilen, deshalb ist besonders der Einsatz der Abstraktion als grundlegendes Konzept gegeben. In der Implementierung spielen vor allem das Konzept der Beziehungen, der Polymorphismus und der Einsatz abstrakter Klassen, eine wichtige Rolle. Der Einsatz dieser Konzepte wird in den einzelnen Kapiteln zu dem Thema Anwendungsschichten gezeigt. - 30 - 4.2.1. Abstraktion Als Abstraktion bezeichnet man in der objektorientierten Programmierung die Trennung zwischen dem Konzept und der Umsetzung einer Sache. In dem Konzept wird der Aufbau und die Funktionsweise einer Sache festgelegt. Die Umsetzung ist dann die reale Sache, die auf Basis des Konzepts erzeugt wird. In der Softwareentwicklung nennt man das Konzept eine Klasse und die Umsetzung ist ein Objekt von einer Klasse. Das folgende Beispiel verdeutlicht die Abstraktion. Der Konstruktionsplan eines Autos ist ein Konzept. Wenn nun ein Auto nach diesem Konzept gebaut wird, dann ist der Aufbau und die Funktionsweise des Autos festgelegt. Nach dem Konstruktionsplan kann man aber nicht nur ein Auto, sondern beliebig viele Autos herstellen. Ein weiterer Vorteil ist, daß ein Autofahrer der ein Auto, das nach diesem Konstruktionsplan gebaut wurde, fährt und sich nach einiger Zeit ein neues Auto, das nach dem gleichen Konstruktionsplan gebaut wurde kauft, kann er sich sicher sein, daß das Auto genau so zu fahren ist wie sein erstes . 4.2.2. Kapselung „In objektorientierten Programmiersprachen wird eine Klasse durch die Zusammenfassung einer Menge von Daten und darauf operierender Funktionen (die nun Methoden genannt werden) definiert.“15 Die Daten werden im Folgenden Membervariablen genannt und repräsentieren den Zustand eines Objekts. Der Zustand eines Objekts kann bei jeder Instanz einer Klasse unterschiedlich sein. Beispielsweise ist die Farbe (Membervariable) des Autos grün (Zustand des Objektes Auto). Die Methoden repräsentieren das Verhalten des Objekts. Im Beispiel sind die verschiedenen Verhaltensformen des Objekts Auto „fahren“, „bremsen“, „stehen“ etc. 4.2.3. Wiederverwendung Mit Hilfe der Bildung von Klassen soll eine Wiederverwendung bereits bestehender Softwareelemente ermöglicht werden. Jede Klasse ist somit ein kleiner Teil einer großen Gesamtheit. Beispielsweise kann eine Klasse Adresse, die in der Programmierung einer Buchhaltungssoftware verwendet wird, somit auch in der Programmierung einer Adreßverwaltung benutzt werden. Dies hat zur Folge, daß ein Objekt, das auf der Klasse Adresse aus der Buchhaltungssoftware basiert, ebenfalls in der Adreßverwaltung verwendet wird. Dies ist nur aufgrund 15 [K00, S. 127] - 31 - der Tatsache möglich, daß beide Anwendungen den Aufbau des Objekts kennen, da sie die gleiche Klasse als „Konstruktionsplan“ verwenden. 4.2.4. Beziehungen Zwischen Klassen und Objekten bestehen in der Regel Beziehungen. Im Rahmen der objektorientierten Softwareentwicklung unterscheidet man prinzipiell drei Grundtypen von Beziehungen: • „is-a“-Beziehungen „is-a“-Beziehungen umfassen sowohl eine Generalisierung, als auch eine Spezialisierung. Die Beziehungsaussage „Ein Auto ist ein Kraftfahrzeug.“ stellt also einerseits eine Generalisierung dar, indem das Auto als Teil der Kraftfahrzeuge (wie z.B. auch Motorräder) charakterisiert wird, andererseits erfolgt auch eine Spezialisierung der Kraftfahrzeuge auf das Auto. • „part-of“- Beziehungen Eine „part-of“-Beziehung bezeichnet entweder eine Aggregation, oder eine Komposition. Unter einer Aggregation versteht man den Vorgang, daß ein Objekt ein anderes Objekt in sich aufnimmt, aber auch ohne das andere Objekt existieren kann. Beispielsweise kann ein Auto eine Person aufnehmen, die komplette Funktionsfähigkeit des Auto ist aber auch ohne Insasse gegeben. Die Komposition hingegen umfaßt die Tatsache, daß ein Objekt aus anderen zusammengesetzt ist. Ein Auto besteht aus einer Karosserie, vier Rädern, einem Motor usw. Wenn bei der Komposition ein Objekt fehlt, ist das Auto nicht mehr voll funktionsfähig. Somit kann man die Komposition als strengere Form der Aggregation sehen, da sie eine existenzielle Abhängigkeit des umfassenden Objekts von seinen Objektelementen darstellt. • Verwendungs- oder Aufrufbeziehungen Die Verwendungs- oder Aufrufbeziehung beschreibt ein Objekt, das ein anderes Objekt zeitlich begrenzt benutzt. „Herr Müller benutzt das Auto.“ ist ein Beispiel hierfür. Herr Müller beginnt beim Einstieg in das Auto mit der Benutzung, die mit seinem Ausstieg beendet wird. 4.2.5. Vererbung „>>is-a<< -Beziehungen werden in objektorientierten Programmiersprachen durch Vererbung ausgedrückt. Eine Klasse wird dabei nicht komplett neu definiert, sondern von einer anderen Klasse abgeleitet. In diesem Fall erbt sie alle Eigenschaften dieser Klasse und kann nach Belieben eigene hinzufügen.“16 16 [K00, S. 129] - 32 - Allerdings ist beim Prinzip der Vererbung eine Besonderheit zu beachten. Sowohl die Variablen, als auch die Methoden werden mit einer Eigenschaft, die man Sichtbarkeit nennt, belegt. Die Sichtbarkeit bestimmt, wer auf welche Variablen und Methoden zugreifen darf. Man unterscheidet in Bezug auf die Sichtbarkeit prinzipiell drei Möglichkeiten: • Eine Variable oder eine Methode ist als öffentlich (public) deklariert. Sie ist dann in der Klasse selbst, in abgeleiteter Klassen und in externen Klassen sichtbar. • Eine Variable oder Methode ist als geschützt (protected) deklariert. Sie ist nur in der Klasse selbst, in den abgeleiteten Klasse und in Klassen, die zum selben Paket gehört, sichtbar. • Eine Variable oder Methode ist als privat (private) deklariert. Sie ist nur für die Klasse selbst sichtbar. Standardmäßig wird eine Variable oder Methode ohne explizite Deklaration der Sichtbarkeit als protected eingestuft. 4.2.6. Polymorphismus Unter Polymorphismus versteht man die Möglichkeit, daß eine Variable, die zum Speichern von Objekten des Typs A deklariert wurde, sowohl ein Objekt vom Typ A aufnehmen kann, als auch ein Objekt B, das von einer abgeleiteten Klasse von A erstellt wurde. So kann die Variable KFZ, die vom Typ Kraftfahrzeug ist, nicht nur ein allgemeines Objekt vom Typ Kraftfahrzeug aufnehmen, sondern auch ein Objekt Auto, dessen Klasse aus Kraftfahrzeug abgeleitet wurde. Eine konkrete Anwendung des Prinzips des Polymorphismus wird in Kapitel 5.3.5 näher beschrieben. 4.2.7. Statische Elemente Die bisherige Betrachtung beschränkte sich auf Instanzen von Klassen. Diese Instanzen umfassen Membervariablen und Methoden. Allerdings existieren auch Anwendungsfälle, bei denen es sinnvoll ist, Eigenschaften, die nicht zu der Instanz einer Klasse gehören, zu verwenden. Diese Eigenschaften sind Variablen oder Methoden und werden als Klassenvariablen oder Klassenmethoden bezeichnet. Sie können unabhängig von der Instanz einer Klasse verwendet werden. - 33 - Wenn die Instanzen einer Klasse auf eine Klassenvariable zugreifen, erfolgt dieser Zugriff auf die gleiche Klassenvariable. Das bedeutet, daß eine Änderung des Wertes der Klassenvariable durch eine Instanz für allen anderen Instanzen gilt. Die Klassenmethoden werden häufig zur Erzeugung eines Objektes verwendet. Die Entwurfsmuster Finder und Factory bauen auf den Klassenmethoden auf und werden in Kapitel 5.2.4 näher beschrieben. 4.2.8. Schnittstelle „ Die Schnittstelle (interface) definiert die Merkmale eines Systems, wie sie von einem anderen System aus gesehen werden. So definiert eine Komponentenschnittstelle die Methoden und Eigenschaften (Felder), die vom Klienten der Komponente benutzt werden können.“17 In einer Schnittstelle wird festgelegt, welche Methoden ein Entwickler in eine Klasse implementieren muß, wenn er erreichen will, daß die Klasse die Schnittstelle benutzt. Der daraus resultierende Vorteil ist, daß ein Entwickler die Methoden einer Klasse, die er benutzen will, kennt, wenn er die Struktur der Schnittstelle kennt. Als Beispiel wird hier die Java Database Connectivity (JDBC) Schnittstelle18 erläutert. In einer Treiberklasse, die die JDBC-Schnittstelle implementiert, müssen alle in der Schnittstelle angegeben Methoden programmiert sein. Ein Entwickler, der nun über diese Treiberklasse auf eine Datenbank zugreifen will, kann sicher sein, daß in der Klasse eine Methode getConnection( ) existiert, mit der er den Datenbankzugriff erreichen kann, da die Methode in der Schnittstelle definiert wurde. 4.2.9. Abstrakte Klassen Abstrakte Klassen umfassen mindestens eine abstrakte Methode, was bedeutet, daß diese Methode nicht in der Klasse implementiert ist. Dies hat zur Folge, daß keine Instanz von dieser Klasse erzeugt werden kann. Die Klassen, die von einer abstrakten Klasse erben, müssen die abstrakten Methoden implementieren. Wenn diese Implementierung nicht erfolgt, werden sie selbst auch als abstrakte Klassen bezeichnet. Dieser Vorgang kann sich über mehrere Ebenen der Vererbungshierarchie fortsetzen, bis alle abstrakten Methoden implementiert wurden. 17 18 [DS00, S.441] Die Funktionsweise der JDBC-Schnittstelle wird in Kapitel 5.1.3 näher erläutert. - 34 - Abstrakte Klassen werden verwendet, um die Gemeinsamkeiten ähnlicher Klassen zusammenzufassen und teilweise zu implementieren. In Kapitel 5.3.5.wird die abstrakte Klassen am Beispiel der Klasse Screen weiter verdeutlicht. 4.2.10. Entwurfsmuster „Ein Entwurfsmuster benennt, abstrahiert und identifiziert die relevanten Aspekte einer allgemeinen Entwurfsstruktur. Diese Aspekte beschreiben, warum das Muster für die Entwicklung eines wiederverwendbaren objektorientierten Entwurfs nützlich ist. Das Entwurfsmuster identifiziert die teilnehmenden Klassen und Objekte, die Rollen, die sie spielen, die Interaktionen zwischen den Rollen und die ihnen zugeteilten Aufgaben. Jedes Entwurfsmuster konzentriert sich auf ein bestimmtes objektorientiertes Entwurfsproblem. Es beschreibt, wann es einsetzbar ist, ob es angesichts einschränkender Randbedingungen eingesetzt werden kann, und welche Konsequenzen sein Einsatz hat.“19 19 [GHJV96, S.4] - 35 - 5. Anwendungsschichten 5.1. Datenbanksystem Um auf Daten langfristig zugreifen zu können, müssen diese gespeichert werden. Diese Speicherung kann entweder in Dateien, oder in Datenbankmanagementsystemen vorgenommen werden. Die Datenspeicherung in Dateien ist einfach zu realisieren und hat allerdings den Nachteil, daß ein Auslesen von Teilinformationen recht kompliziert ist. Datenbankmanagementsysteme bieten dagegen einen hohen Komfort bei der Datenhaltung, der im Folgenden noch näher beschrieben wird. Die relationalen Datenbankmanagementsysteme haben sich als Datenspeicher durchgesetzt, so daß die wenig verbreiteten objektorientierten Datenbankmanagementsysteme hier nicht weiter betrachtet werden. 5.1.1. Leistungsmerkmale von relationalen Datenbankmanagementsystemen Folgende Leistungsmerkmale begründen den Komfort der relationalen Datenbankmanagementsysteme: • • • • Effizienter Datenzugriff und –speicherung Die Datenbanken erlauben einen wesentlich schnelleren und zuverlässigeren Zugriff auf Daten als Dateien. Konsistenzprüfung der Daten Aufgrund der Tatsache, daß Daten nur bestimmte Werte annehmen können, erfolgt bei einer Speicherung falscher Werte eine Fehlermeldung. Mehrbenutzerfähigkeit Bei Internetanwendungen werden die Daten von mehreren Teilnehmern gelesen und geschrieben. Die Regelung des Zugriffs auf diese Daten wird von dem Datenbankmanagementsystem übernommen. Es darf beispielsweise nicht vorkommen, daß zwei Teilnehmer gleichzeitig auf den selben Dateninhalt schreiben. Transaktionen Eine Transaktion enthält eine Gruppe von Anweisungen, die ausgeführt werden. „Die Anforderungen an Datenbanktransaktionen werden mit dem Begriff ACID abgekürzt (atomic, consistent, isolated, durable)“ [DS00] Das heißt, daß eine Transaktion als eine atomare, untrennbare Einheit zu betrachten ist. In Verbindung mit der Konsistenzprüfung bedeutet das, daß im Falle einer fehlerhaften Anweisung alle anderen Anweisungen entweder nicht mehr ausgeführt oder rückgängig gemacht werden. Die Isolation soll sicherstellen, daß keine weitere Transaktion die gerade ausgeführte Transaktion beeinflussen kann. Nach der Beendigung einer Transaktion müssen alle zuvor eingetragenen Daten dauerhaft gespeichert werden. - 36 - • Ausfallsicherheit Das Datenbankmanagementsystem hat Mechanismen, die nach einem Systemabsturz eine Reparatur beschädigter Daten vornehmen können. 5.1.2. Structured Query Language (SQL) „SQL –structured query language– bedeutet strukturierte Abfragesprache. Abfragesprachen dienen in Datenbanksystemen zur Datendefinition und Informationsgewinnung.“20 SQL ist heute in Verbindung mit relationalen Datenbankmanagementsystemen die Standardabfragesprache. Durch SQL wird eine Trennung zwischen der Datenbankabfrage und der Programmiersprache geschaffen. So bietet nahezu jede Programmiersprache die Möglichkeit, eine Abfrage, die in SQL formuliert ist, an das relationale Datenbankmanagementsystem zu senden und das Ergebnis auszuwerten. Dies bietet wiederum eine hohe Unabhängigkeit. So kann zu einem späteren Zeitpunkt die Datenbank gewechselt werden und eine bestehende Anwendung kann auf die Daten ohne Änderung zugreifen. Leider gibt es keinen SQL-Standard, da die verschiedenen Hersteller von relationalen Datenbankmanagementsystemen eigene SQL-Dialekte entwickelten. Das American Standard Institute (ANSI) hat einen Standard für relationale Sprachen entworfen, das ANSI-SQL. Jedoch bildet ANSI-SQL lediglich den kleinsten gemeinsamen Nenner aller Dialekte. 5.1.3. Java Database Connectivity (JDBC) „Java Database Connectivity (JDBC) stellt eine Schnittstelle zu relationalen Datenbankmanagementsystemen (RDBMS) dar.“21 JDBC stellt somit alle nötigen Funktionalitäten bereit, die man zum Zugriff auf ein relationales Datenbankmanagementsystem benötigt. Da jedoch jedes relationales Datenbankmanagementsystem einen anderen Zugriffsmechanismus hat, muß für jedes System ein eigener JDBC-Treiber existieren. Man unterscheidet vier Typen von JDBC-Treibern: Typ 1: 20 21 Eine JDBC-ODBC-Bridge22 ermöglicht den Zugriff auf ein relationales Datenbankmanagementsystem mit Hilfe eines ODBC [M95, S.7] [DS00, S. 157] - 37 - Treibers. Typ 2: Der JDBC-Treiber setzt auf einen proprietären Treiber des Herstellers des relationalen Datenbankmanagmentsystems auf. Typ 3: Der Treiber ist komplett in Java geschrieben, benötigt aber eine Middleware zur Kommunikation. Typ 4: Der Treiber ist komplett in Java geschrieben und die JDBC-Calls werden direkt in das erforderliche Protokoll des relationalen Datenbankmanagementsystems umgesetzt. Die eindeutige Spezifikation der Schnittstelle erlaubt es, auf jedes relationale Datenbankmanagementsystem in der gleichen Weise zuzugreifen, unabhängig vom Treibertyp. Das ermöglicht ein problemloses Austauschen der Datenbankmanagementsystemen. Im Quellcode muß nur der Verweis auf den alten Treiber durch einen Verweis auf den Treiber ersetzt werden. Dies geschieht einfach durch das Austauschen der Treibernamen. Aus diesem Grund bietet sich die Verwendung von JDBC in der Zugriffsschicht an. Man sollte aber bei der Programmierung auf eine einheitliche Verwendung von ANSI-SQL achten, denn sonst kann es, aufgrund der Verwendung herstellerspezifischer Dialekte, zu Problemen bei einem Austausch der Datenbankmanagementsysteme kommen. Die JDBC Schnittstelle bietet unter anderem folgende Funktionalitäten, die auch für die Implementierung des Portals eingesetzt werden: • • • 5.1.4. Über JDBC kann man die Verbindung zur Datenbank herstellen. Man erhält nach Anforderung ein Connection-Objekt, welches alle weiteren benötigten Objekte liefert. Für die Abrage der Datenbank stellt das Connection-Objekt ein StatementObjekt, welches die SQL-Abfrage und ihre Ausführung kapselt. Die SQLAbfrage wird als Zeichenkette dem Statement-Objekt übergeben. Das Statement liefert als Ergebnis einer SELECT-Anweisung ein ResultSet-Objekt zur Verfügung, in dem alle gefundenen Datensätze gespeichert sind und durch Iteration abgefragt werden können. Zugriffsschicht Um der Anforderung, das Datenbanksystem von den Geschäftsobjekten zu trennen, nachzukommen, muß eine Zugriffsschicht erstellt werden. Aus der Implementierung einer Zugriffsschicht entstehen mehrere Vorteile: 22 Die JDBC-ODBC-Bridge ist bereits im Lieferumfang von Java enthalten. - 38 - Die Zugriffsschicht kapselt die spezifischen Eigenschaften des Datenbanksystems. Somit ist ein leichter Austausch des Datenbanksystems gewährleistet, denn die anfallenden Änderungen müssen nur in der Zugriffsschicht vorgenommen werden. Dadurch kann auch jede beliebige Art der Speicherung der Daten vollzogen werden. Somit kann man das situationsspezifisch optimale Datenbankmanagementsystem auswählen und eine Steigerung der Performance erreichen. In der Zugriffsschicht kann man durch die Implementierung von Mechanismen wie Caching oder Connection-Pooling die Performance entscheidend verbessern. Ein späteres Einfügen von solchen Mechanismen kann ohne den Eingriff in die komplette Anwendung vollzogen werden. Die Verwaltung der Verbindungen zum Datenbanksystem bietet den Vorteil, daß mit Hilfe von Kontrollmechanismen die Datenkonsistenz gewahrt bleibt. Für die Implementierung einer Zugriffsschicht existieren zur Zeit zwei Modelle: 1. Jedes Geschäftsobjekt ist für ihren Persistenzmechanismus selbst verantwortlich. Dadurch, daß man den Persistenzmechanismus in dem Objekt selbst kapselt, muß man bei einer Änderung des Geschäftsobjekts nur die entsprechende Klasse ändern. 2. Der Zugriffsschicht wird die Klassenstruktur der Anwendung, die Struktur der Datenbank und die Abbildung zwischen beiden bekannt gemacht Das geschieht durch eine Speicherung der Informationen selbst in einer Datenbank oder in Dateien. Mit Hilfe dieser Informationen kann die Abbildung zu Laufzeit vorgenommen werden. Der Vorteil ist hierbei, daß (fast) kein Persistenzcode mehr in den Klassen befindet, der Nachteil ist, daß eine Änderung der Klassenstruktur oder der Datenbank auch eine Neuaufbereitung der Informationsquelle für die Zugriffsschicht nach sich zieht. 5.1.5. Implementierung Die Implementierung der Zugriffsschicht für das Portal umfaßt das erste Modell. Das Geschäftsobjekt ist für seinen Persistenzmechanismus selbst verantwortlich. Die Zugriffsschicht bekommt vom Geschäftsobjekt eine Beschreibung, welche Daten es wohin speichern soll, bzw. welche Daten es von wo holen soll. Diese Beschreibung ist in dem vorliegenden Fall in SQL gehalten, sie könnte aber auch in einer beliebigen Sprache sein. Die Zugriffsschicht selbst interpretiert die Beschreibung und entscheidet dann, wie der Zugriff passieren soll. - 39 - In der vorliegenden Implementierung besteht die Zugriffsschicht aus zwei Klassen. Die DataAccess-Klasse bekommt die Beschreibung vom Geschäftsobjekt und fordert dann je nach Anweisung eine Verbindung zum Lesen aus der Datenbank oder eine Verbindung zum Schreiben in die Datenbank an. Diese Verbindungen werden von der Klasse ConnectionPool verwaltet. Diese Verwaltung kann nur funktionieren, wenn es nur eine Instanz der Klasse ConnectionPool gibt. Um dies sicherzustellen, wurde das Entwurfsmuster „Singleton“ in der Klasse implementiert. „Zweck: Sichere ab, daß eine Klasse genau ein Exemplar besitzt, und stelle einen globalen Zugriffspunkt darauf bereit.“23 public class Singleton { private static Singleton mySingleton = null; private Singleton() {} public static Singleton getInstance() { if (mySingleton == null) { mySingleton = new Singleton(); } return mySingleton; } } Listing 1: Entwurfsmuster Singleton Der ConnectionPool hält zehn Verbindungen zur Datenbank offen und verwaltet sie in einem Pool. Diese Verbindungen sind ausschließlich für den lesenden Zugriff auf die Datenbank gedacht. Wenn nun mehr als zehn Anfragen an die Datenbank bestehen, werden weitere Verbindungen bereitgestellt und der Pool wird vergrößert. Wenn nun die Anfragen wieder sinken, wird der Pool wieder verkleinert. So wächst der Pool dynamisch mit den Zugriffen. Dadurch erreicht man eine deutlich höhere Performance. Um Probleme beim Schreiben in die Datenbank zu verhindern, stellt der ConnectionPool nur eine einzige Verbindung zum Schreiben in die Datenbank zur Verfügung. Der ConnectionPool stellt bei der Anforderung dieser Verbindung fest, ob sie bereits vergeben ist. Ist dies der Fall, so muß das Geschäftsobjekt, das gerade die Verbindung angefordert hat, warten, bis die Verbindung wieder freigegeben wird. Auf der folgende Seite wird in der Abbildung 15 die Zugriffsschicht als Diagramm dargestellt. 23 [GHJV96, S. 157] - 40 - LEGENDE: Geschäftsobjekt erzeugt DataAccess DataAccess DBConnectionPool SQL WriteConnection von DBConnectionPool anfordern INSERT / UPDATE Art der Abfrage Connection von DBConnectionPool anfordern SELECT Warten Connection in Benutzung? NEIN JA Connection im Pool? NEIN JA Connection an DataAccess übergeben Connection aus dem Pool entfernen neue Connection erstellen Connection an DataAccess übergeben SQL ausführen Connection zurück an DBConnectionPool SQL ausführen Kennzeichnung der Connection als unbenutzt Connection zurück an DBConnectionPool JA Wartende Anfrage benachrichtigen Connection schließen Max. Conncetions im Pool? NEIN Connection zurück in den Pool ResultSet an das Geschäftobjekt geben Abbildung 15: Vereinfachte Darstellung der Funktionsweise der Zugriffsschicht - 41 - 5.2. Geschäftslogik In der kommerziellen Softwareentwicklung ist die Logik, die in einer Anwendung implementiert werden soll, auf der Geschäftslogik aufgebaut. Unter der Geschäftslogik versteht man den logischen Ablauf von Geschäftsprozessen. Die im Folgenden erläuterten Begriffe werden anhand des Beispieles „Einkaufen im Internet“ verdeutlicht. Die Geschäftslogik umfaßt in diesem Fall die realen Geschäftsprozesse Warenauswahl, Warenkauf und Bezahlung. Diese bilden die Grundlage für die Logik der Internetanwendung. 5.2.1. Geschäftsprozeß Ein Geschäftsprozeß umfaßt generell eine Reihe von Aktivitäten und führt zu einem Ergebnis, das für den Kunden von Wert ist. Folglich besteht ein Geschäftsprozeß aus mehreren Schritten. Die Logik, die festlegt, in welcher Reihenfolge die Schritte durchzuführen sind, bezeichnet man als Workflow. Dieser Workflow wird bei einer Anwendung in Programmcode umgesetzt. Im Rahmen des Geschäftsprozesses „Warenauswahl“ gibt es beispielsweise die Aktivitäten „Warenpreis vergleichen“ und „in den Warenkorb legen“. 5.2.2. Geschäftsobjekte Innerhalb eines Geschäftsprozesses werden ein oder mehrere Geschäftsobjekte benutzt. Ein Objekt der „realen“ Welt, das in einem Geschäftsprozeß verwendet wird, versteht man als Geschäftsobjekt. So werden die Geschäftsobjekte „Waren“ und „Warenkorb“ im Rahmen des Geschäftsprozesses „Warenauswahl“ benutzt. Ein Geschäftsobjekt muß jedoch nicht notwendigerweise ein reales Objekt sein, sondern es kann auch künstlicher Natur sein, wie beispielsweise der Preis einer Ware. „Wenn man Prozesse der echten Welt auf einem Computer simulieren will, so macht es Sinn, die echte Welt so genau wie möglich auf dem Computer abzubilden. Ein möglicher Weg ist, die Welt als eine Anzahl von Objekten zu beschreiben, die sich aufeinander beziehen.“24 Diese Abbildung des „realen“ Objekts ist ein Softwarekonstrukt, das ebenfalls Objekt genannt wird. In der aktuellen Softwareentwicklung werden die Geschäftsobjekte als Komponenten abgebildet. Eine Komponente kapselt Daten und Methoden wie ein Objekt. 24 [DSOO, S. 78] - 42 - Allerdings ist eine Komponente aus dem objektorientierten Kontext herausgelöst und kann auch in einer strukturierten Programmiersprache wie C programmiert werden. Der Softwareentwickler benutzt eine Komponente wie eine Black Box, d.h. er übergibt ihr Daten und erhält wiederum Daten, ohne zu wissen, wie die Verarbeitung der Daten in der Komponente implementiert ist. Durch die Gemeinsamkeiten, daß Komponenten ähnlich wie Objekte einen Zustand, Eigenschaften und Funktionen haben, bietet sich das Objekt als Grundlage der Komponente an. 5.2.3. JavaBeans JavaBeans ist ein Vorschlag von SUN Microsystems, wie Komponenten in Java aussehen sollen. Ursprünglich waren sie als Komponenten für visuelle Softwareentwicklungssysteme, wie den JBuilder von Borland oder Forte von SUN Microsystems, gedacht. „Die öffentliche Schnittstelle einer JavaBeans-Komponente enthält Definitionen von Ereignissen, Eigenschaften sowie Methoden.“25 Damit die visuellen Softwareentwicklungssysteme die JavaBeans einfach einbinden können, unterliegen die JavaBeans vorgegebenen Entwurfsmustern26. Die Konvention ist, daß den Eigenschaften mit einer Methode set<Eigenschaftsname>(...) ein Wert zugewiesen wird und man diesen Wert mit einer Methode get<Eigenschaftsname>() wieder auslesen kann. Die JavaBeans müssen nach der Definition auch eine Persistenzmechanismus integrieren, als Standardmechanismus wird hier Javas „Object Serialization“ benutzt. Es kann aber auch ein eigener Mechanismus implementiert werden. 5.2.4. Implementierung Die Geschäftsobjekte des Portals sind im Komponentemodell von Java, den JavaBeans realisiert. Alle Geschäftsobjekte verfügen über die vorgegebenen setund get-Methoden. Dadurch wird der Aufruf und der Umgang mit einem Geschäftsobjekt in der Präsentationsschicht vereinfacht und vereinheitlicht. Um die Geschäftsobjekte in der Präsentationsschicht verwenden zu können, haben diese Entwurfsmuster zur Erzeugung bestehender Geschäftsobjekte aus der Daten25 [GT00, S. 144] SUN Microsystem nennt die Spezifikation zwar Entwurfsmuster, aber es sind keine nach [GHJV96]. 26 - 43 - bank. Als erzeugende Entwurfsmuster sind die Muster „Finder“ und „Factory“ implementiert. Durch einen einfachen Aufruf einer statischen Methode erhält man ein Objekt mit den gewünschten Werten. Sollte ein Geschäftsobjekt wiederum ein oder mehrere Geschäftsobjekte beinhalten, so werden innerhalb des Objektes alle anderen Objekte erzeugt. Hierfür wird das Muster „Chain of Responsibility“ benutzt. Durch Verkettung wird die Erzeugung von Objekten innerhalb eines Geschäftsobjektes an die Objekte weiterdelegiert. Dadurch wird sichergestellt, daß bei der Benutzung eines Objektes auch alle anhängende Objekte bis zur untersten Ebene zur Verfügung stehen. Für einige Geschäftsobjekte ist es auch nicht notwendig, daß sie über eine öffentliche Methode zum erstellen haben. Es reicht bei Geschäftsobjekten, die nur innerhalb eines anderen Geschäftsobjektes Sinn machen, aus, die Erzeugermethoden mit protected zu deklarieren. Ein „leeres“ Objekt, das dann gefüllt werden soll, wird über den Standardkonstruktor erzeugt. public class GeschäftsobjektA { GeschäftsobjektB objektB; public GeschäftsobjektA(); public GeschäftsobjektA findByID(int id); public GeschäftsobjektA findByName(String name) { objektB = GeschäftsobjektB.findByID(1); ... Listing 2: Entwurfsmuster Finder und Factory findById GeschäftsobjektA findById findById GeschäftsobjektC GeschäftsobjektB findById GeschäftsobjektD Abbildung 16: Chain of Responsibility Die Geschäftsobjekte sind aber auch für ihren Persistenzmechanismus verantwortlich. So hat jedes Objekt eine Methode, die zur Speicherung des O in der DB dient. Wie bei den erzeugenden Methoden auch, sind sie nicht alle als public deklariert, denn es gibt auch Geschäftsobjekte, bei denen es keinen Sinn macht, sie außerhalb eines bestimmten Kontextes zu speichern. Auch hier wird mit dem Muster „Chain of Responsibility“ sichergestellt, daß alle Objekte, die innerhalb eines zu speichernden Objektes sind, mitgespeichert werden. - 44 - 5.3. Präsentation Die Präsentation hat die Aufgabe, Daten darzustellen und die Dateneingabe zu ermöglichen. Sie soll die Informationsaufbereitung sinnvoll unterstützen und der leichteren Handhabung einer Anwendung dienen. Hierbei gibt es unterschiedliche Varianten der Darstellung. Eine Variante ist die alphanummerische Ausgabe in der Kommandozeile. Sie eignet sich weniger für komplexe Anwendungen. Eine weitere Variante ist, daß eine speziell auf die Daten zugeschnittene Anwendung die Darstellung übernimmt. Diese eignet sich besonders für fest installierte, nicht verteilte Anwendungen. Wenn aber ein verteiltes System existiert, in dem unterschiedliche Teilnehmer mit unterschiedlichen Betriebssystemen die gleichen Informationen betrachten wollen, ist es am einfachsten, wenn man die Daten mit Formatierungsbefehlen koppelt und die Interpretation der Formatierungsbefehle von einer Software vornehmen läßt. Dies hat den Vorteil, daß man nicht an eine Anwendung gebunden ist. Es kann eine zweite Anwendung geschrieben werden, das diese Formatierungsbefehle auch umsetzen kann. Ein Beispiel hierfür sind die Importfilter gängiger Textverarbeitungsprogramme. 5.3.1. Hypertext Markup Language (Html) Die Hypertext Markup Language wurde zur Darstellung und Verknüpfung von Informationen entwickelt. Html hat sich als Standarddarstellung im World Wide Web durchgesetzt. Dies ist vor allem auf die Einfachheit der Sprache zurückzuführen. Bei Html handelt es sich um eine Auszeichnungssprache. Mit einem sehr kleinen Satz an Auszeichnungen (Tags) sind sehr komplexe Darstellungen möglich. Zur Betrachtung eines Html-Dokumentes benötigt man einen Browser. Der Browser ist ein Programm, das die Auszeichnungen der Html-Seite interpretiert und die Information entsprechend darstellt. Interessant ist dabei, daß Auszeichnungen, die dem Browser nicht bekannt sind, einfach „überlesen“ werden. Das garantiert eine Abwärtskompatibilität der Html-Standards. So ist eine Seite auch dann darstellbar, wenn man einen älteren Browser benutzt, der diese Auszeichnungen nicht interpretieren kann. Ein Html-Dokument besteht aus einem Kopf (head) und einem Rumpf (body). Der Kopf enthält Metainformationen und den Titel des Html-Dokumentes, während der Rumpf die eigentlichen Informationen und die Formatierungsbefehle zur Darstellung umfaßt. Die Verknüpfung mehrerer Dokumente wird in Html mit Hilfe sogenannter Links realisiert. Ein Link ist ein sichtbares Objekt der Html-Seite, beispielsweise ein - 45 - Bild oder ein Text, das von einer speziellen Auszeichnung umschlossen ist. Innerhalb der Auszeichnung wird die Adresse des zu verknüpfenden Elements angegeben. Dieses Element muß nicht zwingend ein Html-Dokument sein. Sobald man den Link mit der Maus anklickt, wird das Element in den Browser geladen. 5.3.2. Servlets Die Abbildung 12 zeigt, daß die Methode service( ) bei jeder Anfrage an ein Servlet aufgerufen wird. Die Methode service( )beim Servlet entspricht der Methode main( ) bei der Applikation. Die Methode service( ) erhält zum einen ein ServletRequest-Objekt, in dem alle Daten zur Anfrage gekapselt werden, und zum anderen ein ServletResponse-Objekt. Im ServletRequest-Objekt exisitieren Methoden, die Werte der klassischen CGI-Variablen liefern. Zusätzlich hat das Objekt Methoden, die den Zugriff auf getParameter(String die Parameter erleichtern. Die Methode parametername) liefert den Wert zu einem Parameter parametername zurück. Die Methode getParameterNames( ) bietet den Zugriff auf alle Parameternamen in der Anfrage. „Mit Vorsicht zu genießen ist dabei String getParameter(String name). Sind nämlich mehrere Werte einem Schlüssel zugeordnet, erhält man mit getParameter(String name) nur einem Wert. Daher sollte diese Methode auch aus dem Servlet-API verschwinden. Der Protest einiger Entwickler hat jedoch dazu geführt, daß Sun die Methode wieder eingeführt hat. Ist man sich nämlich sicher, daß nur ein Wert übermittelt werden soll, ist es sehr viel komfortabler, direkt mit einem String zu arbeiten, anstatt immer auf ein Array zuzugreifen. Werden mehrere Parameter gleichen Namens übermittelt, liefert 27 getParameter(String name) den ersten.“ Eine Besonderheit stellt die Methode getInputStream( ) dar. Mit dieser Methode ist es möglich, Binärdaten zu lesen, so daß Dateien mit Hilfe eines HtmlFormulars an ein Servlet übertragen werden können. Der zweite Parameter der Methode service( ) ist das ServletResponse-Objekt. Im ServletResponse-Objekt werden alle Daten gekapselt, die nach Beendigung des Servlets an den Client zurückgesandt werden. Die wichtigste Methode bei der Antworterstellung für den Client ist die Methode getWriter( ). Diese Methode erzeugt ein Objekt vom Typ Writer, das alle Methoden zur Erstellung der Ausgabedaten zur Verfügung stellt. 27 [RS00, S. 45] - 46 - „Wer beim Programmieren von Servlets alle Fäden in der Hand behalten will, muß sich darüber im klaren sein, daß die service( )-Methode seines Servlets unter Umständen von mehreren Threads gleichzeitig aufgerufen wird.. Es existieren also gewöhnlich weniger Servlet-Instanzen als Threads, die dieses Servlet gleichzeitig ausführen. Tatsächlich wird ein Servlet in der Regel nur einmal instantiiert. Das bedeutet, daß ungeschützte Klassen- und Instanzvariablen während der Ausführung durch Thread A von Thread B verändert werden können. Dieses Verhalten kann leicht zu inkonsistenten Zuständen führen.“28 Die Klasse HttpServlet ist eine komfortable Ausgangsbasis für Servlets, die das Hypertext Transfer Protocol (HTTP) verwenden. Das Hypertext Transfer Protocol ist ein textbasiertes Transferprotokoll, in dem die Anforderung von Daten bzw. ihr Versenden mit den Protokollkommandos GET und POST möglich ist. Die Klasse HttpServlet bietet zusätzlich zur service( ) –Methode noch die Methoden doGet( ) und doPost( ) an. In Abhängigkeit von dem Protokollkommando, mit dem das HttpServlet aufgerufen wird, erfolgt eine Verzweigung in der entsprechenden Methode zur Verarbeitung des Aufrufs. Beide Methoden bekommen ein HttpServletRequest-Objekt und ein HttpServletResponse-Objekt als Parameter mitgeliefert. Beide Objekte stellen eine Spezialisierung der allgemeinen Objekte der service( )-Methode im Hinblick auf die HTTP-Unterstützung dar. Eine wichtige Unterstützung, stellt das Lesen und Schreiben von Cookies dar. „Unter Cookies versteht man kleine Informationsstücke, die der Server auf dem Rechner des Clients ablegt. Wenn der Client eine Web-Seite bzw. ein Servlet auf dem entsprechenden Server aufruft, dann werden die für diesen Kontext gespeicherten Cookies an den Server mit übertragen.“29 Diese Technik ermöglicht die Erzeugung von Sitzungen (Sessions). „Unter einer Session versteht man eine Zusammenhängende Abfolge von Anforderungen und Antworten zwischen Client und Server. Da HTTP ein verbindungsloses Protokoll ist, muß bei jeder Frage und Antwort eine Identifikation mitgeschickt werden, um mehrere Anforderungen als zusammenhängend erkennen zu können.“30 5.3.3. Implementierung Für die Darstellung der einzelnen Seiten wird ein Modell benutzt, das im Folgenden Screenmodell genannt wird. Das Screenmodell unterliegt, wie die 28 [RS00, S. 51] [EF00, S.118] 30 [RS00, S. 66] 29 - 47 - Geschäftsobjekte auch, dem Komponentenmodell. Für jede Html-Seite die sich von einer anderen Html-Seite in ihrer Form oder in den verwendeten Geschäftsobjekten unterscheidet, wird als eigenständige Komponente gesehen, sie werden im Folgenden Screenobjekte genannt. Alle Screenobjekte erben von der abstrakten Klasse Screen. Die abstrakte Klasse Screen definiert die Schnittstelle zwischen den Screenobjekten und dem Servlet, das die Screenobjekte benutzt. Die Klasse Screen ist als abstrakt und nicht als Interface entworfen, da sie Grundfunktionalitäten schon implementiert hat. Alle Screens haben denselben Html-Rumpf, deshalb kann die Ausgabe dieses HtmlRumpfes schon in der Screen-Klasse ausprogrammiert werden. Und für den Fall, daß doch etwas im Html-Rumpf eines Screenobjektes anders ist als bei den anderen, können die Methoden die den Html-Rumpf erzeugen, überschrieben werden. public abstract class Screen { public void header(Response-Objekt) { ist implementiert } public abstract void body(Response-Objekt); public void footer(Response-Objekt) { ist implementiert } } Listing 3: Beispiel für die abstrakte Klasse Screen Durch die vorgegebene Schnittstellen in der Klasse Screen ist die Entwicklung eines eigenen Screenobjektes sehr einfach. Es muß lediglich die Methode body implementiert werden. Diese bekommt wie im oberen Beispiel ein Objekt mit, in das der Htmlcode geschrieben wird. Nach der Abarbeitung der Methode doGet() oder doPost() generiert das Servlet daraus die Antwort für den Client und sendet diese. Damit innerhalb eines Screenobjektes aber auch Parameter abgefragt werden können, ist es sinnvoll auch ein Request-Objekt mit zu übergeben. Innerhalb des Servlets wird das objektorientierte Prinzip des Polymorphismus (Vielgestaltigkeit) angewandt. Das Servlet selbst arbeitet nur mit einem Objekt vom Typ Screen. Zur Laufzeit wird dem Objekt ein konkretes Screenobjekt zugewiesen und das Servlet kann dann die in der Klasse Screen definierten Methoden benutzen. ... Screen screen = null; if ( soll ScreenA erzeugen ) { screen = new ScreenA() } … screen.header(Response-Objekt); screen.body(Response-Objekt); screen.footer(Response-Objekt); … - 48 - Listing 4: Anwendung des Polymorphismus Das erleichtert die Programmierung des Workflows erheblich. Dem Servlet wird ein Parameter mitgeliefert, der das zu erstellende Screenobjekt eindeutig identifiziert. So ist ein Workflow als eine Kette von if-Anweisungen programmierbar. Und jedem Link der geschrieben wird, bekommt diesen Parameter mit. - 49 - 6. Implementierungshinweise 6.1. Programmierumgebung Die Programmierumgebung beschreibt kurz welche notwendigen Einstellungen an einem Computer vorgenommen werden müssen, damit die Internetanwendung, weiterentwickelt werden kann. 6.1.1. JDK 1.2.2 Durch die Benutzung der neuen Collection Schnittstelle, zur dynamischen Speicherung und Verwaltung von Objekten in Listen, muß mindestens ein JDK1.2.2 installiert sein. Diese findet man unter http://www.javasoft.com. 6.1.2. Servlets 2.2 Eine Bibliothek für Servlets muß in den CLASSPATH mit aufgenommen werden. Die aktuelle Bibliothek für Servlets findet man unter http://java.apache.org. 6.1.3. Dokumentation Zur Dokumentation von Javaklassen hat sich das im JDK befindliche javadoc als Standard durchgesetzt. Dies hat den Vorteil, daß ein Programmierer, der sich mit Java befasst hat, innerhalb kürzester Zeit, auf Grundlage der von javadoc erzeugten Dokumentation, fremde Klassen benutzen kann. Javadoc bildet aus speziell definierten Kommentaren innerhalb des Quellcodes eine HTML-Datei, die die Informationen über Methoden und Attribute darstellt. Ein Auszug der von javadoc erzeugten Dateien zur Implementierung befindet sich im Anhang D. 6.2. Systemumgebung 6.2.1. Webserver Zur Installation der Internetanwendung muß ein Webserver auf dem rechner vorhanden sein. Prinzipiell ist jeder Server dafür geeignet, vorausgesetzt man kann eine Servlet Engine dafür installieren. Die Fachbereichsseiten benutzen den Tomcat v3.2, zu finden unter: http://jakarta.apache.org/ - 50 - Der Server beinhaltet schon die Referenzimplementierung der servlets2.2 und somit wird keine separate Servlet Engine benötigt. 6.2.2. Servlet Engine Eine Servlet Engine wird benötigt, um Servlets auszuführen. Sollte der Webserver keine Servlet Engine integriert haben, dann muß einen zusätzlich installiert werden. Tomcat3.2 kann als Servlet Engine dienen, oder das Open Source Projekt Caucho, unter http://www.caucho.com. Es gibt aber auch kommerzielle Produkte, wie JRun, zu finden unter http://www.jrun.com, oder ServletExec, das man unter http://www.newatlanta.com findet. - 51 - 7. Schlußbetrachtung 7.1. Resümee Die Diplomarbeit zeigt, daß sich 3-Tier-Architekturen sehr gut zur Programmierung von Internetanwendungen eignen, denn die Trennung der verschiedenen Ebenen einer Anwendung bieten die Vorteile einer hohen Skalierbarkeit und Sicherheit. Zudem ist der Austausch der einzelnen Komponenten (Client, Anwendungsserver, Datenbank) nahezu problemlos möglich. Die einzelnen Komponenten sind auch Um eine Anwendung für eine 3-Tier-Architektur zu programmieren eignet sich Java besonders, denn der Einsatz von JavaServlets unterstützt das einfache Austauschen der Komponenten einer 3-Tier-Architektur. Desweiteren sind in Java, dadurch daß es eine recht „junge“ Programmiersprache ist, die bewährten Konzepte, aber auch die neuen Konzepte enthalten. Dies wird gerade bei den hier eingesetzten Techniken JDBC und JavaBeans deutlich. Die Aufteilung der Internetanwendung in ein Schichtenmodell, hier die Aufteilung in Präsentationsschicht, Geschäftslogik und Zugriffsschicht, unterstützt nicht nur den oben genannten Vorteil des leichteren Austauschens von Komponenten, sondern bietet gerade in einem großen Projekt den Vorteil, daß die jeweilige Schicht von Spezialisten implementiert werden kann. Das Implementieren einer Schicht geschieht unabhängig von dem Implementieren der anderen Schichten. Dem Entwickler einer Schicht muß nur die Schnittstelle der darunterliegenden Schicht bekannt sein. Ein Entwickler der die Präsentationsschicht erstellt, muß sich deshalb nicht um die Datenhaltung in den Komponenten oder gar die Speicherung der Daten in der Datenbank kümmern. Eine einfache Weiterentwicklung der Anwendung ist damit gegeben, denn so kann beispielsweise eine Darstellung der Daten schnell und sicher geändert werden, ohne daß die Geschäftslogik oder die Zugriffsschicht davon betroffen sind. Auf Basis dieser Ergebnisse läßt sich im Rahmen dieser Diplomarbeit feststellen, daß eine Kombination aus 3-Tier-Architektur, der Umsetzung mit Java und der Aufteilen der Anwendung in Schichten sich ideal für die Programmierung komplexer Internetanwendungen eignet. Eine Verbesserung dieses Systems wird im folgenden Kapitel kurz erörtert. - 52 - 7.2. Ausblick auf aktuelle und zukünftige Entwicklungen Die aktuellen Entwicklungen zeigen, daß Internetanwendungen von 3-TierArchitekturen mehr und mehr zu den 4-Tier-Architekturen wechseln. Es wurde festgestellt, daß n-Tier-Architekturen eine höhere Sicherheit und Skalierbarkeit bieten, je mehr Ebenen sie haben. Deshalb bietet eine 4-Tier-Architektur eine noch höhere Sicherheit und Skalierbarkeit als die 3-Tier-Architektur. Die Umsetzung von Internetanwendungen innerhalb einer 4-Tier-Architektur wird mit Hilfe von Komponentenmodellen wie JavaBeans, Enterprise Java Beans oder DCOM in Verbindung mit Applikationsservern realisiert. Der Vorteil, den die Industrie zusätzlich zur Sicherheit und Skalierbarkeit im Einsatz dieser Techniken sieht, ist die höhere Wiederverwendbarkeit von Komponenten. Durch die Verwendung von Standardkomponenten hofft man natürlich, daß diese bei der Entwicklung von mehreren Anwendungen wieder verwendet werden können. Schon jetzt gibt es Firmen die sich auf die Entwicklung von Standardkomponenten und deren Verkauf spezialisiert haben. Das schafft ein erhebliches Einsparungspotential durch die Verkürzung von Enwicklungszeit. Zur Zeit werden viele Applikationsserver entwickelt und in naher Zukunft werden sie, ähnlich den Webservern, kostengünstig und vielfältig für jeden Bedarf zur Verfügung stehen. Ein Übergang von den 3-Tier-Architekturen zu den 4-TierArchitekturen ist deshalb schon absehbar. Und zukünftige Internetanwendungen werden nur noch als 4-Tier-Architekturen konzipiert und umgesetzt. - 53 - Anhang A Literaturverzeichnis [B00] Bengel, G.: Verteilte Systeme, Viewig 2000. [B99] Boger, :Java in verteilten Systemen, dpunkt 1999. [DS00] Daum, B, Scheller, M.: Electronic Business, Addison-Wesley 2000. [EF00] Eberhart, A., Fischer S.: Java-Bausteine für E-Commerce-Anwendungen, Hanser 2000. [GHJV96] Gamma, E., Helm, R., Johnson, R., Vlissides, J.: Enwurfsmuster, Addison-Wesley 1996. [GT00] Gruhn, V., Thiel, A.: Komponentenmodelle, Addison-Wesley 2000. [K00] Krüger, G.: GoTo Java 2, Addison-Wesley 2000. [K97] Kim, E.: CGI, SAMS 1997. [M95] Misgeld, W.: SQL Einstieg und Anwendung, Hanser 1995. [R98] Röhrig, B.: Datenbanken mit Linux, C & L 1998. [RS00] Rossbach, P., Schreiber, H.: Java Server und Servlets, Addison-Wesley 2000. [T00] Trau, V.: Java Server Pages, dpunkt 2000. [ZB00] Zimmermann, J., Beneken G.: Verteilte Komponenten und Datenbankanbindung, Addison-Wesley 2000. - 54 - Anhang B Abbildungsverzeichnis Abbildung 1: Ablauf innerhalb des Diskussionsforums........................................13 Abbildung 2: Flache Hierarchie einer Internetseite...............................................14 Abbildung 3: Tiefe Hierarchie einer Internetseite .................................................14 Abbildung 4: Struktur des Portals..........................................................................15 Abbildung 5: Dreiteilung der Internetseite zur Strukturunterstützung ..................16 Abbildung 6: Struktur des Hauptmenüs ................................................................16 Abbildung 7: 2-Tier Architektur [EF00] ...............................................................18 Abbildung 8: 3-Tier-Architektur [EF00] ...............................................................19 Abbildung 9: 4-Tier-Architektur [EF00] ...............................................................19 Abbildung 10: Formulardaten werden versandt und verarbeitet. ..........................20 Abbildung 11: Neue Html-Seite wird generiert und zurückgesandt. ....................21 Abbildung 12: Lebenszyklus eines Servlet-Objektes ............................................24 Abbildung 13: Vergleich der serverseitigen Programmiertechniken ....................25 Abbildung 14: Java Base Platform [DS00] ...........................................................30 Abbildung 15: Vereinfachte Darstellung der Funktionsweise der Zugriffsschicht...............................................................................................41 Abbildung 16: Chain of Responsibility .................................................................44 Listingverzeichnis Listing 1: Entwurfsmuster Singleton .....................................................................40 Listing 2: Entwurfsmuster Finder und Factory......................................................44 Listing 3: Beispiel für die abstrakte Klasse Screen ...............................................48 Listing 4: Anwendung des Polymorphismus .........................................................49 - 55 - Anhang C Package informatik - 56 - Package informatik.db - 57 - Package informatik.screens - 58 - Anhang D Beispiel für eine von javadoc erzeugte Dokumentation. Overview Package Class Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: INNER | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES informatik.db Class DBConnectionPool java.lang.Object | +--informatik.db.DBConnectionPool public class DBConnectionPool extends java.lang.Object Die Klasse DBConnectionPool sorgt für den korrekten Zugriff auf die lesenden Connections zur Datenbank. Method Summary void close(java.sql.Connection con) Die Methode close schließt eine Connection und legt sie in den Pool zurück, sofern nicht die Anzahl von 10 Connections erreicht ist. void destroy() Schließt automatisch den Pool, wenn der Garbage Collector aufräumt und die das Objekt zerstören will java.sql.Connection getConnection() Diese Methode liefert eine Connection aus dem Pool, wenn gerade eine frei ist, im anderen Fall wird eine neue angelegt. static DBConnectionPool getDBConnectionPool() Singleton, damit es nur einen DBConnectionPool gibt, auf den jeder zugreift. mit default-Werten static DBConnectionPool getDBConnectionPool(java.lang.String driver, java.lang.String url, java.lang.String uid, java.lang.String pwd) Singleton, damit es nur einen DBConnectionPool gibt, auf den jeder zugreift. - 59 - java.sql.Connection getWriteConnection() Diese Methode liefert eine Connection aus dem Pool, wenn gerade eine frei ist, im anderen Fall wird eine neue angelegt. Methods inherited from class java.lang.Object clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Method Detail getDBConnectionPool public static DBConnectionPool getDBConnectionPool(java.lang.String driver, java.lang.String url, java.lang.String uid, java.lang.String pwd) throws java.lang.ClassNotFoundException Singleton, damit es nur einen DBConnectionPool gibt, auf den jeder zugreift. getDBConnectionPool public static DBConnectionPool getDBConnectionPool() Singleton, damit es nur einen DBConnectionPool gibt, auf den jeder zugreift. mit default-Werten getConnection public java.sql.Connection getConnection() throws java.sql.SQLException Diese Methode liefert eine Connection aus dem Pool, wenn gerade eine frei ist, im anderen Fall wird eine neue angelegt. getWriteConnection public java.sql.Connection getWriteConnection() throws java.sql.SQLException Diese Methode liefert eine Connection aus dem Pool, wenn gerade eine frei ist, im anderen Fall wird eine neue angelegt. close - 60 - public void close(java.sql.Connection con) Die Methode close schließt eine Connection und legt sie in den Pool zurück, sofern nicht die Anzahl von 10 Connections erreicht ist. destroy public void destroy() Schließt automatisch den Pool, wenn der Garbage Collector aufräumt und die das Objekt zerstören will Overview Package Class Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: INNER | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES - 61 -