Internetbasierte Systeme“ – SS 2009 ” (Version 1.19.0 vom 24.6.2009) Michael Jäger 24. Juni 2009 Internet-basierte Systeme Offizieller Titel: Internet-basierte Geschäftssysteme Die Lehrveranstaltung behandelte bislang: • Web-Technologie • Wirtschaftswissenschaftliche Aspekte des Online-Handels • Einführung in das Online-Recht Da die Web-Technologie alleine schon sehr umfangreich, komplex und rasanter Weiterentwicklung unterworfen ist, wird nur noch dieser Teilbereich behandelt. IBS - SS 2009 1 Literaturempfehlung • Basiswissen Web-Programmierung“ von Heide Balzert, W3L-Verlag 2007, 25 ” EUR • Java EE 5“ von Thomas Stark, Addison-Wesley/Pearson Studium 2007, 30 ” EUR • Foliensammlung auf meiner WWW-Homepage (wird während des Semesters ergänzt) • Die SELFHTML-Website: http://de.selfhtml.org • Diverse Internet-Quellen (siehe Foliensammlung) IBS - SS 2009 2 Abgrenzung zu anderen Lehrveranstaltungen Grundlagen zu Aufbau und Funktion des Internet werden in der Lehrveranstaltung Rechnernetze“ vermittelt: ” • TCP/IP-Protokollfamilie • Domain Name System (DNS) • Hypertext Transfer Protokoll (HTTP) • Internet-Anwendungsbereiche außerhalb des WWW: z.B. E-Mail, IP-Telefonie IBS - SS 2009 3 Sicherheitsaspekte des WWW Die Lehrveranstaltung Sicherheit in der IT“ behandelt u.a. Sicherheitsaspekte des ” Internet. Zum Gesamtverständnis der Web-Technologie gehören Grundkenntnisse zu: • Kryptographie: Symmetrische/assymetrische Codierungsverfahren, Hash-Verfahren • Digitale Unterschriften • Zertifikate (X.509, PKCS, . . . ) • PKI-Systeme • SSL/TLS • Smartcards IBS - SS 2009 4 Wirtschaftswissenschaftliche Aspekte Elektronischer Handel hat in gleicher Weise informationstechnische wie wirtschaftswissenschaftliche Aspekte. Letztere sollen zukünftig in einer Wahlpflichtveranstaltung angeboten werden, z.B. • Entwicklung des Online-Markts • Geschäftsmodelle für Online-Handel im B2C- und B2B-Bereich • Geschäftsprozesse (z.B. Online-Einkauf, Ausschreibungsverfahren, CRM) • E-Business • Spezielle E-Commerce-Software (Online-Shops, Auktionssysteme, Marktplatz-Software, Online-Banking, . . . ) IBS - SS 2009 5 Juristische Aspekte Rechtliche Grundlagen der Informatik werden in der Lehrveranstaltung Einführung in das Recht“ vermittelt. ” Zu den für die Internet-Nutzung rechtlich relevanten Bereichen gehören z.B. • Domänenrecht • Urheberrecht • Providerhaftung • ... IBS - SS 2009 6 Abgrenzung Web-Technologie / Web 2.0 Der Modebegriff Web 2.0“ wird nicht einheitlich definiert. ” Es geht dabei um • neuere Nutzungskonzepte des WWW ( Mitmach-Web“), ” z.B. Weblogs, Wikis, Podcasting, Videoportale • einige neuere, eher technische Konzepte in deren Umfeld, z.B. Mash-Ups“, Tag-Clouds“ ” ” Diese Aspekte werden in Lehrveranstaltung nicht behandelt (→ bei Interesse: Wahlpflichtangebot beachten) Lesen Sie zum Web 2.0“ den entsprechenden Eintrag im Wikipedia! ” IBS - SS 2009 7 Abgrenzung Web-Technologie / Semantisches Web“ ” Das Semantische Web“ ist ein schon seit Jahren betriebener (bislang wenig ” erfolgreicher) Versuch der Weiterentwicklung des WWW. Das Hauptziel ist es, das weltweit im Web vorhandene Wissen durch komplexe Techniken zur semantischen Einordnung der Informationen besser auffindbar zu machen. Dazu gehört z.B. die Entwicklung von Taxonomien und Ontologien. Lesen Sie zu diesen Begriffen die entsprechenden Einträge im Wikipedia! IBS - SS 2009 8 Programmiersysteme für das Web Web-Anwendungen werden serverseitig häufig mit Java, C# oder einer Script-Sprache wie PHP, Ruby, Groovy oder PERL entwickelt. Zu all diesen Sprachen existieren Bibliotheken und Frameworks für die speziellen Bedürfnisse von Web-Applikationen, z.B. • Einfache Behandlung von HTTP-Requests • Sitzungsverwaltung • Dynamische HTML-Erzeugung • Einfache Datenbank-Anbindung • Komplexe GUIs für den WWW-Browser • GUI-Internationalisierung IBS - SS 2009 9 Einige Framework-Beispiele • CakePHP für PHP • Rails für Ruby ( Ruby on Rails“) ” • Grails für Groovy • Struts für Java • JSF (Java Server Faces) für Java Wir betrachten die Hilfsmittel im Umfeld von Java näher, speziell das umfangreiche JEE-Framework (JEE 5 – Java Enterprise Edition). Alternativ werden in der Praxis auch häufig Content Management Systeme wie Typo3, Plone oder Joomla eingesetzt. Diese werden hier nicht behandelt. IBS - SS 2009 10 Inhaltliche Übersicht • Basiswissen Web-Programmierung – – – – – – – XML und verwandte Standards (DTD, XML-Schema, XSLT, . . . ) DOM – Document Object Model XML-Verarbeitung in Java HTML/XHTML Cascading Stylesheets (CSS) Javascript Ajax IBS - SS 2009 11 • Grundlagen der Java Enterprise Technologie (JEE 5) – – – – – – – – – – Architekturmodell Java Server Pages (JSP) Unified Expression Language Tag-Bibliotheken und Tag-Dateien Servlets Struts-Framework Java Server Faces Java Naming and Directory Interface (JNDI) Persistenz von Objekten Java Enterprise Beans und zugehörige Applikationsserver IBS - SS 2009 12 • Einführung in Webservices – – – – – – – – Service-orientierte Architekturen (SOA) SOAP RESTful Webservices WSDL Webservice-Erweiterungen (WS-*) UDDI Ausführbare Geschäftsprozesse (WS-BPEL) Java WS - API IBS - SS 2009 13 XML-Grundlagen • XML – Extensible Markup Language ( Erweiterbare Auszeichnungssprache“) ” • Standard des WWW-Konsortiums (W3C) für Datenaustausch im Internet • Markupsprache für strukturierte Dokumente (ähnlich HTML, LATEX) • Meta-Sprache zur Definition von anderen Auszeichnungen, z.B. XHTML • Weiterentwickelt aus SGML (Standard Generic Markup Language, 1986) • Verbreitete Version ist XML 1.0 (von 1998), aktuelle Version ist 1.1 (2004) IBS - SS 2009 14 Beispiel für ein XML-Dokument <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <buch autor="Wilhelm Busch"> <titel> Max und Moritz </titel> <kapitel id="1"> Erster Streich. </kapitel> <kapitel id="2"> Zweiter Streich. </kapitel> </buch> Im Dokument findet man unter anderem – Tags (Auszeichnungen), z.B. <kapitel id="1">, </buch> – Elemente: buch, titel, kapitel Diese sind hierarchisch strukturiert: Anfangs-Tag Inhalt Ende-Tag – Attribute, bestehend aus Name und Wert: autor="Wilhelm Busch", id="1" IBS - SS 2009 15 Verarbeitungsanweisungen Die Zeile <?xml version="1.0" encoding="UTF-8" standalone="yes"?> ist eine Verarbeitungsanweisung. Durch eine XML-Verarbeitungsanweisung erhält der XML-Prozessor (Browser, Parser usw.) zusätzliche Informationen. Im Beispiel sind dies • Die XML-Version: 1.0 • Die Zeichencodierung im Dokument: Unicode UTF-8 • Standalone-XML-Dokumente beziehen sich nicht auf eine externe DTD An der Verarbeitung eines Dokuments können mehrere Prozessoren beteiligt sein, die jeweils spezifische Verarbeitungsanweisungen haben, z.B. ein XSLT-Prozessor: <?xml-stylesheet type="text/xsl" href="adressbuch.xsl"?> IBS - SS 2009 16 Wohlgeformtheit und Gültigkeit • Die Element- und Attributnamen in XML sind frei wählbar und haben keine vordefinierte Bedeutung (im Gegensatz etwa zu HTML). • Ein XML-Dokument heißt wohlgeformt, wenn die Tag-Schreibweise und die Klammerstruktur stimmen • Mittels Dokumenttypdefinition (DTD) oder Schema kann eine bestimmte Struktur festgeschrieben werden (nur Syntax + Typen, keine Semantik!) • Ein XML-Dokument ist gültig, wenn sein Aufbau der zugrunde liegenden DTD (bzw. dem Schema) entspricht IBS - SS 2009 17 XML-Familie XML wird auch als Oberbegriff für eine Familie von zusammenhängenden Standards verwendet. Dazu gehören insbesondere • Möglichkeiten zur Strukturspezifikation für XML-Dokumente: – DTD - Document Type Definition – XML-Schema (Nachfolger von DTD, insbesondere mit Typsystem für Dokumenteninhalte) • XSL – XML Stylesheet Language Standards zur Transformation und Präsentation von Dokumenten – XPath – XSLT – FO - Formatting Objects IBS - SS 2009 18 XML-Parser: Strukturanalyse von XML-Dokumenten • Prüfen XML-Dokumente auf Wohlgeformtheit • Prüfen XML-Dokumente auf Gültigkeit (gegen DTD oder Schema) (nicht alle Parser können das!) • Verschiedene Ausprägungen: – XML-Parser als Bestandteil von XML-Entwicklungsumgebungen – In andere Anwendungen integrierte Parser – Als Komponenten zur Nutzung aus den gängigen Programmiersprachen heraus (z.B. Java: Apache-Xerces) • Beispiel: – expat“ ist in WWW-Browser integriert (Firefox, Opera, . . . ). Zweck: ” ∗ baumartige Darstellung von XML ∗ Basis für XSLT-Transformationen – expat ist auch in PHP integriert IBS - SS 2009 19 XML-Editoren, XML-Entwicklungsumgebungen • vereinfachen die Entwicklung von XML-Dokumenten, DTDs, Schemas usw. • teilweise Unterstützung für Schema-Sprachen • teilweise Unterstützung für XSLT und CSS • auch als Plugins für universelle Entwicklungsumgebungen (z.B. Eclipse, Emacs) • Funktionsumfang sehr unterschiedlich • Unterstützung der jeweils neuesten Versionen der XML-Standards nicht immer verfügbar • Empfehlung: Die Open Source Java-Entwicklungsumgebung netbeans“ bietet ” gute Unterstützung auch für XML: http://netbeans.org • Beispiele: oXygen, cladonia exchanger, Stylus Studio • einfache Werkzeuge für Hausgebrauch“: Linux: quanta, kxmleditor, Windows: ” XML Notepad IBS - SS 2009 20 Sonstige XML-Werkzeuge • XSLT-Prozessoren – führen XSLT-Transformationen durch – Programme für serversseitige Transformationen, z.B. saxon, Apache-Xalan – Browser-seitige Prozessoren sind in neuere Browser integriert, z.B. in Firefox (TransforMiiX) und Internet Explorer • Software zur Erzeugung von PDF, Postscript, PCL usw. Apache FOP (Formatting Objects Processor) • Das XML-Toolkit für Kommandozeilen-basierte XML-Verarbeitung (http://www.cs.washington.edu/homes/suciu/XMLTK bzw. http://xmltk.sourceforge.net) IBS - SS 2009 21 XML-Dokumente • beginnen mit einer XML-Deklaration mit XML-Version und weiteren optionalen Attributen, z.B. Zeichencodierung <?xml version="1.0" encoding="UTF-8" ?> • Kernbestandteil eines Dokuments ist ein XML-Element, das Wurzelelement <buch autor="Wilhelm Busch"> ... </buch> • Groß-/Kleinschreibung wird unterschieden • Attributwerte stehen immer in Anführungszeichen • <!-- und dies ist ein Kommentar innerhalb eines Dokuments --> IBS - SS 2009 22 XML-Elemente • Jedes Element kann beliebig viele Attribute haben • einfache Elemente haben keine Unterelemente, der Inhalt ist einfacher Text <titel> Max und Moritz </titel> Wenn im Text XML-Sonderzeichen vorkommen, die aber nicht interpretiert werden sollen, muss der Text als CDATA-Abschnitt definiert werden, z.B. <![CDATA[ Dieses <Tag> wird nicht als Tag interpretiert ]]> • strukturierte Elemente haben Unterelemente (Im Beispiel: buch) • leere Elemente haben keinen Inhalt (Attribute können vorhanden sein!) Anfangs- und Ende-Tag können zusammengefasst werden, z.B. in einem XHTML-Dokument: <br /> anstelle von <br></br> IBS - SS 2009 23 Sonderzeichen Für einige Sonderzeichen, die in XML-Dokumenten eine vordefinierte Bedeutung haben, gibt es Ersatzdarstellungen, sogenannte entities“: ” Ersatzdarstellung Sonderzeichen englische Bezeichnung &amp; & ampersand“ ” &apos; ’ apostrophe“ ” &quot; " quotation mark“ ” less than“ &lt; < ” greater than“ &gt; > ” IBS - SS 2009 24 Adressbuch-Beispiel • Ein Adressbuch ist eine Sequenz von adresse-Elementen. • Eine Adresse kann mit dem leeren Element <privat /> als privater Kontakt gekennzeichnet werden. <?xml version="1.0" encoding="UTF-8" ?> <!-- Adressbuch Version 1.0 --> <adressbuch aktualisiert="1.4.2008" version="2"> <adresse> <vorname>Hugo</vorname> <nachname>Meier</nachname> <strasse>Waldweg 7</strasse> <plz>35231</plz> <ort>Dinkelsdorf</ort> <email>[email protected]</email> <tel typ="mobil">0160/987654</tel> </adresse> IBS - SS 2009 25 <adresse> <titel>Sir</titel> <vorname>Edward</vorname> <nachname>McDonerty</nachname> <strasse>Bergstrasse 13a</strasse> <plz>76522</plz> <ort>Burgstadt</ort> <tel typ="zuhause">08945/23456</tel> <privatkontakt /> </adresse> </adressbuch> IBS - SS 2009 26 DTD - Dokumenttyp-Definitionen für XML • Eine DTD legt für XML-Dokumente die syntaktische Struktur fest Die Verwendung entspricht damit einer kontextfreien Grammatik für Programmiersprachen. • Für jedes Element werden die zulässigen Attribute spezifiziert • Für jedes Element wird die Struktur des Inhalts angegeben (leer, einfach, Unterelemente) • Die DTD kann direkt im XML-Dokument stehen • Die DTD kann als separate Datei vom XML-Dokument aus referenziert werden • DTDs verwenden eine eigene Syntax. Eine DTD ist selbst kein XML-Dokument! IBS - SS 2009 27 DTD-Beispiel: Adressbuch <!-- Dateiname: adressbuch01.dtd --> <!ELEMENT adressbuch (adresse+)> <!ATTLIST adressbuch stand CDATA #REQUIRED version CDATA #IMPLIED> <!ELEMENT adresse (titel?, vorname, nachname, strasse, plz, ort, email?, tel+, privatkontakt?)> <!ELEMENT titel (#PCDATA)> <!ELEMENT vorname (#PCDATA)> <!ELEMENT nachname (#PCDATA)> <!ELEMENT strasse (#PCDATA)> <!ELEMENT plz (#PCDATA)> <!ELEMENT ort (#PCDATA)> <!ELEMENT email (#PCDATA)> <!ELEMENT tel (#PCDATA)> <!ATTLIST tel typ CDATA #REQUIRED> <!ELEMENT privatkontakt EMPTY> IBS - SS 2009 28 Struktur von XML-Dokumenten in der DTD Die Syntax von XML-Elementen wird in folgender Form festgelegt: <!ELEMENT Elementname Syntaxdefinition > Die Syntaxdefinition hat mehrere Varianten: • Für leere Elemente steht als Syntaxdefinition: EMPTY • Für einfache Elemente steht: (#PCDATA) Damit ist einfacher Text gemeint (PCDATA = parsed character data“) ” IBS - SS 2009 29 • Für strukturierte Elemente werden die Unterelemente aufgezählt: (Element1, ..., Elementn), wobei in Anlehnung an reguläre Ausdrücke folgende Notation verwedet wird: – – – – – Der Elementname alleine steht für genau ein Element Elementname? steht für ein optionales Element Elementname* steht für eine eventuell leere Sequenz von Elementen Elementname+ steht für eine nichtleere Sequenz von Elementen ¡ Syntaktische Alternativen können, mit dem |-Operator getrennt, aufgelistet werden, z.B. <!ELEMENT postadresse (wohnadresse | postfach)> <!ELEMENT wohnadresse (strasse, hausnummer) > <!ELEMENT postfach (#PCDATA)> IBS - SS 2009 30 Attribute von XML-Dokumenten in der DTD • Zu jedem Element mit Attributen stehen in der DTD eine oder mehrere Definitionen der Form <!ATTLIST Elementname Attribute > • Dabei ist Attribute eine Sequenz von Attributypdefinitionen des Elements, z.B. <!ATTLIST adressbuch stand CDATA #REQUIRED version CDATA #IMPLIED> • Eine Attributdefinition beinhaltet den Attributtyp und ggf. eine Zusatzangabe. • Die Reihenfolge der Attribute spielt weder in der DTD noch im XML-Dokument eine Rolle! IBS - SS 2009 31 • Folgende Attributtypen werden unterschieden: – Zeichenketten: CDATA – Aufzählungstypen, z.B. <!ATTLIST adresse kategorie (freunde | beruf | golfclub)> – NOTATION-Typen für externe Formate (z.B. Bildformate) <!ATTLIST person icon NOTATION (gif | jpg) #IMPLIED> – ID, IDREF, IDREFS für Definition und Verwendung eindeutiger Bezeichner – ENTITY, ENTITIES – für die Verwendung von Platzhaltern – NMTOKEN, NMTOKENS – Zeichenketten, im Gegensatz zu CDATA erweiterter Zeichenvorrat IBS - SS 2009 32 • Als Zusatzangaben zu einem Attribut sind möglich – – – – #REQUIRED für Pflichtattribute #IMPLIED für optionale Attribute (Standard-Annahme) Attributwert (dieser ist der Defaultwert) #FIXED Attributwert (fester Wert) IBS - SS 2009 33 Beispiel DTD: <!ELEMENT buchbestand (buch+)> <!ATTLIST buchbestand aktualisiert CDATA #REQUIRED version CDATA #FIXED "1.0" sprache CDATA "deutsch"> <!ELEMENT buch (autor, titel, inhalt)> <!ATTLIST buch kategorie (Sachbuch | Fachbuch | Roman) "Fachbuch" isbn ID #REQUIRED neuauflageVon IDREF "null"> XML: <buchbestand aktualisiert="1.4.2008" sprache="spanisch"> <buch isbn="2-675-54877-X"> ... </buch> <buch isbn="2-675-54856-X" neuauflageVon="2-675-54877-X"> ... </buch> <buch kategorie="Roman" isbn="3-456-98982-X"> ... </buch> ... IBS - SS 2009 34 Verwendung von DTDs in XML-Dokumenten • eher unüblich: DTD direkt im XML-Dokument: <!DOCTYPE adressbuch [ <!ELEMENT adressbuch ... <!ATTLIST adressbuch ... <!ELEMENT adresse ... ... ]> <adressbuch ... <adresse ... ... </adressbuch> IBS - SS 2009 35 • Die übliche Trennung: DTD und XML-Dokument separat DTD-Datei (adressbuch.dtd): <!ELEMENT adressbuch ... <!ATTLIST adressbuch ... <!ELEMENT adresse ... ... XML-Datei (adressbuch.xml): <!DOCTYPE adressbuch SYSTEM "adressbuch.dtd"> <!-- hier: lokale Datei, alternativ: URL einer entfernten DTD --> <adressbuch ... <adresse ... ... </adressbuch> IBS - SS 2009 36 Namensräume: Universelle Eindeutigkeit von Element- und Attributnamen Problem: Namenskollisionen in einem XML Dokument • Jeder Elementname muss innerhalb eines XML-Dokuments eindeutig sein. • Jeder Attributname muss innerhalb eines XML-Dokuments eindeutig sein. • Ein Element kann aber genauso heißen wie ein Attribut Hauptproblemfall: Unabhängig entwickelte XML-Vokabularien (Schemas, DTDs) werden im selben XML-Dokument benutzt. Beispiel: – Ein Schema definiert Kunden, ein anderes Aufträge. Beide benutzen den gleichen Elementnamen nummer“ (Kundennummer/Auftragsnummer). ” – Eine Rechnung benutzt beide Vokabularien, so dass es zu einem Namenskonflikt zwischen den beiden nummer“-Elementen kommt. ” Lösung: Benannte Namensräume mit qualifizierten Element- und Attributbezeichnern, z.B. <kunde:nummer> ... </kunde:nummer> IBS - SS 2009 37 XML-Namensraum • Sammlung von logisch zusammen gehörenden Element- und Attributdefinitionen, auch Vokabular“ ” (vgl. z.B. mit Java package) • wird durch ein Schema definiert ( target namespace“ des Schemas) ” • kann in beliebigen XML-Dokumenten verwendet werden • Ein Element/Attribut gehört zu einem oder keinem Namensraum • An der Verwendungsstelle wird der verwendete Namensraum importiert (xmlns-“Schlüsselwort“) • Import bezieht sich auf ein einzelnes Element (muss nicht Wurzelelement sein) • Die Import-Deklaration erfolgt syntaktisch als Attribut: xmlns:Kurzname=”Namensraum-IRI ” IBS - SS 2009 38 • Der Kurzname ist ein beliebig gewählter nur für die Verwendungsstelle gültiger Kurzbezeichner • Elemente/Attribute eines Namensraums werden zur Vermeidung von Namenskonflikten mit qualifizierten Namen angesprochen: NamensraumBezeichner : lokalerBezeichner , z.B. <kunde:nummer> IBS - SS 2009 39 Verwendung eines Namensraums Beispiel: • Webservices kommunizieren mittels SOAP-Nachrichten • Das Vokabular“ zur Konstruktion einer SOAP-Nachricht stellt das W3C als ” Namensraum "http://www.w3.org/2003/05/soap-envelope" bereit. • Eine SOAP-Nachricht ist ein XML-Element Envelope“ mit den ” Unterelementen Header“ und Body“ ” ” <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:Header> ... </env:Header> <env:Body> ... </env:Body> </env:Envelope> • Der Kurzbezeichner des Namensraums env ist frei gewählt • Das Envelope-Element, das den Namensraum importiert, gehört selbst zu dem Namensraum IBS - SS 2009 40 Beispiel: Verwendung zweier Namensräume in einem XML-Dokument <bestellung xmlns:produkt="http://localhost/XML/produkt" xmlns:kunde="http://localhost/XML/kunde"> <produkt:nummer>p49393</produkt:nummer> <produkt:name>JXY Rasierer VC100</produkt:name> <produkt:menge>1</produkt:menge> <produkt:preis waehrung="Euro">69,--</produkt:preis> <kunde:nummer>k2029</kunde:nummer> <kunde:name>Meier, Fritz</kunde:name> <kunde:lieferadresse>Donnerbalkenstr.14, 80111 München </kunde:lieferadresse> </bestellung> Das Wurzelelement bestellung“ und das Attribut waehrung“ gehören hier zu ” ” keinen Namensraum. IBS - SS 2009 41 Namensraum-Bezeichner • Für den eigentlichen“ (langen) Namensraum-Bezeichner wählt man die Form ” eines URI (Uniform Resource Identifier) bzw. IRI (Internationalized RI), damit weltweite Eindeutigkeit gewährleistet ist (andere Zeichenketten sind dennoch korrekt!). • Die Bindung des Kurzbezeichners kann in Unterelementen redefiniert oder gelöscht ( xmlns:x="" ) werden • Kurzbezeichner, die mit xml“ beginnen, sind für besondere Zwecke reserviert ” Beispiel: xmlns hat Schlüsselwort-Funktion • Konventionen zur besseren Lesbarkeit der XML-Dokumente beachten, z.B. xsd - Namensraum für XML-Schema-Definitionen xsi - Namensraum für XML-Schema-Verwendung (xsi=XML Schema Instance) IBS - SS 2009 42 Default-Namensraum – Höchstens ein Namensraum kann ohne Kurzname als Default-Namensraum definiert werden: xmlns=Namensraum-URI – Alle unqualifizierten Elementnamen (nicht aber Attributnamen!) gehören dann zum Default-Namensraum, im Beispiel auch bestellung“ ” Beispiel: <bestellung xmlns="http://localhost/XML/produkt" xmlns:kunde="http://localhost/XML/kunde"> <nummer>p49393</nummer> <name>JXY Rasierer VC100</name> <menge>1</menge> <preis waehrung="Euro">69,--</preis> <kunde:nummer>k2029</kunde:nummer> <kunde:name>Meier, Fritz</kunde:name> <kunde:lieferadresse>Donnerbalkenstr.14, 80111 München </kunde:lieferadresse> </bestellung> IBS - SS 2009 43 Lokale Redefintion des Default-Namensraums Namensraum-Bindungen übergeordneter Elemente können von Unterelementen redefiniert oder gelöscht werden, auch beim Default-Namensraum: <Vectra xmlns="http://www.opel.com/"> <Karosserie>...</Karosserie> <Motor xmlns="http://www.generalmotors.com/"> <!-- Motor gehört zu "http://www.generalmotors.com/" --> ... </Motor> <!-- zurück bei Opel --> <Rad>...</Rad> </Vectra> <Vectra xmlns="http://www.opel.com/"> <Karosserie>...</Karosserie> <Motor xmlns=""> <!-- Motor gehört zu keinem Namensraum --> ... </Motor> ... IBS - SS 2009 44 XML-Schema – Ersatz für DTD: Syntax + Datentypen XML-Schema ist ein Standard des W3C (http://www.w3.org/XML/Schema) als Nachfolgekonzept für DTDs. Tutorial und weiterführende Infos: http://www.w3.org/TR/xmlschema-0 IBS - SS 2009 45 Schema Anwendungsbeispiele Mit einem Schema definiert man • eine formale Sprache für eine bestimmte Anwendungsdomäne Beispiele: XHTML (neueste HTML-Version), WSDL (Schnittstellenspezifikation für Webservices), JSP (Java Server Pages), BPEL (Spezifikation von Geschäftsprozessen) • den Aufbau von Geschäftsdokumenten eines bestimmten Typs Beispiele: Auftrag, Lieferschein, Rechnung, Kundenkontakt • den Aufbau von Konfigurationsdateien für bestimmte Anwendungen Beispiele: Makefile“ für Apache Ant, Deployment-Deskriptor für ” Web-Container • und vieles mehr IBS - SS 2009 46 Schema – Grundlegende Merkmale • Schema-Syntax ist XML-Syntax → XML-Werkzeuge für Schema-Definitionen verwendbar: – validieren – visualisieren – in Datenbanken abspeichern • Komplexes Typsystem • Aufteilung komplexer Schemata auf mehrere Dateien • bessere Wiederverwendbarkeitskonzepte für Typen (extension, restriction) • Nutzung mehrerer Schemata im selben XML-Dokument IBS - SS 2009 47 Beispiel für Struktur und Verwendung eines Schema-Dokuments lokale Schema-Datei: adressbuch.xsd <?xml version="1.0" encoding="utf-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> ... Definitionen </xsd:schema> Verwendung im XML-Dokument: adressbuch.xml: <?xml version="1.0" encoding="utf-8"?> <adressbuch xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="adressbuch.xsd"> ... </adressbuch>> IBS - SS 2009 48 XML Schema: Typen • Typisiert werden Elemente und Attribute • Es gibt vordefinierte und benutzerdefinierte Typen • Es gibt einfache und komplexe Typen • Ein Attribut hat immer einfachen Typ • Ein Element mit Attributen hat immer einen komplexen Typ (auch wenn der Inhalt leer oder von einfachem Typ ist) IBS - SS 2009 49 Beispiel für Element-Definition in einem Schema <xsd:element name="adresse"> <xsd:complexType> <xsd:sequence> <xsd:element name="titel" type="xsd:string" minOccurs="0" maxOccurs="1"> <xsd:element name="vorname" type="xsd:string" /> <xsd:element name="nachname" type="xsd:string" /> ... </xsd:sequence> </xsd:complexType> </xsd:element> Der komplexe Typ des Elements adresse“ ist hier anonym. ” IBS - SS 2009 50 Beispiel: Typdefinition und Verwendung des Typs <xsd:complexType name="adressTyp"> <xsd:sequence> <xsd:element name="titel" type="xsd:string" minOccurs="0" maxOccurs="1" /> <xsd:element name="vorname" type="xsd:string" /> <xsd:element name="nachname" type="xsd:string" /> ... </xsd:sequence> </xsd:complexType> • Der benannte Typ adressTyp“ kann sowohl für Element-Definitionen als auch ” für andere Typdefinitionen als Subtyp eingesetzt werden, z.B. <xsd:element name="adresse" type="adresstyp" /> • Benannte einfache Typen sind auch in Attributdefinitionen nutzbar IBS - SS 2009 51 Beispiel für Attribut-Definitionen in einem Schema <xsd:element name="adressbuch"> <xsd:complexType> <xsd:sequence> <xsd:element name="adresse" type="adressTyp" maxOccurs="unbounded"> </xsd:sequence> <xsd:attribute name="aktualisiert" type="xsd:date" use="required" /> <xsd:attribute name="version" type="xsd:string" use="default" value="1.0" /> <xsd:attribute name="sprache" type="xsd:language" use="optional" /> </xsd:complexType> </xsd:element> In gleicher Weise kann man die Attribute auch innerhalb einer Typdefinition spezifizieren. IBS - SS 2009 52 Vordefinierte Typen für XML-Schemata (Auswahl) • xsd:string • xsd:decimal • xsd:integer • xsd:float • xsd:boolean • xsd:date • xsd:time • anyURI: Uniform Resource Identifier (URI) • language: Sprachbezeichnung, z. B. de-DE, en-US, fr • ID: Identifikationsattribut innerhalb von XML Elementen • IDREF: zur Referenzierung von ID-Attributen IBS - SS 2009 53 Benutzerdefinierte Typen (Auswahl) Benutzerdefinierte einfache Typen • xsd:restriction schränkt den Wertebereich eines Basistyps ein (z.B. Längenbeschränkungen bei Strings) • xsd:enumeration definiert einen Aufzählungstyp • xsd:list definiert eine Werteliste • xsd:union vereinigt die Wertemengen vorhandener einfacher Typen Benutzerdefinierte komplexe Typen: • xsd:sequence definiert eine feste Anordnung der Unterelemente • xsd:all definiert Unterelemente mit beliebiger Anordnung • xsd:choice definiert mehrere Varianten für die Unterelemente IBS - SS 2009 54 Einschränkungen einfacher Typen <!-- Einschränkung des Wertebereichs --> <xsd:simpleType name="smallInt"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="1" /> <xsd:maxInclusive value="100" /> </xsd:restriction> </xsd:simpleType> <!-- Einschränkung durch regulären Ausdruck --> <xsd:simpleType name="artikelNrT"> <xsd:restriction base="xsd:string"> <xsd:pattern value="[X|Y|Z]\s\d{3}-\d{5}" /> </xsd:restriction> </xsd:simpleType> IBS - SS 2009 55 <!-- Aufzählung --> <xsd:simpleType name="farbeT"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="rot" /> <xsd:enumeration value="gelb" /> <xsd:enumeration value="blau" /> </xsd:restriction> </xsd:simpleType> IBS - SS 2009 56 Listen und Vereinigung von einfachen Typen <!-- ListenTyp --> <xsd:simpleType name="farblisteT"> <xsd:list itemType="farbeT" /> </xsd:simpleType> <!-- eingeschränkter ListenTyp --> <xsd:simpleType name="dreiFarbenT"> <xsd:restriction base="farblisteT"> <xsd:length value="3" /> </xsd:restriction> </xsd:simpleType> <!-- union Typ --> <xsd:simpleType name="intOderdecimalT"> <xsd:union memberTypes="int decimal" /> </xsd:simpleType> IBS - SS 2009 57 Abgeleitete komplexe Typen • Restriction: – Einschränkungen des Wertebereichs, z.B.: Komponententyp einschränken, optionale Komponenten weglassen min/max-Occurs einschränken – eingeschränkter Typ ist Teilmenge des Basistyps – Alle Komponenten (Subelemente, Attribute), die enthalten sein sollen, müssen noch einmal explizit angegeben werden. • Extension: – Hinzufügen von Elementen/Attributen – Basistyp kann simpler oder komplexer Typ sein. (simpler Typ wird dadurch zu komplexem Typ) – Bei Erweiterung eines komplexen Typs: Man muss nur jene Komponenten angeben, die neu dazukommen. IBS - SS 2009 58 Abgeleitete Typen <xsd:complexType name="Fahrzeug"> <xsd:sequence> <xsd:element name="ps" type="xsd:positiveInteger" /> <xsd:element name="geschw" type="xsd:positiveInteger" /> <xsd:/sequence> <xsd:/complexType> <xsd:complexType name="LKW"> <xsd:complexContent> <xsd:extension base="Fahrzeug"> <xsd:sequence> <xsd:element name="nutzlast" type="xsd:positiveInteger" /> .... </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> IBS - SS 2009 59 Das Typ–Attribut: xsi:type • Typangabe im XML-Dokument an der Verwendungsstelle eines Elements • Dem Element wird damit ein vom im Schema vereinbarten Typ abgeleiteter Typ zugeordnet Beispiel: Im Schema sei der Typ von lieferung“ ein generischer Typ fahrzeug“ ” ” oder sogar völlig offengelassen (xsd:anyType) <auto:lieferliste xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:auto="http://www.expess.com/auto" datum="2000-12-12"> <lieferung xsi:type="auto:PKW"> ... </lieferung> <lieferung xsi:type="auto:LKW"> ... </lieferung> </auto:lieferliste> IBS - SS 2009 60 Ausblick: XML-Vererbungskonzepte Die XML-Vererbungskonzepte werden hier nicht im Einzelnen behandelt. Überblick • Abgeleitete Typen und xsi:type (siehe oben) • Substitutionsgruppen (substitutionGroup-Attribut) (zur Modellierung von Vererbungsbeziehung zwischen Klassen) • Abstrakte Elemente (abstract-Attribut) (zur Modellierung abstrakter Klassen) • Finale Elemente und Typen (final-Attribut) (Einschränkung von Ableitungen) • Substitutionsverbote (block-Attribut) IBS - SS 2009 61 Schema und Namensräume • Wenn das Schema einen neuen Namensraum etabliert, wird dieser als Target ” Namespace“-Attribut des Schemas angegeben: <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsd:targetNamespace="http://www.meyer.com/my"> ... • Alle neuen Definitionen des Schemas werden dann dem Zielnamensraum zugeordnet • Ein Schema muss nicht notwendigerweise einen Zielnamensraum definieren • Weiterführender Artikel: http://www.oracle.com/technology/pub/articles/srivastava namespaces.html IBS - SS 2009 62 Schema-Referenzen an der Verwendungsstelle • Verwendungsstelle eines Schemas, das einen Namensraum (als targetNamespace-Attribut) definiert: <adressbuch xmlns:="http://www.meinedomaene.de/schema/adressbuch" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.meinedomaene.de/schema/adressbuch adressbuch.xsd"> ... </adressbuch>> • Attributwert von xsi:schemaLocation ist eine Liste von Paaren, jeweils bestehend aus Namespace-URI und zugehörigem Schema-URI schemaLocation="http://meinedomaene.de/schema/adressbuch adressbuch.xsd" • Falls das Schema keinen Namensraum definiert, lautet die Referenz auf den Schema-URL wie folgt: xsi:noNamespaceSchemaLocation="adressbuch.xsd" IBS - SS 2009 63 Qualifizierte und unqualifizierte Verwendung von Namen • Die als Kindelemente des schema-Wurzelelements definierten Elemente und Attribute heißen global, die anderen lokal. • Wenn das Schema einen Namensraum definiert, muss jedes globale Element/Attribut an jeder Verwendungsstelle qualifiziert werden. Achtung: Die Qualifikation kann auch implizit durch Import als Default-Namensraum erfolgen! • Für lokale Namen kann man im Schema die Qualifikation fordern oder verbieten, z.B. <?xml version="1.0" encoding="US-ASCII"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.library.com" targetNamespace="http://www.library.com" elementFormDefault="qualified" attributeFormDefault="unqualified"> IBS - SS 2009 64 Verteilte Schemata: Import und Include • Die Definition eines Namensraums kann auf mehrere Schema-Dateien verteilt werden. Mit dem Include-Element werden die einzelnen Module in eine übergeordnete Schema-Datei eingefügt. Beispiel <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pcParts="http://www.example.de/pcParts" targetNamespace="http://www.example.de/pcParts"> ... <xsd:include schemaLocation="http://www.example.de/schema/harddisk.xsd"/> <xsd:include schemaLocation="http://www.example.de/schema/ram.xsd"/> ... </xsd:schema> IBS - SS 2009 65 • Der Import-Mechanismus ist für die Wiederverwendung anderer Namensräume innerhalb eines Schemas gedacht. Beispiel: <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pcParts="http://www.example.de/pcParts" targetNamespace="http://www.example.de/parts"> ... <xsd:import namespace="http://www.example.de/pcParts" schemaLocation="pcParts.xsd"/> ... <... <xsd:attribute name="weight" type="pcParts:weightType"/> .../> ... </xsd:schema> IBS - SS 2009 66 XSL - Extensible Stylesheet Language Sprachfamilie zur Visualisierung von XML-Dokumenten: • XSLT (XSL-Transformations) XML-Sprache zur Definition Muster-basierter Transformationsregeln für XML-Dokumente • XPath (XML Path Language) Sprache zur Selektion von Elementen und Attributen eines XML-Dokuments • XSL-FO (XSL Formatting Objekts) Sprache zur Definition von Präsentationsattributen • XPointer definiert Ausdrücke für Verweise auf externe Dokumente IBS - SS 2009 67 XSLT (XSL-Stylesheets) • Ein XSL-Stylesheet definiert Transformationsregeln für ein XML-Dokument • Zielsprachen für XSL-Transformationen: XML, HTML, XHTML, Text, PDF und andere • Ziel- und Quelldokument können beliebig voneinander abweichen! • Ein Stylesheet ist ein XML-Element <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="..."> ... </xsl:template> . . Transformationsregeln . <xsl:template match="..."> ... </xsl:template> </xsl:stylesheet> (statt xsl:stylesheet kann auch xsl:transform stehen) IBS - SS 2009 68 XSL-Stylesheets • Ein XSL-Stylesheet besteht aus einer Reihe von Transformationsregeln für die Elemente eines XML-Dokuments • Jede Regel ist ein xsl:template-Elemente ( Template“=Muster, Schablone) ” • Eine Regel besteht aus einem Selektor und einer Aktion“ ” • Selektor ist ein XPath-Ausdruck. Er bestimmt, für welche Elemente des XML-Dokuments die Regel gilt • Die Aktion“ besteht aus statischem Ausgabetext und/oder XSLT-Kommandos ” zur Erzeugung von dynamischen Teilen der Ausgabe IBS - SS 2009 69 Referenzierung von XSL-Stylesheets in XML-Dokumenten • Stylesheets werden als lokale Dateien gespeichert oder von einem Server geladen • Adressierung erfolgt über URL • Referenzierung: spezielle Verarbeitungsanweisung (s. Beispiel) • Beispiel: Stylesheet in lokaler Datei adressbuch.xsl Verwendung in XML-Dokument adressbuch.xml: <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="adressbuch.xsl"?> <adressbuch ... ... IBS - SS 2009 70 Beispiel: Erzeugung eines HTML E-Mail-Verzeichnisses aus einem Adressbuch Beispiel-Adressbuch <?xml version="1.0" encoding="UTF-8" ?> <adressbuch aktualisiert="1.4.2008" version="2"> <adresse> <vorname> Hugo </vorname> <nachname> Meier </nachname> <strasse> Waldweg 7 </strasse> <plz> 35231 </plz> <ort> Dinkelsdorf </ort> <email> [email protected] </email> <tel typ="mobil"> 0160/987654 </tel> </adresse> ... IBS - SS 2009 71 XSL-Stylesheet für Adressbuch 2 Transformationsregeln für adressbuch“ und adresse“: ” ” <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html> <body> <h1> E-Mail-Verzeichnis </h1> <table border="4"> <tr><th>Vorname</th> <th>Nachname</th> <th>E-Mail</th> </tr> <xsl:apply-templates /> </table> </body> </html> </xsl:template> IBS - SS 2009 72 <xsl:template match="adresse"> <tr> <td> <xsl:value-of select="vorname" /> </td> <td> <xsl:value-of select="nachname" /> </td> <td> <xsl:value-of select="email" /> </td> </tr> </xsl:template> </xsl:stylesheet> IBS - SS 2009 73 • Die erste Regel: <xsl:template match="/"> ... wird auf das Wurzelelement (hier: adressbuch“) angewendet. ” Der Inhalt besteht aus HTML-Text und der XSLT-Anweisung <xsl:apply-templates />. Dies bewirkt die Anwendung der Regeln auf die Kindknoten. Im Beispiel erzeugt die Regel ein HTML-Grundgerüst mit einer Tabelle für die E-Mail-Adressen. • Die zweite Regel <xsl:template match="adresse"> ... wird auf alle adresse“-Elemente angewendet. ” Im Beispiel wird für jede Adresse eine HTML-Tabellenzeile im Zieldokument geschrieben. • Die Anweisung <xsl:value-of select="..."> ... liefert den Wert des Elements, das mit dem select-Ausdruck (XPath) gewählt wird. Bei Anwendung einer Regel beziehen sich relative Pfade ( vorname“) immer ” auf den aktuell bearbeiteten Konten (aktuelles adresse“-Element). ” IBS - SS 2009 74 Ausführen der Transformation Ein XSLT-Prozessor baut zunächst den Baum zum XML-Dokument auf und führt dann die Transformationen aus. • Zum Ausführen der Transformation kann man einen eigenständigen XSLT-Prozessor, z.B. Apache Xalan verwenden: xalan -HTML -IN adressbuch.xml -XSL adressbuch2email.xsl -OUT email.html Solche Transformationen werden häufig auf Webservern benutzt, um das Ergebnisdokument anschließend an den Browser senden. • Neuere WWW-Browser (z.B. firefox 2.x, IE7) können XSLT direkt ausführen. Im Adressbuch wird dazu das XSLT verlinkt: <?xml version="1.0" encoding="UTF-8" ?> <?xml-stylesheet type="text/xsl" href="adressbuch2email.xsl"?> ... <adressbuch ... IBS - SS 2009 75 XSLT-Ausführung im WWW-Browser Browser • lädt das XML-Dokument • findet die ?xml-stylesheet-Verarbeitungsanweisung • lädt das XSLT-Dokument • führt die Transformation des XML-Dokuments aus • zeigt das resultierende HTML-Email-Verzeichnis anstelle des ursprünglichen XML direkt an IBS - SS 2009 76 XPath • Ein XPath-Ausdruck (Pfad) selektiert Teile (Elemente, Attribute) eines XML-Dokuments • XPath ist Baum-orientiert • Ein Pfad steht, z.B. für einen Knoten, einen Teilbaum oder eine Menge von Knoten im Baum • Selektionskriterien sind ggf. komplex und benutzen u.a. – – – – Positionen im Baum Knotentypen Elementnamen, Attributnamen Attributwerte • In XPath-Pfaden werden die Pfadelemente durch /“ getrennt. ” Hinweis: Für interaktive Spielereien mit XPath eignet sich das XLab: http://www.zvon.org/xxl/XPathTutorial/General ger/examples.html IBS - SS 2009 77 XML-Baumstruktur und XPath-Knotentypen Die Knotentypen: • Wurzelknoten: repräsentiert das XML-Dokument, ist Elternknoten des Wurzelelements Der Wurzelknoten repräsentiert also nicht das Wurzelelement! • Elementknoten: repräsentiert XML-Element, als Kinder können Elementknoten, Attributkoten oder Namensraum-Knoten auftreten • Attributknoten: repräsentiert Attribut mit Name und Wert • Textknoten: Zeicheninhalt, der keine anderen Knoten mehr enthält • Namensraumknoten: repräsentiert eine Namensraum-Angabe zu einem Element oder Attribut • Verarbeitungsanweisungsknoten: repräsentiert eine Verarbeitungsanweisung (Kind des Wurzelknotens) • Kommentarknoten: repräsentiert einen Kommentarinhalt IBS - SS 2009 78 XPath-Achsen • Eine Achse dient zur Auswahl einer Menge von Knoten über deren Relation zum aktuellen Knoten, z.B. wählt die child::-Achse die Kindknoten eines Knotens. • Die ausgewählten Knoten sind ab 1 durchnummeriert und können durch diesen Index gezielt selektiert werden. • Für Achsen und Pfade gibt es eine ausführliche und eine Kurz-Notation. Beispiel: ausführlich: kurz: child::adresse[1]/child::email/attribute::typ adresse[1]/email/@typ • Die nachfolgenden Baumdarstellungen (aus selfhtml.org) sind Achsen-Beispiele. Der aktuelle Knoten ist blau markiert. Die durch die Achse ausgewählten Knoten sind an ihren Nummern erkennbar. IBS - SS 2009 79 XPath-Achse child:: Kindknoten des aktuellen Knotens. IBS - SS 2009 80 XPath-Achse parent:: Elternknoten des aktuellen Knotens IBS - SS 2009 81 XPath-Achse descendant:: Alle Nachkommen des aktuellen Knotens. IBS - SS 2009 82 XPath-Achse ancestor:: Alle Vorfahren IBS - SS 2009 83 XPath-Achse following:: Alle im XML-Dokument hinter dem aktuellen Knoten stehenden Elemente IBS - SS 2009 84 XPath-Achse preceding:: Alle im XML-Dokument vor dem aktuellen Knoten stehenden Elemente IBS - SS 2009 85 XPath-Achse following-sibling:: Alle im Dokument nachfolgenden Geschwisterknoten IBS - SS 2009 86 XPath-Achse preceding-sibling:: Alle im Dokument vorangehenden Geschwisterknoten IBS - SS 2009 87 XPath-Achse self:: Der Knoten selbst IBS - SS 2009 88 XPath-Achse descendant-or-self:: Die Nachkommen und der Knoten selbst IBS - SS 2009 89 XPath-Achse ancestor-or-self:: Die Vorgänger und der Knoten selbst IBS - SS 2009 90 XPath: Kurzschreibweisen, Filter, Prädikate • Kurznotationen: / . .. // @ Wurzelknoten aktuelles Element übergeordnetes Element Kompletter Baum (descendant_or_self) Attributknoten bzw. Teilbaum • Filter: Eine Achse kann mit einem Knotentest“ als Filter erweitert werden: ” – Elementname (bei der attribute-Achse: Attributnamen) – oder *“ als Wildcard-Symbol für alle Knoten ” • Prädikate: Boolesche Ausdrücke mit diversen vordefinierten Prädikaten dienen zur Einschränkung von Knotenmengen IBS - SS 2009 91 XPath-Beispiele adresse adresse|*/adresse adresse[3] | */*[last()-1] //vorname ..|../*[1] ../@* ../@*[2] ../attribute::waehrung ../@waehrung .//kunde/*/auftrag[1] kunde[@kundenTyp] kunde[@id="275"] alle Kinder mit Namen adresse“ ” alle Kinder und Enkel mit Namen adresse“ ” 3. Kind mit Namen adresse“ und vorletzter Enkel ” alle Elemente mit Namen vorname“ ” übergeordneter Knoten und dessen 1. Kind alle Attribute des übergeordneten Knotens 2. Attribut des übergeordneten Knotens Attribut waehrung“ des übergeordneten Knotens ” Attribut waehrung“ des übergeordneten Knotens ” zu allen Kunden im Teilbaum des aktuellen Knotens das erste auftrag -Enkelelement kunde-Kind-Elemente mit kundenTyp-“-Attribut ” kunde-Kind-Elemente mit id-“-Attributwert 275 ” Daneben kann man mit Prädikaten die Selektion einschränken, z.B. //buch[count(Seite)<=100 and count(Seite)>=10] alle buch“-Elemente mit zwischen 10 und 100 Seite“-Kindern ” ” IBS - SS 2009 92 Push- und Pull-Verarbeitung Bei der Entwicklung von XSLT-Stylesheets unterscheidet man zwei Entwicklungsstile: 1. PUSH-Verarbeitung koppelt die Ausgabe-Erzeugung an Element-spezifische Regeln, deren Anwendung mit <xsl:apply-templates> veranlasst wird. 2. PULL-Verarbeitung zieht“ bei der Verarbeitung eines Elements die in den ” Substrukturen steckende Information aus dem Teilbaum heraus. Im Extremfall gibt es nur ein Template für das Wurzelement. Für den Zugriff auf die Teilbäume werden typischerweise <xsl:value-of select=...> und <xsl:foreach> benutzt. Der gewählte Stil hat starke Auswirkungen auf die Wartbarkeit der Stylesheets. Der PUSH-Stil ist i.A. zu bevorzugen. Beim Adressbuch-Beispiel oben wird die Verarbeitung der Unterelemente von adresse“ in der Regel für den Elternknoten spezifiziert. Dies ist PULL-Stil. ” IBS - SS 2009 93 XSL-Stylesheet für Adressbuch – PUSH-Stil 5 Transformationsregeln ( adressbuch“, adresse“, vorname“, nachname“, ” ” ” ” email“) ” <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="adressbuch"> . . wie oben . </xsl:template> <xsl:template match="adresse"> <tr> <xsl:apply-templates /> </tr> </xsl:template> IBS - SS 2009 94 <xsl:template match="vorname"> <td><xsl:value-of select="." /></td> </xsl:template> <xsl:template match="nachname"> <td><xsl:value-of select="." /></td> </xsl:template> <xsl:template match="email"> <td><xsl:value-of select="." /></td> </xsl:template> </xsl:stylesheet> IBS - SS 2009 95 XSL-Stylesheet für Adressbuch – PUSH-Stil <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html> <body> <h1> E-Mail-Verzeichnis </h1> <table border="4"> <tr><th>Vorname</th> <th>Nachname</th> <th>E-Mail</th> </tr> <xsl:for-each select="*"> <tr> <td><xsl:value-of select="vorname" /></td> <td><xsl:value-of select="nachname" /></td> <td><xsl:value-of select="email" /></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> IBS - SS 2009 96 Bedingte Verarbeitung in XSLT Die if-Anweisung knüpft die Verarbeitung an eine Bedingung <xsl:if test="..."> ... </xsl:if> Die choose-Anweisung erlaubt mehrere Alternativen, wobei <xsl:when test=...> dem aus vielen Programmiersprachen bekannten else if“ ” entspricht und <xsl:otherwise> dem else“. ” <xsl:choose> <xsl:when test="..."> . . . <xsl:when test="..."> <xsl:otherwise> </xsl:choose> ... </xsl:when> ... </xsl:when> ... </xsl:otherwise> IBS - SS 2009 97 xsl:for-each und xsl:sort Mit der xsl:for-each-Anweisung steht ein expliziter Iterator für Knotenmengen zur Verfügung. Damit lassen sich z.B. Unterelemente eines Knotens im PULL-Stil traversieren. Sinnvoll ist der Einsatz in Kombination mit einem Sortierkriterium, das als <xsl:sort select=...> innerhalb des xsl:for-each eingesetzt wird. IBS - SS 2009 98 Beispiel für sortierte Iteration einer Knotenmenge: auftraege.xml <?xml version="1.0" encoding="UTF-8" ?> <?xml-stylesheet type="text/xsl" href="auftrag.xsl"?> <auftraege typ="tiefbau"> <auftrag datum="2008-04-11"> <kunde> Karl Dall </kunde> <auftragsposition> 10 Bagger </auftragsposition> <auftragsposition> 1 Bauzaun </auftragsposition> </auftrag> <auftrag datum="2007-09-21"> <kunde> Hubert Winzig </kunde> <auftragsposition> 7 Bagger </auftragsposition> <auftragsposition> 1 Kran </auftragsposition> </auftrag> </auftraege> IBS - SS 2009 99 Stylesheet mit xsl:for-each und xsl:sort: auftraege.xml <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="auftraege"> <html><body> <xsl:for-each select="auftrag"> <xsl:sort select="@datum" /> <hr/> <b> Auftrag vom <xsl:value-of select="@datum" />: </b><p> <xsl:apply-templates select="auftragsposition" /> <br /> Oben stehende Auftraege sind von <b> <xsl:apply-templates select="kunde" /> </b></p> </xsl:for-each> </body></html> </xsl:template> <xsl:template match="auftragsposition"> Auftragsposition: <xsl:apply-templates /> <br/> </xsl:template> </xsl:stylesheet> IBS - SS 2009 100 Ausgabe im Browser IBS - SS 2009 101 Kopieren von Baumknoten Bei Transformationen von XML nach XML ist eine Operation zum Kopieren von Baumknoten sinnvoll <xsl:copy> ... </xsl:copy> kopiert den aktuellen Knoten (ohne Inhalt und Attribute) in das Zieldokument ( flache“ Kopie). ” Der Inhalt des xsl:copy-Elements bestimmt den Inhalt des kopierten Knotens im Zieldokument IBS - SS 2009 102 Beispiel: XML→XML, Selektion von Tabellenzeilen, xsl:copy <xsl:template match="/adressbuch"> <xsl:copy> <xsl:for-each select="//adresse[nachname=’Schmidt’]"> <xsl:copy> <xsl:apply-templates /> </xsl:copy> </xsl:for-each> </xsl:copy> </xsl:template> <xsl:template name="deepCopy" match="*"> <xsl:copy> <xsl:apply-templates /> </xsl:copy> </xsl:template> IBS - SS 2009 103 Beispiel: XML→XML, Selektion von Tabellenspalten <xsl:template match="/adressbuch"> <xsl:copy> <xsl:for-each select="//adresse[nachname=’Schmidt’]"> <xsl:copy> <xsl:apply-templates select="vorname"/> <xsl:apply-templates select="nachname"/> <xsl:apply-templates select="email"/> </xsl:copy> </xsl:for-each> </xsl:copy> </xsl:template> <xsl:template name="deepCopy" match="*"> <xsl:copy> <xsl:apply-templates /> </xsl:copy> </xsl:template> IBS - SS 2009 104 Expliziter Regelaufruf Bei xsl:apply-templates kann es zu Konflikten kommen, weil mehrere passende Regeln existieren. Nach einem (hier nicht näher behandelten) Prioritätensystem wird eine der Regeln ausgewählt. Alternativ kann man eine Regel mit einem name-Attribut mittels xsl:call-template direkt aufrufen. Beispiel: Kopieren eines adresse-Knotens (vgl. letztes Beispiel) <xsl:template match="/adressbuch"> <xsl:copy> <xsl:for-each select="//adresse[nachname=’Schmidt’]"> <xsl:copy> <xsl:call-template name="deepCopy" /> </xsl:copy> </xsl:for-each> </xsl:copy> </xsl:template> IBS - SS 2009 105 XML-Verarbeitung in Java: Optimale Unterstützung XML-Verarbeitung wird in Java besser als in jeder anderen Sprache unterstützt: • Mehrere stabile Standard-APIs (z.B. JAXP - Java API for XML, JAXB) • Mehrere ausgereifte Nonstandard-APIs (z.B. JDOM, StAX) • Ausgereifte, performante Tools (z.B. validierende Parser, XSLT-Prozessoren) • Frameworks für komplexe XML-Projekte (z.B. Cocoon) • Hervorragende Dokumentation (Bücher und Internet) Problem eines Anwendungsentwicklers: Wie verschafft man sich einen Überblick über die vielen Möglichkeiten? IBS - SS 2009 106 Überblick: Was gibt es alles? • Mehrere alternative APIs für die Erstellung und Auswertung von Dokumentenbäumen: DOM, JDOM, DOM4J – DOM steht für Document Object Model“ ” – Der Kern eines DOM ist eine normierte Baumdarstellung für Dokumente • Mehrere alternative Parsermethoden für die Dokumentenverarbeitung: – DOM-Parser (für jede DOM-Variante) konstruieren den Dokumentenbaum – SAX-Parser unterstützen die Ereignis-orientierte XML-Verarbeitung – Stream-Parser (StaX - Streaming API for XML) sind eine Weiterentwicklung des SAX-Konzepts ( Ereignis-getriebenes PULL-Parsing“) ” IBS - SS 2009 107 • XSLT-Transformationen • Repräsentationsformat-Adapter können z.B. XML-Bäume in Text umwandeln • DOM-Adapter transformieren zwischen unterschiedlichen DOM-Varianten, z.B. JDOM→DOM • SAX-Filterketten zur Modularisierung komplexer XML-Verarbeitung nach Pipes and Filters“-Prinzip ” • XSLT-Transformationsketten (siehe Concatenating Transformations with a ” Filter Chain“ http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JAXPXSLT8.html) • DTD-Verarbeitung • Cocoon-Framenwork für komplexe XML-Projekte IBS - SS 2009 108 Installation und Nutzung der APIs • JAXP (Java API for XML) – Bestandteil des JAVA-Standardsprachumfangs – beinhaltet weitere APIs als Komponenten: Schnittstellen für Parser und XSLT-Prozessoren: SAX, DOM, TrAX • Zusätzlich benötigt man eine Implementierung dieser Schnittstellen Empfehlung: Apache-Xerces für Java (DOM-/SAX-Parser, XSLT-Prozessor): Installation: – herunterladen von http://xerces.apache.org/xerces2-j/download.cgi – JAR-Archive in beliebiges Verzeichnis ablegen – CLASSPATH mit Pfaden von xercesImpl.jar und xml-apis.jar ergänzen • Auch die Nonstandard-APIs (JDOM, DOM4J, StAX) müssen gesondert installiert werden (ebenfalls jar-Archiv-Dateien) IBS - SS 2009 109 Überblick: DOM-Alternativen DOM-API des W3C • Standard: W3C-Recommendation: http://www.w3.org/DOM (Recommendation= Empfehlung“, Bezeichnung für alle Standards des W3C) ” • Standard für die Verarbeitung von XML, HTML, XHTML, Javascript, CSS u.a. • Umfangreiche Spezifikation, z.B. – Begriffsdefinitionen Dokument, Knoten, Knotentyp, Element, Attribut, Namensraum, . . . – Baumstruktur: Wie sieht der Baum zu einem Dokument aus? – Operationen zur Baumkonstruktion (z.B. Knoten erzeugen/kopieren/löschen, Kindknoten anfügen) – Operationen zum Traversieren des Baums und Auslesen von Element-Inhalten und Attributen IBS - SS 2009 110 • Spezifikation in IDL (Interface Definition Language) Programmiersprachen-unabhängig und plattformunabhängig • 3 Versionen ( Levels“) des Standards, aktuell: Level 3“. ” ” • DOM-Standard ist modularisiert – – – – – – – DOM Core DOM HTML DOM Style and Formatting – Verarbeitung von Stylesheets DOM Events – Basis für Javascript-Eventmodell DOM Traversal and Range XPath ... • In Java als JAXP-Bestandteil in der normalen Java-Distribution (JavaSE - Java Platform Standard Edition) enthalten IBS - SS 2009 111 Überblick: DOM-Alternativen JDOM-API für Java • Open-Source API für XML-Verarbeitung in Java • Funktionalität mit DOM vergleichbar, aber einfacher zu benutzen • Standardisierungsprozess JSR-102 steckengeblieben“ ” JSR=“Java Specification Request“: offizieller Standardisierungsantrag • integriert beim Parser die DOM- und SAX-APIs • Installation: Binär-Distribution herunterladen (www.jdom.org) und jdom.jar in den CLASSPATH aufnehmen DOM4J-API für Java • Weitere Open-Source API: siehe www.dom4j.org • Funktionalität mit JDOM vergleichbar IBS - SS 2009 112 Beispiel: Baumaufbau mit JDOM Unser bekanntes Adressbuch-Beispiel wird mit der JDOM-API umgesetzt. <adressbuch aktualisiert="1.4.2008"> <adresse> <vorname> Hugo </vorname> <nachname> Meier </nachname> <telefon typ="mobil"> 0160/987654 </tel> </adresse> </adressbuch> import org.jdom.Element; import org.jdom.Document; public class CreateDocument { public static void main(String[] args) { Element vorname = new Element("vorname"); vorname.addContent("Hugo"); IBS - SS 2009 113 Element nachname = new Element("nachname"); nachname.addContent("Meier"); Element telefon = new Element("telefon"); telefon.setAttribute("typ", "mobil"); telefon.addContent("0160/987654"); Element adresse = new Element("adresse"); adresse.addContent(vorname); adresse.addContent(nachname); adresse.addContent(telefon); Element adressbuch = new Element("adressbuch"); adressbuch.setAttribute("aktualisiert", "1.4.2008"); adressbuch.addContent(adresse); Document doc = new Document(adressbuch); } } IBS - SS 2009 114 Kurzformen • Die Methoden zum Füllen eines Elements (addContent, setAttribute, setText usw.) liefern alle eine Referenz auf das Element zurück • Dadurch lassen sich mehrere Aufrufe der Methoden verketten ( chaining“) ” • Beispiel: Statt Element adressbuch = new Element("adressbuch"); adressbuch.setAttribute("aktualisiert", "1.4.2008"); adressbuch.addContent(adresse); schreibt man kürzer: Element adressbuch = new Element("adressbuch") .setAttribute("aktualisiert", "1.4.2008") .adressbuch.addContent(adresse); IBS - SS 2009 115 Kurzform des Beispiels public static void main(String[] args) { /** addContent, setAttribute und Co. liefern Referenz auf Eltern-Objekt zurück ! Daher kann man die Konstruktor-Aufrufe verketten: */ Document doc = new Document( new Element ("adressbuch") .setAttribute("aktualisiert", "1.4.2008") .addContent( (Element) new Element("adresse") .addContent( (Element) new Element("vorname") .addContent("Hugo")) .addContent( (Element) new Element("nachname") .addContent("Meier")) .addContent( (Element) new Element("telefon") .setAttribute("typ", "mobil") .addContent("0160/987654")))) } IBS - SS 2009 116 JDOM versus DOM • Im Prinzip ist die Verwendung der verschiedenen DOM-APIs durchaus ähnlich • Beide DOM-Modelle können ineinander überführt werden (DOM-Adapter im JDOM-Paket) • JDOM ist einfacher und intuitiver Beispiel: Dokument und Dokumentenwurzel erzeugen mit JDOM Document doc = new Document(new Element ("adressbuch")); Das Gleiche mit DOM: DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); DOMImplementation impl = builder.getDOMImplementation(); Document doc = impl.createDocument(null, "adressbuch", null); Element element = doc.createElement("adressbuch"); IBS - SS 2009 117 XML–Parser • Ein XML-Parser ist eine Komponente eines Programms, das XML Dokumente verarbeitet • Ein Parser validiert ggf. das XML-Dokument (gegen DTD oder Schema) • Der Parser – analysiert die Struktur eines XML-Dokuments – stellt die Dokumenten-Inhalt über eine Schnittstelle zur Verfügung • Schnittstelle: DOM-Baum oder Callback-Schnittstelle für Ereignisse • XML-Parser können einfach in Java-Applikation eingebunden werden IBS - SS 2009 118 SAX, DOM, StAX 1. SAX = Simple API for XML“ ” • SAX-Parser unterstützen ein ereignisgetriebenes Programmiermodell • Beim Lesen von XML-Tags erzeugen sie Ereignisse wie startElement • An die Ereignisse kann man Callback-Methoden anknüpfen • keine Baumkonstruktion • schnell, geringer Speicherbedarf • beliebig große Dokumente verarbeitbar • Nachteil: Der Kontext eines Knotens steht in einer Callback-Methode nicht zur Verfügung. Wird Kontextinformation benötigt, muss die Anwendung deren Speicherung selbst organisieren. IBS - SS 2009 119 2. DOM-Parser • • • • Konstruieren DOM-Baum zum XML-Dokument Baum wird nach dem Parsen traversiert und weiterverarbeitet Platzbedarf: Dokument (in DOM-Form) steht komplett im Hauptspeicher Nachteil: Speicherplatz- und Geschwindigkeitsprobleme bei großen Dokumenten 3. StAX-Parser (Stream-Parser): Kompromiss zwischen SAX- und DOM-Parsern IBS - SS 2009 120 SAX – Simple API for XML • SAX definiert Java-Schnittstellen: XMLReader, ContentHandler und ErrorHandler • Der SAX-Parser implementiert: XMLReader • Die Anwendung implementiert – ContentHandler: Call-Back-Methoden für vom Parser erzeugte Ereignisse – ErrorHandler: Methoden zur Fehlerbehandlung • Verwendungsmuster: Die Anwendung – – – – erzeugt Parser-Instanz schaltet ggf. die Validierung ein registriert Content- und Fehler-Behandlungsmethoden beim Parser aktiviert Parser mit einem Dokument • Parser analysiert Dokument, ruft dabei die Behandlungsmethoden auf IBS - SS 2009 121 Beispiel: XML und zugehörige SAX-Ereignisse XML-Dokument <?xml version="1.0" encoding="ISO-8859-1"?> <wurzel> <kind alter="20">Hallo</kind> <?mark ACHTUNG ?> </wurzel> SAX-Ereignisse (mit Parametern für Callback-Aktionen) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. startDocument startElement ignorableWhitespace startElement characters endElement ignorableWhitespace processingInstruction ignorableWhitespace endElement endDocument (wurzel) (Zeilenumbruch und ””) (”kind”, alter=20) (”Hallo”) (”kind”) (Zeilenumbruch und ””) (”mark”,”ACHTUNG ”) (Zeilenumbruch) (”wurzel”) IBS - SS 2009 122 SAX-Parser in Java // allgemeine Java-Klassen import java.io.IOException; // SAX import import import mit Hilfsklassen org.xml.sax.XMLReader; org.xml.sax.InputSource; org.xml.sax.helpers.XMLReaderFactory; // Content-Callback-Schnittstelle definieren: class MeinContentHandler implements ContentHandler {...} // Fehler-Callback-Schnittstelle implementieren: class MeinErrorHandler implements ErrorHandler {...} IBS - SS 2009 123 Callback-Methoden: SAX-ContentHandler definieren class MeinContentHandler implements ContentHandler { private Locator locator; public void setDocumentLocator (Locator locator) { /** locator enthaelt die aktuelle Position im Dokument */ this.locator = locator; } public void startDocument() throws SAXException { ... } public void endDocument() throws SAXException { ... } public void startElement (String namespaceURI, String localName, String rawName, Attributes atts) ... public void endElement (String namespaceURI, String localName, String rawName) ... public void processingInstruction (String target, String data) ... public void characters (char[] ch, int start, int length) ... . . jedes Ereignis muss behandelt werden . } IBS - SS 2009 124 Fehlerbehandlungs-Methoden: ErrorHandler definieren class MeinErrorHandler implements ErrorHandler { /** Warnung ausgeben */ public void warning(SAXParseException exception) { System.err.println("**Parsing Warning**\n" + " Line: " + exception.getLineNumber() + "\n" + " URI: " + exception.getSystemId() + "\n" + " Message: " + exception.getMessage()); } /** Fehlermeldung ausgeben: Dokument wohlgeformt, nicht gültig public void error(SAXParseException exception) { System.err.println(...); } */ /** Fehlermeldung bei fatalem Fehler ausgeben. Dokument unbrauchbar public void fatalError(SAXParseException exception) { System.err.println(...); } */ } IBS - SS 2009 125 Anwendungsunabhängiger SAX-Parser-Rahmen public class MeinSAXParser { public void verarbeite (String uri) { System.out.println("Parsing XML File: " + uri + "\n\n"); ContentHandler contentHandler = new MeinContentHandler(); ErrorHandler errorHandler = new MeinErrorHandler(); try { XMLReader parser = XMLReaderFactory.createXMLReader(); parser.setContentHandler (contentHandler); parser.setErrorHandler (errorHandler); // Parser soll validieren: parser.setFeature("http://xml.org/sax/features/validation", true); // Validierung gegen Schema einschalten, da Default-Validierung gegen DTD parser.setFeature("http://apache.org/xml/features/validation/schema", true); parser.parse(uri); } catch (IOException e) { System.out.println("Error reading uri: " + e.getMessage()); } catch (SAXException e) { System.out.println("Error parsing uri: " + e.getMessage()); } } IBS - SS 2009 126 public static void main (String[] args) { if (args.length != 1) { System.out.println("usage: java MeinSAXParser [XML URI]\n"); System.exit(0); } String uri = args[0]; MeinSAXParser meinSaxParser = new MeinSAXParser (); meinSaxParser.verarbeite (uri); } } IBS - SS 2009 127 SAX-ContentHandler noch einfacher: DefaultHandler beerben • Die Klasse org.xml.sax.helpers.DefaultHandler ist eine ContentHandler-Implementierung, die alle Ereignisse ignoriert. • Ein davon abgeleiteter ContentHandler muss nur die für den Anwendungsfall interessanten Ereignisse behandeln: • Im Beispiel müssen wir statt class MeinContentHandler implements ContentHandler { ... } einfach nur folgenden Code verwenden: import org.xml.sax.helpers.DefaultHandler; class MeinContentHandler extends DefaultHandler { ... } IBS - SS 2009 128 Ausblick: SAX-Filterketten • Mit Filterketten lassen sich mehrere ContentHandler zu einer Pipeline verketten. • Ein Filter-Modul implementiert die XMLFilter-Schnittstelle. Der Nachfolger in der Kette wird als Parent-Filter bezeichnet. • Ein XMLFilter agiert wie ein XMLReader, als Eingabe-Schnittstelle wird aber eine Sequenz von SAX-Ereignissen erwartet • Die Hilfsklasse XMLFilterImpl ist ein Default-Filter, der die Ereignisse einfach durchreicht (analog zu DefaultHandler ). XML XMLReader XMLFilter XMLFilter ContentHandler ContentHandler SAX−Ereignisse SAX−Ereignisse SAX−Ereignisse IBS - SS 2009 129 Muster für DOM-Parser-Verwendung Parser erzeugen: import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; ... try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder domParser = factory.newDocumentBuilder(); catch (ParserConfigurationException e) { ... } Dokument parsen, DOM erzeugen: import org.w3c.dom.Document; import org.xml.sax.SAXParseException; ... try { Document doc = domParser.parse (uri); } catch (SAXParseException e) { ... } IBS - SS 2009 130 DOM-Beispiel: Ausgabe des vom DOM-Parser erzeugten Baums import java.io.*; import org.w3c.dom.*; /** * Klasse zur Ausgabe eines DOM-Baums. * Demonstriert die DOM-Methoden zur Baum-Traversierung */ public class DOMSerializer { /** * Gibt einen DOM-Baum auf einem Ausgabestrom (von Zeichen) aus. * @param doc DOM-Baum * @param writer Ausgabestrom */ public static void serialize(Document doc, BufferedWriter writer) throws IOException { // Rekursive Ausgabe ohne Einrückung starten. serializeNode(doc, writer, ""); writer.flush(); } IBS - SS 2009 131 /** * Gibt einen DOM-Baum eingerückt auf einem Ausgabestrom (von Zeichen) aus. * @param node DOM-Baum * @param writer Ausgabestrom * @param indentLevel aktuelle Einrückung */ private static void serializeNode(Node node, BufferedWriter writer, String indentLevel) throws IOException { // Fallunterscheidung über alle Knotentypen switch (node.getNodeType()) { case Node.DOCUMENT_NODE: writer.write("<?xml version=\"1.0\"?>"); writer.newLine(); // rekursiver Aufruf für jedes Kind NodeList nodes = node.getChildNodes(); for (int i = 0; i < nodes.getLength(); ++i) serializeNode(nodes.item(i), writer, ""); break; IBS - SS 2009 132 case Node.DOCUMENT_TYPE_NODE: DocumentType docType = (DocumentType)node; writer.write("<!DOCTYPE " + docType.getName()); if (docType.getPublicId() != null) writer.write(" PUBLIC \"" + docType.getPublicId() + "\" "); else writer.write(" SYSTEM "); writer.write("\"" + docType.getSystemId() + "\">"); writer.newLine(); break; case Node.COMMENT_NODE: writer.write("<!-- " + node.getNodeValue() + " -->"); writer.newLine(); break; case Node.PROCESSING_INSTRUCTION_NODE: writer.write("<?" + node.getNodeName() + " " + node.getNodeValue() + "?>"); writer.newLine(); break; IBS - SS 2009 133 case Node.ELEMENT_NODE: String name = node.getNodeName(); writer.write(indentLevel + "<" + name); NamedNodeMap attributes = node.getAttributes(); for (int i = 0; i < attributes.getLength(); ++i) { Node current = attributes.item(i); writer.write(" " + current.getNodeName() + "=\"" + current.getNodeValue() + "\""); } writer.write(">"); // rekursiver Aufruf für jedes Kind // für ELEMENT-Knoten -> Inhalt eingerückt auf Folgezeile(n) // für TEXT- oder CDATA-Knoten -> gleiche Zeile, hinter dem Start-Tag NodeList children = node.getChildNodes(); if (children.getLength() != 0 && children.item(0).getNodeType() == Node.ELEMENT_NODE) writer.newLine(); for (int i = 0; i < children.getLength(); ++i) serializeNode(children.item(i), writer, indentLevel + INDENT); if (children.getLength() != 0 && children.item(children.getLength()-1).getNodeType() == IBS - SS 2009 134 Node.ELEMENT_NODE) writer.write(indentLevel); writer.write("</" + name + ">"); writer.newLine(); break; case Node.TEXT_NODE: writer.write(node.getNodeValue()); break; case Node.CDATA_SECTION_NODE: writer.write("<![CDATA[" + node.getNodeValue() + "]]>"); break; case Node.ENTITY_REFERENCE_NODE: writer.write("&" + node.getNodeName() + ";"); break; } } /** Einrückung. */ private static final String INDENT = " "; } IBS - SS 2009 135 Anwendungsunabhängig: Konstruktion des DOM-Baums import import import import import java.io.*; javax.xml.parsers.DocumentBuilder; javax.xml.parsers.DocumentBuilderFactory; org.w3c.dom.Document; org.xml.sax.SAXParseException; public class DOMAusgabe { private Document erzeugeDOM (String uri) { Document doc = null; try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder domParser = factory.newDocumentBuilder(); doc = domParser.parse (uri); } catch (SAXParseException e) { System.out.println ("Error in parsing " + e.getMessage()); } catch (Exception e) { System.out.println ("Error " + e.getMessage()); } return doc; } IBS - SS 2009 136 Die main-Methode konstruiert den Baum und serialisiert ihn dann wieder public static void main (String[] args) { if (args.length != 2) { System.out.println ("usage: java DOMAusgabe [XML URI] OutputFilename"); System.exit (0); } /** Baum erzeugen */ DOMAusgabe ausgabe = new DOMAusgabe(); Document doc = ausgabe.erzeugeDOM(args[0]); /** Baum in Textform ausgeben */ try { BufferedWriter out = new BufferedWriter(new FileWriter(args[1])); DOMSerializer serializer = new DOMSerializer(); serializer.serialize(doc,out); } catch (IOException e) { e.printStackTrace(); } } } IBS - SS 2009 137 Validieren mit dem DOM-Parser Für die Validierung stehen unterschiedliche Möglichkeiten zur Verfügung, die über das DocumentBuilderFactory-Objekt konfiguriert werden können, z.B. factory.setNamespaceAware(true); factory.setValidating(true); factory.setFeature("http://xml.org/sax/features/validation", true); factory.setFeature("http://xml.org/sax/features/external-general-entities", true); factory.setFeature("http://xml.org/sax/features/external-parameter-entities", true) factory.setFeature("http://xml.org/sax/features/namespaces", true); factory.setFeature("http://apache.org/xml/features/validation/schema", true); factory.setFeature("http://apache.org/xml/features/validation/schema-full-checking" factory.setFeature("http://apache.org/xml/features/continue-after-fatal-error", tru factory.setFeature("http://apache.org/xml/features/validation/dynamic",true); IBS - SS 2009 138 Beispiel: Validierung eines Dokuments mit/ohne schemaLocation-Attribut Beispiel (Auszug): DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware( true); factory.setValidating( true); factory.setProperty( "http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse( new Inputsource( "test.xml")); Ist kein schemaLocation-Attribut vorhanden, kann man das Schema explizit angeben, z.B. factory.setProperty( "http://java.sun.com/xml/jaxp/properties/schemaSource", "file:adressen.xsd"); IBS - SS 2009 139 Alternative: Validieren mit javax.xml.validation Code-Auszug: import javax.xml.XMLConstants; import javax.xml.transform.* import javax.xml.validation.* import org.xml.sax.SAXParseException; ... try { SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); Source schemaFile = new StreamSource( new File(schemaFileName) ); Schema schema = schemaFactory.newSchema( schemaFile ); Validator validator = schema.newValidator(); StreamSource streamSource = new StreamSource( xmlFile ); validator.validate( streamSource ); } catch (SAXParseException e ) { String errStr = e.getMessage() + "\nFile: " + e.getSystemId() + "\nLine: " + e.getLineNumber(); System.err.println( errStr ); ... IBS - SS 2009 140 XSLT-Transformationen und DOM-Transformationen • Java-Transformations-APIs (TrAX) unterstützen XSLT-Transformationen • Die APIs sind als JAXP-Komponenten im Standard-Java enthalten • Der Clou dieser APIs: Quelle und Ziel einer Transformation werden in mehreren Formen unterstützt: – Text-Format (StreamSource, StreamResult) – DOM-Baum (DOMSource, DOMResult) – SAX-Ereignissequenz (SAXSource, SAXResult) Quellformat und Zielformat sind unabhängig voneinander • XSLT-Stylesheets und Format-Transformation können beliebig kombiniert werden • Transformationen ohne Stylesheets sind als Format-Adapter“ möglich ” IBS - SS 2009 141 Code-Auszug: SAX-DOM-Adapter ohne Stylesheet Document doc = domparser.parse(new File("data.xml")); // Quellformat: DOM source Source xmlsource = new DOMSource(doc); // SAX-ContentHandler instanzieren ContentHandler handler = new MyHandler(); // ContentHandler als Transformationsziel einbinden Result result = new SAXResult(handler); // Transformator erzeugen TransformerFactory xfactory = TransformerFactory.newInstance(); Transformer xformer = xfactory.newTransformer(); // Transformation: ruft die Callback-Methoden von MyHandler auf xformer.transform(xmlsource, result); IBS - SS 2009 142 Code-Auszug: XSL-Transformation mit Stylesheet Ein Stylesheet kann in allen drei Formaten eingebunden werden. Auch ein über den URL referenziertes Stylesheet ist ein StreamSource. Beispiele: • Stylesheet aus einer Datei transform007.xsl“ (→ StreamSource) ” Änderung Gegenüber dem Beispiel von oben: // XSLT-Stylesheet-Objekt aus Datei erzeugen Source xslsource = new StreamSource(new File("transform007.xsl")); // Transformator-Objekt mit XSLT-Transformation erzeugen Transformer xformer = xfactory.newTransformer(xslsource); • Verwendung eines im XML-Dokument referenzierten Stylesheet: Source xslsource = xfactory.getAssociatedStylesheet(doc, null, null, null); IBS - SS 2009 143 Komplettes Java-TraX-Beispiel für XSLT import import import import import import import import java.io.File; javax.xml.transform.Source; javax.xml.transform.Result; javax.xml.transform.Transformer; javax.xml.transform.TransformerFactory; javax.xml.transform.TransformerException; javax.xml.transform.stream.StreamSource; javax.xml.transform.stream.StreamResult; public class SimpleTransformer { public static void main(String[] args) { SimpleTransformer xslTransformer = new SimpleTransformer(); xslTransformer.transform(); } IBS - SS 2009 144 public void transform() { try { TransformerFactory tFactory = TransformerFactory.newInstance(); Source stylesheet = new StreamSource(new File("xsl/simpleStyle.xsl")); Transformer transformer = tFactory.newTransformer(stylesheet); Source inputDoc = new StreamSource(new File("xml/book.xml")); Result outputDoc = new StreamResult(new File("result/book.html")); transformer.transform(inputDoc, outputDoc); } catch (TransformerException tex) { tex.printStackTrace(); } } } IBS - SS 2009 145 StAX-Parser (Pull-Parser, Stream-Parser) • Modernste XML-Parser-Technologie, JSR 173 • StAX = Streaming API for XML“ ” • in Standard-Distribution ab Java 6 enthalten • API zum Lesen und Erzeugen von XML • Explizite Steuerung des Parsers durch die Anwendung ( Pull“-Modell) ” • Zwei Nutzungsmodelle, beides Iteratoren – Ereignis-Modell (XMLEventReader): next liefert Event“-Objekt zur ” Beschreibung der gefundenen XML-Struktur – Cursor“-Modell (XMLStreamReader): next liefert klassifizierenden Code ” zum nächsten Ereignis • Einführung: http://www.xml.com/pub/a/2003/09/17/stax.html • Referenzimplementierung von Codehaus http://stax.codehaus.org IBS - SS 2009 146 Beispiel: Auszug aus StAX-Anwendung mit Event“-Modell ” import javax.xml.stream.*; import java.net.URL; import java.io.*; public class XHTMLOutliner { public static void main(String[] args) { if (args.length == 0) { System.err.println("Usage: java XHTMLOutliner url" ); return; } String input = args[0]; try { URL u = new URL(input); InputStream in = u.openStream(); XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader parser = factory.createXMLStreamReader(in); IBS - SS 2009 147 int inHeader = 0; for (int event = parser.next(); event != XMLStreamConstants.END_DOCUMENT; event = parser.next()) { switch (event) { case XMLStreamConstants.START_ELEMENT: if (isHeader(parser.getLocalName())) { inHeader++; } break; case XMLStreamConstants.END_ELEMENT: if (isHeader(parser.getLocalName())) { inHeader--; if (inHeader == 0) System.out.println(); } break; case XMLStreamConstants.CHARACTERS: if (inHeader > 0) System.out.print(parser.getText()); break; case XMLStreamConstants.CDATA: if (inHeader > 0) System.out.print(parser.getText()); IBS - SS 2009 148 break; } // end switch } // end while parser.close(); } catch (XMLStreamException ex) { System.out.println(ex); } catch (IOException ex) { System.out.println("IOException while parsing " + input); } } IBS - SS 2009 149 WWW, HTML, HTTP, Browser: Minimalwissen Das WWW ( World Wide Web“ oder einfach nur Web“) benutzt ein einfaches ” ” Client-Server-Kommunikationsmuster zum Datenaustausch: • Ein WWW-Server kann praktisch beliebige Informationen liefern: Hypertext-Dokumente, Bilder, Videos, Software usw. • Der WWW-Browser agiert als Client und fordert die Informationen an • Die Kommunikation folgt dem REQUEST-RESPONSE-Muster ( Anfrage-Antwort“-Muster): Der Browser fragt nach der Information, der ” Server reagiert • Die Kommunikation erfolgt i.d.R. gemäß HTTP (Hypertext Transfer Protocol) • Die vom Server gelieferten Hypertextdokumente sind i.d.R. HTML oder XHTML-Dokumente IBS - SS 2009 150 HTTP - Hypertext-Transfer-Protokoll • Netzwerkprotokoll zur Übertragung von Multimedia-Inhalten“ (und sonstigen ” Informationen) • HTTP ist ein höheres“ Transportprotokoll ” • benutzt selbst TCP als niedere Transportschicht • Ein HTTP-Server ist zustandslos: Er vergisst alle Anfrage-Daten nach Beantwortung • HTTP-Nachrichten (Anfrage und Antwort) bestehen aus Kopf und Rumpf Es sind einfach strukturierte Klartext-Nachrichten. Der Rumpf kann leer sein. • In Kombination mit SSL/TLS (HTTPS) ist Verschlüsselung und Authentifizierung möglich IBS - SS 2009 151 HTTP-Request-Typen • Wichtige Requesttypen: GET, POST • Sonstige Requesttypen: HEAD, PUT, DELETE, TRACE, OPTIONS, CONNECT • Erweiterung: WebDAV (Web-based Distributed Authoring and Versioning) Standard zur Verwaltung von Dateien auf dem WWW-Server • Erweiterung: XMLHttpRequest API zur Übertragung von XML-Daten über HTTP (z.B. per Javascript) • Erweiterung: Ajax (Asynchronous JavaScript and XML) Technik zur Erhöhung der Interaktivität von Webanwendungen durch dynamisches Nachladen von partiellen Webseiten per XMLHttpRequest IBS - SS 2009 152 HTTP: Adressen • URI – Uniform (auch Universal“) Resource Identifier ” Oberbegriff für URL, URN und andere Arten von Ressourcen-Bezeichnern, z.B. http://www.example.org/praesentation.html http://www.google.com/search?hl=de&q=billiges+katzenfutter ftp://www.example.org/praesentation.pdf http://192.168.78.10:8082 https://www.studentenbank.de/homebanking mailto:[email protected] • URL – Uniform Resource Locator (Adresse einer herunterladbaren“ Informations-Ressource) ” • URN – Uniform Resource Name (Ortsunabhängiger Ressourcen-Bezeichner) IBS - SS 2009 153 • IRI – Internationalized Resource Identifier (kann auch Nicht-ASCII-Zeichen enthalten) IBS - SS 2009 154 WWW, URLs und DNS • Informationen im WWW werden über URLs adressiert • Das URL- Schema“ (http, https, ftp, . . . ) wählt das Übertragungsprotokoll ” • Der zweite URL-Teil bestimmt den Server Hier wird in der Regel das DNS (Domain Name System) benötigt – Die Kontaktaufbahme zum Server erfordert dessen TCP-Transport-Endpunkt: IP-Adresse + TCP-Portnummer – Rechnernamen wie www2.meinedomain.de müssen vom DNS-Verzeichnisdienst auf IP-Adressen abgebildet werden – Bei mailto-URLs müssen die für die Mail-Domäne zuständigen Mailserver per DNS bestimmt werden • Die Portnummer kann angegeben werden, wenn sie vom Standardport des Schemas (http: 80, https: 443, mailto: 25, usw.) abweicht IBS - SS 2009 155 Begriffe: Webseite, Homepage, Portal, Website • Webseite ( web page“): ein einzelnes HTML-Dokument ” • Website ( Webangebot“, Webpräsenz“, Internetpräsenz“): Der komplette ” ” ” Internetauftritt einer Firma, Behörde, Kommune, Institution, . . . oder auch einer Privatperson • Homepage: Einstiegsseite einer Website • Einführungsseite: Eine der Homepage vorgelagerte Seite mit geringem Informationsgehalt (oft Flash-Spielereien) • Webportal: Eine Webseite, die als Einstiegspunkt und Integrationsmechanismus für die Nutzung gebündelter Dienste dient IBS - SS 2009 156 Beispiel: HTTP-GET-Request, Google-Suchanfrage nach XML parser“ ” Anfrage-Kopf (Rumpf ist leer): GET /search?q=XML+parser HTTP/1.0 User-Agent: keinBesonderer Host: www.google.de Antwort-Kopf: HTTP/1.0 200 OK Cache-Control: private Content-Type: text/html; charset=ISO-8859-1 Set-Cookie: PREF=ID=f4000a82f78b4425:TM=1208976322:LM=1208976322:S=V expires=Fri, 23-Apr-2010 18:45:22 GMT; path=/; domain=.google.de Set-Cookie: SS=Q0=eGVyY2VzIGRvd25sb2Fk; path=/search Date: Wed, 23 Apr 2008 18:45:22 GMT Server: gws Connection: Close IBS - SS 2009 157 Antwort-Rumpf: <html> <head> <meta http-equiv=content-type content="text/html; charset=ISO-885 <title>XML parser - Google-Suche</title> </head> <body> ... </body> <html> IBS - SS 2009 158 GET-Request versus POST-Request GET-Variante: Parameter im URL GET /wiki/Spezial:Search?search=Katzen&go=Artikel HTTP/1.1 Host: de.wikipedia.org POST-Variante: Parameter im Rumpf POST /wiki/Spezial:Search HTTP/1.1 Host: de.wikipedia.org Content-Type: application/x-www-form-urlencoded Content-Length: 24 search=Katzen&go=Artikel IBS - SS 2009 159 Statuscodes 1XX Informationen 2XX Erfolgreiche Operation 3XX Umleitung 4XX Client-Fehler 5XX Server-Fehler Die Bearbeitung der Anfrage dauert trotzdem an. Die Bearbeitung der Anfrage kann durchgeführt werden. Um eine erfolgreiche Bearbeitung der Anfrage sicherzustellen, sind weitere Schritte seitens des Clients erforderlich. Nicht klar von den so genannten ServerFehlern abzugrenzen. Die Ursache des Scheiterns der Anfrage liegt jedoch eher im Verantwortungsbereich des Clients. Nicht klar von den so genannten ClientFehlern abzugrenzen. Die Ursache des Scheiterns der Anfrage liegt jedoch eher im Verantwortungsbereich des Servers. IBS - SS 2009 160 Abwicklung eines HTTP-Request durch Webbrowser Selbst ein einfacher“ Abruf eines HTML-Dokuments ist recht komplex: ” • Ziel-URL parsen und Cookie-Datenbasis durchsuchen: – Welche Cookies passen bzgl. Domäne und Pfad zum Ziel-URL? – Verfalldatum der Cookies beachten • Kopf-Daten mit Cookies zusammenstellen • Kopf-Daten und ggf. Anfrage-Rumpf an Server verschicken • Antwort lesen, ggf. Fehlerbehandlung abhängig vom Antwort-Status • Bei Status URL-Umleitung“: erneute Anfrage ” • HTML-Dokument parsen: • ggf. CSS-Formatvorlage nachladen • ggf. integrierte Bilder nachladen, dabei Cache überprüfen IBS - SS 2009 161 • ggf. Javascript onload-Aktionen ausführen, dabei Benutzereinstellungen wie URL- oder Domänen-spezifische Popup-Verbote berücksichtigen • Formatvorlage parsen und interpretieren • Inhalt rendern Zusätzliche Komplexität durch: • SSL-gesicherte Verbindungen: Zertifikatsprüfung, Sperrlistenprüfung • asynchrone Aktivitäten (AJAX) • Client-seitige DOM-Modifikationen: XSLT-Transformationen, Javascript • Applet-Ausführung IBS - SS 2009 162 XHTML/HTML – Hypertext Markup Language • W3C-Standards für Auszeichnungssprachen: HTML 4.0, XHTML 1.0 • HTML oder XHTML? – – – – XHTML 1.0 kann als Nachfolgeversion von HTML 4.0 angesehen werden XHTML ist als XML-Sprache besser verarbeitbar XHTML hat striktere Syntaxanforderungen Browserunterstützung für HTML und XHTML • Ausblick: XHTML 1.1 definiert Sprachmodule • Literaturverweis: http://www.mediaevent.de/xhtml/index.html, http://de.selfhtml.org IBS - SS 2009 163 XHTML-Beispiel <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Meine Homepage</title> </head> <body> <h1> Überschrift </h1> <p> Ein Text-Abschnitt. </p> <p> Ein weiterer Text-Abschnitt. </p> <ul> <li> Ein Listenelement. </li> <li> Und noch eines. </li> </ul> </body> </html> IBS - SS 2009 164 Wichtige Unterschiede zwischen XHTML und HTML • MIME-Typ: statt text/html: application/xhtml+xml • XML-Deklaration am Anfang: <?xml version="1.0" encoding="..." ?> • Falls DTD-Referenz verwendet wird: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> • Namensraum für html-Element zwingend: <html xmlns="http://www.w3.org/1999/xhtml"> <!-- Inhalt der Datei --> </html> IBS - SS 2009 165 • bei XHTML Kleinschreibung von Element- und Attributnamen • head- und body-Elemente zwingend • Bei allen Elementen (leere und nicht-leere) Abschluss-Tags erforderlich (z.B. img, br, li, p, body) • Attributwerte immer in Anführungszeichen • Bei Verweisen statt name-Attribut id-Attribut verwenden • Vorteile durch XML-Konformität: – Verarbeitung mit XML-Software möglich – Einbettung in andere XML-Daten möglich ( Dateninsel“, siehe nachfolgendes Beispiel) ” IBS - SS 2009 166 Beispiel: XHTML-Dateninsel in einem XML-Dokument <?xml version="1.0" encoding="ISO-8859-1" ?> <buch xmlns="http://www.meinserver.de/XML/buch"> <kapitel nummer="1"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>Einleitung</title></head> <body> <h1>Einleitung</h1> <p>Das Buch beginnt mit diesem Text...</p> </body> </html> </kapitel> </buch> IBS - SS 2009 167 HTML-Dokumentstruktur • DOCTYPE-Deklaration (optional) – Angabe zur verwendeten HTML-Version (zur Validierung gegen die Versions-spezifische DTD) • Kopf (head-Element) – Titel des Dokuments ∗ z.B. vom Browser genutzt als Fenstertitel/Reiterbeschriftung/Lesezeichen ∗ von Suchmaschinen für Index-Eintrag genutzt – Dokumentenbasis-URL – Meta-Informationen ∗ Information für Suchmaschinen ∗ HTTP-Konfiguration • Rumpf (body-Element) Inhalt des Dokuments: Text mit eingebetteten Bildern und Hyperlinks IBS - SS 2009 168 Meta-Tags: Suchmaschinen-Info und HTTP-Konfiguration Beispiel: <html> <head> <title> Johannes Brahms Homepage </title> <base href="http://www.brahms.de" /> <meta name="keywords" content="Johannes Brahms, Komponist, Biographie" /> <meta name="title" content="Johannes Brahms Homepage" /> <meta name="author" content="Johannes Brahms" /> <meta name="description" content="Lebensdaten von Johannes Brahms. " /> <meta name="robots" content="index,nofollow" /> <meta name="revisit" content="after 7 days" /> <meta http-equiv="expires" content="86400" /> <meta http-equiv="pragma" content="no-cache" /> <meta http-equiv="refresh" content="5; url=brahms-homepage.html" /> </head> <body> ... (mehr dazu: http://de.selfhtml.org/html/kopfdaten/meta.htm) IBS - SS 2009 169 Der HTML-Rumpf: Block- und Inline-Elemente Ein Blockelement dient zur Strukturierung eines Dokuments und erstreckt sich immer über komplette Zeilen. Beispiel: Paragraphen, Listen, Listenlemente, Tabellen, Formulare Ein Inline-Element dient zur Auszeichnung von Bereichen innerhalb eines Blocks bzw. einer Zeile. Beispiel: Fettschrift, Hyperlink IBS - SS 2009 170 Universalattribute Viele XHTML-Elemente haben Element-spezifische Attribute. Ein Universalattribut (Standardattribut) ist dagegen für alle (oder zumindest fast alle) Elemente definiert. Wichtige Universalattribute: class id style title CSS-Klasse für Präsentationsattribute Eindeutiger Bezeichner für Referenzen Inline-CSS-Stil-Definition Tooltip-Text (Anzeige im Browser, wenn der Mauszeiger auf Element zeigt) IBS - SS 2009 171 Anker-Element und Hyperlinks • Das Anker-Element <a> definiert einen auswählbaren Verweis (Hyperlink) und/oder ein Verweisziel. • Inhalt des Anker-Elements ist Text oder ein Bild • Ein Hyperlink verweist auf eine durch einen URL adressierte WWW-Ressource (z.B. HTML-Seite, Bild, sonstige Datei). • Ein Hyperlink wird als href -Attribut des Anker-Elements angegeben: <a href= URL > anklickbarer Text oder Bild </a> • Die Auswahl (z.B. durch Mausklick) führt z.B. – – – – bei bei bei bei HTTP-URLs zum Laden der Ressource mittels GET-Request lokalen Dateien zur Dateianzeige mailto-URLs zum Aufruf eines Mailprogramms ftp-URLs zum Aufbau einer FTP-Verbindung • Relative URL-Angaben beziehen sich auf die Dokumentenbasis, die mit dem base-Element im Kopf explizit gesetzt werden kann IBS - SS 2009 172 Beispiel: Anker als Hyperlink, Dokumentenbasis für relative Links Eine HTML-Seite mit Hyperlink-Anker: ... <head> <title> ... </title> <base href="http://homepages.fh-giessen.de/~hg52/lv/ibs" /> </head> <body> ... Die Klausurergebnisse finden Sie <a href="klausurergebnisse.txt" title="Klausurergebnisse 2008"> hier </a> • Wird im Browser der Mauszeiger auf den Text hier“ bewegt, erscheint der ” Tooltip-Text Klausurergebnisse 2008“ ” • Wird der Text hier“ per Mausklick ausgewählt, erfolgt ein HTTP-GET-Request ” für den durch Dokumentenbasis und href-Attribut spezifizierten URL: http://homepages.fh-giessen.de/~hg52/lv/ibs/klausurergebnisse.txt IBS - SS 2009 173 Beispiel: Anker als Verweisziel Eine XHTML-Datei enthält zwei Verweisziel-Anker und einen Hyperlink-Anker: <h1> <a id="kapitel1"> Kapitel 1 - Übersicht </a> </h1> ... <h1> <a id="kapitel2"> Kapitel 2 - Einleitung </a> </h1> ... <a href="#kapitel1"> zurück zur Übersicht </a> ... • Durch das id“-Attribut wird jedes Kapitel direkt anspringbar ” • Der URL eines solchen Ankers ergibt sich aus dem URL des Dokuments durch Anhängen des #-Zeichens und des Ankernamens Wenn wie im Beispiel das Verweisziel in der selben Datei liegt wie der Verweis, kann der Datei-URL weggelassen werden. • Ein Anker kann gleichzeitig als Verweis und Verweisziel genutzt werden! IBS - SS 2009 174 Häufig benutzte Standard-Block-Elemente • Überschriften verschiedener Stufen: h1, h2, . . . , h6 (h steht für heading ) • Zeilenumbruch: <br/> (break) • Paragraph: <p>...</p> • Vorformatierter Text: <pre> ... </pre> • Trennlinie: <hr/> (horizontal rule) • CSS-Container: <div> Container für beliebige Gruppierung von Block-Elementen ermöglicht Zuweisung einheitlicher CSS-Attribute, z.B. <div style="background: red;"> ... </div> IBS - SS 2009 175 Häufig benutzte Inline-Elemente • fetter Text: b (boldface), strong • kursiver Text: i (italic), em (emphasized) • CSS-Container: <span> Container für beliebige Gruppierung von Text und Inline-Elementen Verwendung wie <div>, aber als Inline-Element IBS - SS 2009 176 Aufzählungen / Listen Es gibt 3 Arten von Aufzählungen (ul, ol, dl) Element Bedeutung engl. Begriff ul ol li unnummerierte Liste nummerierte Liste Listenelement unordered list ordered list list item dl Definitionsliste definition list dt dd Begriff Erklärung defined term definition data Erläuterung Elemente ab 1 nummeriert Element von ul- ond olListe Listenelement besteht aus Begriff und Erklärung IBS - SS 2009 177 Eingebettete Bilder • Bilder können in HTML-Dateien mit dem img-Element direkt eingebettet werden, z.B. <img src="bilder/landschaft.jpg" width="300px" height="200px" alt="Landschaftsbild" title="Toskana im Sommer"/> • Ein Browser lädt eingebettete Bilder automatisch nach • Oft sollen oder können keine Bilder angezeigt werden (Textbrowser, Screenreader, Bildübertragung abgeschaltet wegen zu geringer Bandbreite). Das alt-Attribut ist ein alternativer Text, der unbedingt angegeben werden sollte. • Eingebettete Bilder können im normalen Textfluss erscheinen oder z.B. als anklickbare Hyperlinks oder alternative Listenelement-Markierungen verwendet werden. IBS - SS 2009 178 HTML-Tabellen • Eine Tabelle wird durch das table-Element spezifiziert • Eine Tabelle ist eine Folge von Tabellenzeilen: tr-Elementen (table row). • Eine Zeile besteht aus Zellen (Spalten): td-Elementen (table data) • Für die Hervorhebung einer Spaltenüberschrift kann ein th-Element (table heading) statt eines td-Elements verwendet werden. • Eine Zelle kann sich über mehrere Spalten (<td rowspan="...">) und/oder mehrere Spalten (<td colspan="...">) erstrecken. • Das table-Element hat optionale Präsentationsattribute ( width, border, cellpadding, cellspacing) Diese sind bei CSS-Verwendung überflüssig! • Die Ausrichtung des Zelleninhalts kann mit den Attributen align und valign erfolgen. Bei CSS-Verwendung entfallen diese Attribute! IBS - SS 2009 179 Beispiel <table border="1"> <tr> <th colspan="2">Die Menschheit besteht aus</th> </tr> <tr> <td>Eseln</td> <td>Affen</td> </tr> </table> IBS - SS 2009 180 HTML-Formulare • Zweck: Übermittlung von Daten zum Webserver • Übermittlung durch GET- oder POST-Requests möglich • Daten werden als Name/Wert-Paare an den Webserver weitergeleitet Beispiel: <form method="GET" action="http://www.google.de/search"> <input type="hidden" name="hl" value="de" /> <input type="hidden" name="ie" value="LATIN1" /> <input type="text" name="q" value="" size="40" maxlength="256" /> <input type="submit" name="btnG" value="Suchen" /> </form> Die Eingabe des Suchbegriffs Katze“ führt zu folgendem GET-Request: ” http://www.google.de/search?hl=de&ie=LATIN1&q=Katze&btnG=Suchen IBS - SS 2009 181 Eingabefelder in Formularen • Für kurze Texteingaben verwendet man das input-Element, z.B. <input type="text" name="Land" value="Deutschland" size="40" /> • Für Passworteingaben: <input type="password" ...> • Für größere Textbereiche verwendet man das textarea-Element, z.B. <textarea name="Anmerkungen" cols="50" rows="6" /> • Versteckte Formularfelder können anstelle von Cookies zur Übertragung von Sitzungsinformation verwendet werden: <input type="hidden" ...> • Die Schaltfläche zum Versenden des Formulars wird definiert mit <input type="submit" ...> • Eine Schaltfläche zum Rücksetzen des Formulars wird definiert mit <input type="reset" ...> • Weitere Schaltflächen für die Verwendung mit Javascript: <input type="button" ...> IBS - SS 2009 182 • Auswahllisten ermöglichen die Auswahl von einem oder mehreren Werten, ggf. mit Vorselektion <select name="Lieblingsgerichte" size="3" multiple="multiple"> <option>Pizza</option> <option selected="selected">Linseneintopf</option> ... </select> • Alternative Auswahlmöglichkeiten sind Radiobuttons für Einfachauswahl oder Checkboxen für Mehrfachauswahl, z.B. <input type="radio" name="Zahlung" value="Visa" /> Visa <br/> <input type="radio" name="Zahlung" value="Paypal" /> Paypal <br/> <input type="radio" name="Zahlung" value="Lastschrift" /> Lastschrift • Zum Hochladen einer Datei als Formularanhang dient: <input type="file" ... /> • Weitere Informationen finden Sie z.B. in http://de.selfhtml.org/html/formulare/auswahl.htm IBS - SS 2009 183 HTML-Frames • Frames sind eine umstrittene Technik zur Aufteilung des Browserfensters in eine Frameset: mehrere unabhängig nutzbare Teilbereiche • Typische Verwendung: Frameset besteht aus Navigationsbereich und Informationsbereich • Warum umstritten? – Frames sind ein Präsentationsmechanismus Die Verwendung verletzt das Prinzip der Trennung von Inhalt und Form Die Verwendung macht meist Annahmen über die Monitor-Auflösung. Frame-basierte Seiten sind z.B. oft mit einem Smartphone nicht nutzbar. – Manche Browser unterstützen Frames nicht – Verweise funktionieren oft nicht richtig (Problem: Verweis auf Frameset oder auf Einzel-Inhalt?) IBS - SS 2009 184 Eingebette Frames (iframe-Element) • Eingebettete Frames ermöglichen wie Frames die integrierte Darstellung mehrerer HTML-Seiten im selben Browserfenster • Im Gegensatz zu Frames keine starre Fensteraufteilung, sondern Integration in den Textfluss wie bei eingebetteten Grafiken • Typische Nutzung: Integration von Inhalten anderer Anbieter in das Webangebot • Weitere Info: http://de.selfhtml.org/html/frames/eingebettete.htm IBS - SS 2009 185 Formatvorlagen für HTML: CSS - Cascading Stylesheets Motivation: Trennung von Inhalt und Präsentation. Inhalt + Struktur Präsentationseigenschaften → HTML-Datei → CSS-Formatvorlage CSS-Definitionen sind Layout-Vorschriften für HTML-Elemente, z.B. • Schriftart /-größe/-farbe • Hintergrundgestaltung • Positionierung von Elementen • Textfluss • Tabellenrahmen • Listengestaltung IBS - SS 2009 186 Separate und eingebettete CSS-Definitionen CSS-Definitionen sind an unterschiedlichen Stellen möglich: • Durch ein style-Element im HTML-Kopf für das gesamte Dokument • Durch ein style-Attribut eines Elements • Durch eine separate CSS-Datei, auf die im HTML-Dokument verwiesen wird → einheitliche Gestaltung der Website durch Verwendung der selben CSS-Datei(en) für alle HTML-Dokumente Anmerkung: Für ein Webangebot können auch mehrere alternative Stylesheets angeboten werden, z.B. für Geräte mit niedriger Auflösung wie PDAs, Smartphones IBS - SS 2009 187 Beispiel: CSS-Definitionen im HTML-Kopf und im Element Für alle h1-Elemente des Dokuments und ein einzelnes h2-Element wird Schriftfarbe und Zeichengröße festgelegt: <html ...> <head> <title> ... </title> <style type="text/css"> h1 { color:red; font-size:48px; } </style> </head> <body> ... <h1> Rote Schrift </h1> <h2 style="color:blue; font-size:32px;" > Blaue Schrift </h2> ... </body> </html> IBS - SS 2009 188 Beispiel: CSS-Definitionen in separater Datei Ein externes CSS-Stylesheet wird mittels link-Element referenziert. CSS-Datei: meinformat.css h1 { color:red; font-size:48px; } HTML-Datei: <html ...> <head> <title> ... </title> <link rel="stylesheet" type="text/css" href="meinformat.css" /> </head> <body> ... <h1> Rote Schrift </h1> ... </body> </html> IBS - SS 2009 189 CSS-Begriffe • Eine Formatdefinition besteht aus Selektor und Deklaration • Der Selektor gibt an, für welche HTML-Elemente die Deklaration gilt • Im einfachsten Fall besteht ein Selektor aus einem einfachen Auswahlkriterium Einfache Auswahlkriterien Elementtyp Element-ID Klasse Pseudo-Klasse Beispiele h1, div, * #einleitung .kapitel :first-child, :hover, :visited • Auswahlkriterien lassen sich zu einfachen Selektoren kombinieren, z.B. div.kapitel, a:visited, h1#einleitung:hover. • Diverse Selektor-Operationen erlauben die Bildung komplexer Selektoren, z.B. ul li, td+td, p.kapitel[align="left"] IBS - SS 2009 190 • Deklarationen bestehen aus Paaren der Form Attributname:Attributwert Beispiele: { color:red; font-size:48px; } • Deklarationen können für den Fall von Konflikten als wichtig gekennzeichnet werden, z.B. { font-size:1em !important; } • Mehrere Selektoren können, durch Komma getrennt, an eine Deklaration gebunden werden Beispiel: h1, h2 { color:red; font-size:48px; } IBS - SS 2009 191 CSS-Beispiel <html ...> <head> <title> ... </title> <!-- einbinden externer Formatdefinitionen --> <link rel="stylesheet" type="text/css" href="formate.css"> <!-- zusätzlich dokumentenspezifische Formatdefinitionen --> <style type="text/css"> body { background-color:#FFFFCC; margin-left:100px; } * { color:blue; } h1 { font-size:300%; color:#FF0000; font-style:italic; border-bottom:solid thin black; } p,li { font-size:110%; line-height:140%; font-family:Helvetica,Arial,sans-serif; letter-spacing:0.1em; word-spacing:0.3em; } </style> </head> <body> ... </body> </html> IBS - SS 2009 192 Weitere Selektoren-Beispiele Selektor selektierte Elemente div p div > p div + p div>*>*>p p[align] p[align=center] body:first-child td:first-child + td #myid form#myid td[abbr~=Berlin] *[lang|=en] .kapitel div.kapitel :hover p-Element im Teilbaum unterhalb von div-Element p-Element als Kind eines div-Elements p-Element direkt hinter div-Element p-Element drei Ebenen unterhalb von div-Element p-Element mit align-Attribut p-Element mit align=center erstes Kind-Element eines body-Elements td-Elemente in der 2. Spalte einer Tabelle jedes Element mit der ID myid form-Element mit der ID myid td-Element, Berlin kommt im abbr-Attribut vor beliebiges Element, Attribut lang beginnt mit en“ ” alle Elemente der benutzerdefinierten Klasse kapitel alle div-Elemente der benutzerdefinierten Klasse kapitel Pseudo-Klasse für alle Elemente unter Mauszeiger IBS - SS 2009 193 Gestaltungselemente: Schriften • Serifenschriften – haben unten rechts an den Buchstaben kleine Häkchen – sind für hohe Auflösung (Bücher, Zeitungen) gut geeignet – Beispiele: Times“, Times New Roman“, Georgia“ ” ” ” • Serifenlose Schriften – sind auf dem Bildschirm besser lesbar – Beispiele: Helvetica“, Arial“, Verdana“ ” ” ” • Monospace-Schriften (im Gegensatz zu Proportionalschriften) – haben für jedes Zeichen die gleiche Breite – werden z.B. für Programmtexte gerne verwendet – Beispiel: Courier“ ” IBS - SS 2009 194 Schriften in CSS • Das CSS-Attribut font-family spezifiziert die Schriftfamilie (z.B. helvetica) oder Schriftart (z.B. mono). • Für den Fall, dass die gewünschte Schrift nicht verfügbar ist, können Alternativ-Schriften aufgezählt werden. • Weitere Attribute sind Attribut Bedeutung Beispiele font-size font-weight font-style color Größe Gewicht ( Fettigkeit“) ” Neigung Farbe xx-large, smaller, 120%, 11pt bold, lighter, 200 italic, oblique, normal blue, #c33b00 Man beachte, dass neben absoluten Angaben wie x-large“ auch relative ” Angaben wie larger“ oder 120%“ möglich sind. ” ” Mehr dazu: http://de.selfhtml.org/css/eigenschaften/schrift.htm IBS - SS 2009 195 Beispiel: Für p-Elemente soll kleine, kursive, fettere Verdana“-Schrift verwendet werden. ” Falls Verdana nicht verfügbar ist, soll der Browser irgendeine serifenlose Schrift nehmen. p { font-size: font-family: font-weight: font-style: } small; Verdana, sans-serif; bolder; italic; Für die Schriftattribute gibt es auch eine Kurzschreibweise (mit festgelegter Reihenfolge der Attribute) p { font: italic bolder small Verdana, sans-serif; } IBS - SS 2009 196 Gestaltungselemente: Listen • Elementen von ul-Listen werden i.d.R. gefüllte schwarze Kreise vorangestellt. • Mit list-style-type lassen sich andere Symbole verwenden: circle, disc, square, none • Mit list-style-image lassen sich beliebige Grafiken verwenden • Bei Grafiken kann man ein Symbol als Ersatzdarstellung angeben • Beispiel: ul { list-style-image:url("bilder/kleines-herz.gif"); list-style-type:square; } Kurzform: ul { list-style:url("bilder/kleines-herz.gif") square; } IBS - SS 2009 197 Benutzerdefinierte CSS-Klassen • In HTML-kann jedem Element eine Reihe von CSS-Formaten mit dem Universalattribut CLASS zugeordnet werden Beispiel: <style type="text/css"> .NeueSeite { ... } h1.Hinweis { ... } ... </style> ... <h1 class="NeueSeite Hinweis"> Das h1-Element im Beispiel übernimmt die Formate der CSS-Klassen – NeueSeite (globale Klasse für alle Elemente) und – h1.Hinweis (Unterklassifikation für h1-Elemente) IBS - SS 2009 198 Vererbung von Attributen • CSS-Attribute eines Elements werden prinzipiell an die Nachfolger im Dokumentenbaum vererbt • Ein Element kann geerbte Attribute aber überschreiben Beispiel: <div style="color:red;"> <ul> <li> Schriftfarbe rot, vom div-Element geerbt</li> <li style="color:green;"> Schriftfarbe gr&uuml;n </li> </ul> </div> • Die genauen Vererbungsregeln sind recht komplex Mehr dazu z.B. in http://www.thestyleworks.de/basics/inheritance.shtml IBS - SS 2009 199 Konfliktauflösung / Kaskadenmodell • Neben serversseitigen CSS-Definitionen des Web-Autors (Autoren-Stylesheet) berücksichtigt ein Browser – Benutzer-Stylesheets (z.B. Firefox: userChrome.css) – Benutzer-Voreinstellungen, sogenannte Browser-Stylesheets • Falls auf ein Element mehrere Selektoren zutreffen, kann es zu widersprüchlichen Attribut-Deklarationen kommen. • Der Algorithmus zur Konfliktauflösung heißt Kaskade“. ” IBS - SS 2009 200 Prinzipien des Kaskade-Algorithmus • Die Konfliktlösung berücksichtigt zunächst die Quelle der Deklarationen sowie eine ggf. vorhandene Kennzeichnung als important“: ” Priorität höchste geringste Quelle der Deklaration Benutzer-Stylesheet Autoren-Stylesheet Autoren-Stylesheet Benutzer-Stylesheet Browser-Stylesheet Art der Deklaration !important !important normal normal – • Bei nicht aufgelösten Konflikten wird die Spezifität der Selektoren berechnet: Ein spezifischer Selektor hat Vorrang vor einem allgemeineren Selektor Beispiele: – h1.kapitel ist spezifischer als h1 oder .kapitel – h1#kapitel1 ist wegen der ID spezifischer als h1.kapitel Mehr dazu in http://de.selfhtml.org/css/formate/kaskade.htm IBS - SS 2009 201 Boxmodell für Blockelemente • Ein Blockelement (z.B. div oder p) belegt ein Rechteck im Browserfenster. Die Größe kann mit width und height definiert werden • Der Außenabstand ( margin“) ist der Abstand des Blockelements zu seiner ” Umgebung. Bei zwei untereinander positionierten Blockelementen wird der Außenabstand nicht addiert, sondern der größere der beiden margin-Werte genommen. • Das Blockelement selbst beinhaltet einen Rahmen (Breite: border“) und einen ” Inhaltsbereich. • Der Innenabstand ( padding“) ist der Abstand zwischen dem Rahmen und ” dem Inhaltsbereich. • border, padding und margin lassen sich auch für jede Seite separat angeben, z.B. border-left, margin-bottom, padding-top IBS - SS 2009 202 Beispiel p { border:5px dotted blue; padding: 10px; margin: 10px; background: yellow; width: 100px; height: 200px; } Die Rahmendefinition border:5px dotted blue; ist eine Kurzform für border-size:5px; border-style:dotted; border-color:blue; IBS - SS 2009 203 Tabellen-Gestaltung Tabellen haben eigene CSS-Eigenschaften. Man unterscheidet dabei zwischen den Attributen der Tabelle und denen der Tabellenzellen. • Für das table-Element selbst kann u.a. der Rahmen, die Breite und der Abstand zwischen den Zellen (border-spacing) festgelegt werden • Das Attribut table-layout beeinflusst die Berechnung der Spaltenbreite Diese kann fest (fixed) oder vom Zellinhalt abhängig (auto) definiert sein. • Mit caption-side wird die Position der Tabellenbeschriftung definiert • Für die einzelnen Tabellenzellen können ebenfalls Rahmen und Innenabstand definiert werden. Hinzu kommen Attribute für die Textausrichtung innerhalb der Zelle: – text-align – horizontale Ausrichtung – vertical-align – vertikale Ausrichtung Mehr dazu: http://de.selfhtml.org/css/eigenschaften/tabellen.htm IBS - SS 2009 204 Seitengestaltung mit CSS • Das div-Element ist die Basis für eine CSS-Seitengestaltung. Beispiel: Für eine Seitenaufteilung in Navigationsbereich (links), Kopfbereich, Fußbereich und Inhaltsbereich definiert man 4 entsprechende div-Elemente • Die Bereiche lassen sich mit dem position-Attribut positionieren: – gemäß normalem Textfluss (position:static, Normalfall) – relativ zueinander, mit festgelegter (horizontaler und vertikaler) Distanz: position:relative – relativ zum Container-Element und unabhängig von den anderen Bereichen position:absolute – absolut im Browserfenster: position:fixed • Bei Überschneidungen lassen sich Sichtbarkeitsebenen definieren (z-index-Attribut) IBS - SS 2009 205 Positionierungsattribute position top left bottom right width min-width max-width height min-height max-height overflow direction float clear z-index display visibility clip Mehr dazu: Positionsart Startposition von oben Startposition von links Startposition von unten Startposition von rechts Breite Mindestbreite Maximalbreite Höhe Mindesthöhe Maximalhöhe Elementbereich mit übergroßem Inhalt Richtung Textumfluss Fortsetzung bei Textumfluss Schichtposition bei Überlappung Anzeigeart bzw. Nichtanzeige ohne Platzhalter Anzeige bzw. Nichtanzeige mit Platzhalter Anzeigebereich eingrenzen http://de.selfhtml.org/css/eigenschaften/positionierung.htm IBS - SS 2009 206 HTML/CSS/Javascript-Entwicklungswerkzeug: Mozilla Firebug • Mozilla Firebug ist ein Browser-Plugin für Mozilla-Browser, z.B. für Firefox • Firebug vereint mehrere Werkzeuge für HTTP, HTML, CSS und Javascript • WWW-Adresse: https://addons.mozilla.org/de/firefox/addon/1843 • Wichtige Funktionen: – – – – HTTP-Debugger HTML-Debugger DOM Inspector“ zur Untersuchung des DOM-Baums eines Elements ” CSS-Entwicklungswerkzeug: ∗ zeigt zu jedem Element CSS-Style-Attribute, Konflikte und Quellen ∗ zeigt Box-Layout an ∗ Stylesheet-Debugger – Javascript-Debugger IBS - SS 2009 207 Javascript • Javascript ist eine vom WWW-Browser interpretierte Scriptsprache • Typische Verwendung: – Erweiterung der GUI-Möglichkeiten durch dynamische Elemente – Prüfung von Formulareingaben vor der Übermittlung • Syntax zwar an C/Java angelehnt, ansonsten aber kein Bezug zu Java • Name/Geschichte – – – – Entwicklung durch Netscape Standardisierung als ECMA-Script (durch ECMA International) Javascript ist eine Marke von Sun Microsystems Microsoft nennt die Sprache JScript IBS - SS 2009 208 Javascript Grundkonzepte • Sandbox“-Konzept: Kein Zugriff auf lokale Ressourcen ” • Interpretation im Browser abschaltbar • prozedurale und objektorientierte Elemente • Verarbeitung von XML- und HTML-Dokumenten mit verschiedenen DOM-APIs • Vordefinierte Objekte und Operationen für – Erfragen von Umgebungsinformaionen (Browser, Uhrzeit usw.) – Ein-/Ausgabe – Fensterverwaltung IBS - SS 2009 209 Einbettung von Javascript in HTML • In HTML eingebettete Anweisungen: <script type="text/javascript"> ... Anweisungen ... </script> • Einbindung separater Skriptdateien in HTML <script type="text/javascript" src="meinscript.js" /> • Alternativer Text für nicht interpretierende Browser <noscript> ... alternativer Text ... </noscript> • Für ältere Browser nötig: Scriptcode in Kommentar einbetten, damit er nicht als vermeintliches HTML angezeigt wird <script type="text/javascript"> <!-... Anweisungen ... --> </script> IBS - SS 2009 210 Ausführung der Script-Anweisungen • Im HTML-Kopf oder -Rumpf eingebetteter Code wird vor dem Anzeigen der Seite ausgeführt. • Die Ausführung kann aber auch Browser- bzw. GUI-Ereignisse gebunden werden, z.B. – Beim Laden der Seite: <body onload=" ... Script-Code ..."> – Bei Selektion eines Hyperlinks <a href="javascript:history.back();"> Geh hin wo Du herkommst </a> – Beim Absenden eines Formulars <form onsubmit="CheckInput();" ... > – Bei Mausklick auf ein (fast beliebiges) Element <img src="bild-klein.jpg" onclick="ZeigeBildVolleGroesse();" > IBS - SS 2009 211 Javascript-Beispiel • Im HTML-Kopf wird eine Funktion definiert: zeigeDatum • Der Aufruf erfolgt durch ein im Rumpf eingebettetes script-Element • Der Aufruf verändert das Dokument ( dynamisches“ HTML) ” • Die angezeigte HTML-Seite besteht aus – einer dynamisch mit document.write(...) erzeugten Überschrift – einem statischen Teil <p>Aktuelle Nachrichten ...</p> IBS - SS 2009 212 <html> <head> <title> Datum-Beispiel </title> <script type="text/javascript"> function zeigeDatum () { var datum = new Date(); var tag = datum.getDate(); var monat = datum.getMonth() + 1; var jahr = datum.getFullYear(); var nullVorTag = ((tag < 10) ? "0" : ""); var nullVorMonat = ((monat < 10) ? ".0" : "."); var datumString = nullVorTag + tag + nullVorMonat + monat + "." + jahr; document.write("<h1>" + datumString + "<\/h1>") } </script> </head> <body> <script type="text/javascript"> <p>Aktuelle Nachrichten ...</p> </body></html> zeigeDatum(); </script> IBS - SS 2009 213 Javascript-Sprachelemente • Die Sprache hat kein strenges Typsystem wie Java • prozedurale Elemente: – Funktionen – lokale und globale Variablen – Operatoren, Anweisungen und Kontrollstrukturen ähnlich C/Java • OO-Elemente – – – – – vordefinierte und benutzerdefinierte Objekte vordefiniert: DOM-Klassen und Objekte (z.B. document, Node) sonstige vordefinierte Klassen (z.B. Object, String , Date, Array ) keine benutzerdefinierbaren Klassen Vererbung mit unüblichen“ Methoden ( Prototypes“, Closures) ” ” IBS - SS 2009 214 Funktionen in Javascript • Funktionen haben – – – – Parameter (Objekte sind Referenzparameter, ansonsten Wertparameter) einen Resultatswert lokale Variablen (mit var deklariert) einen ausführbaren Rumpf • Es gibt anonyme Funktionen, z.B. function (n) { n++; } • Funktionsdefinitionen sind schachtelbar IBS - SS 2009 215 Objekte in Javascript • Ein Objekt ist eine assoziative Liste von Attributen (Name/Wert) • Der Attributname ist ein String, der Wert von beliebigem Typ • Ist der Attributwert eine Funktion, heißt das Attribut auch Methode“ ” • Objekte können mit dem new -Operator erzeugt werden, z.B. var zaehler = new Object(); zaehler.wert zaehler.setze zaehler.erhoehe zaehler.zeige = = = = 0; function (i) { this.wert = i; }; function () { this.wert++; }; function () { alert(this.wert); }; Das Objekt zaehler hat das Attribut wert und Methoden: setze, erhoehe, zeige IBS - SS 2009 216 Konstruktoren • new erzeugt ein neues Objekt Funktionen können in Verbindung mit new als Konstruktoren für benutzerdefinierte Objekte genutzt werden, z.B. function Zaehler this.wert = this.setze = this.erhoehe = this.zeige = } (initWert) { initWert; function (i) { this.wert = i; }; function () { this.wert++; }; function () { alert(this.wert); }; var zaehler = new Zaehler(0); zaehler.erhoehe(); zaehler.zeige(); IBS - SS 2009 217 Objekte sind assoziative Listen • Objektdefinition mit der Schreibweise assoziativer Listen: var zaehler = { wert setze erhoehe zeige }; : : : : 0, function (i) { this.wert = i; }, function () { this.wert++; }, function () { alert(this.wert); } • Attribut-Zugriff (Methodenzugriff) mit der Schreibweise assoziativer Listen: statt zaehler.setze(14) verwendet man auch zaehler["setze"](14) • Objektverarbeitung mit dem Iterator für assoziative Listen for (attr in zaehler) { alert("Name: " + attr + " Wert: " + zaehler[attr] + " Typ: " + typeof(attr)); } Beachte: Mit der klassischen Schreibweise (obj.attr) geht das nicht! IBS - SS 2009 218 Prototypen: Vererbung“ in Javascript ” • Jedes Objekt obj hat ein Attribut obj.prototype • Der Wert des Prototypen ist selbst ein beliebiges, frei zuweisbares Objekt • obj.prototype vererbt“ seine Attribute an obj, d.h. ” Wenn obj.attr undefiniert ist, wird stattdessen obj.prototype.attr ausgewertet • Beispiel: Zwei Zähler-Objekte mit individuellen wert-Attributen var zaehlerPrototype = { setze : function (i) { this.wert = i; }, erhoehe : function () { this.wert++; }, zeige : function () { alert(this.wert); } }; var z1 = { wert : 0, prototype : zaehlerPrototype }; var z2 = { wert : 0, prototype : zaehlerPrototype }; • Vorteil: Der Speicherplatz für die Prototype-Attribute wird gemeinsam benutzt IBS - SS 2009 219 Felder in Javascript • Felder sind Objekte der Klasse Array • Sie bestehen aus einer dynamisch veränderbaren Anzahl von Elementen • Die einzelnen Elemente können unterschiedliche Typen haben • Die Elemente werden durch Index selektiert (ab 0 aufwärts) • Die Deklaration erfolgt mit dem new -Operator oder durch ein Literal, z.B. feld1 = new Array(3); feld2 = new Array(); feld3 = ["rot", "gruen", 127]; • uninitialisierte Feldelemente haben den Wert undefined IBS - SS 2009 220 Javascript-DOM • Mit Javascript kann man u.a. – – – – Browserfenster öffnen und schließen Web-Seiten laden beliebige Teile von HTML-Dokumenten selektieren HTML-Dokumente verändern • Grundlage ist das Javascript-DOM-Modell mit den Objekten window, window.document, window.navigator • HTML-Dokumente lassen manipulieren: – auf der Baum-Ebene ∗ durch Methodenaufrufe, z.B. element.appendChild(...) ∗ durch Wertzuweisungen an die DOM-Objekte, z.B. – document.body.firstChild = neuerParagraph durch Schreiben von HTML-Text mit document.write(...) IBS - SS 2009 221 Problemfall: Verschiedene DOM-Modelle und DOM-Versionen • mehrere DOM-Varianten aus historischen Gründen, dadurch alternative Codierungsmöglichkeiten • Das W3C-DOM für XML – modernstes DOM – einheitliche Verarbeitung von HTML und XML – wird von alten Browsern nicht unterstützt • Das einfachere HTML-DOM (ebenfalls ein W3C-Standard) – stark verbreitet und von den meisten Browsern unterstützt – eingeschränkte Baumknoten-Selektion – erlaubt oft etwas kürzeren Code • Die Microsoft-DOM-API – erlaubt oft etwas kürzeren Code – ist nicht standardisiert – wird nicht von allen Browsern implementiert IBS - SS 2009 222 Das aktuelle DOM: XML-W3C-DOM level 3 in Javascript Ein Baumknoten ist ein Node-Objekt mit folgenden Attributen: childNodes data firstChild lastChild nextSibling nodeName nodeType nodeValue parentNode previousSibling Kindknoten Zeichendaten erster Kindknoten letzter Kindknoten nächster Knoten auf derselben Ebene Name des Knotens Knotentyp Wert/Inhalt des Knotens Elternknoten vorheriger Knoten auf derselben Ebene IBS - SS 2009 223 W3C-DOM-Methoden appendChild() appendData() cloneNode() deleteData() getAttribute() getAttributeNode() getElementsByTagName() hasChildNodes() insertBefore() insertData() removeAttribute() removeAttributeNode() removeChild() replaceChild() replaceData() setAttribute() setAttributeNode() Kindknoten hinzufügen Zeichendaten hinzufügen Knoten kopieren Zeichendaten löschen Wert eines Attributknotens ermitteln Attributknoten ermitteln Zugriff auf Kindelemente über den Elementnamen auf Kindknoten prüfen Knoten einfügen Zeichendaten einfügen Attribut löschen Attributknoten löschen Knoten löschen Kindknoten ersetzen Zeichendaten ersetzen Wert eines Attributknotens setzen Attributknote erzeugen IBS - SS 2009 224 DOM-Mix in Javascript: problematisch, aber üblich Beispiel: alert(window.document.body.firstChild.innerHTML); • Die Objekte window und window.document sind Javascript-Standardobjekte • Das body-Attribut gehört zum HTML-DOM. • Das firstChild-Attribut gehört zum XML-DOM Die XML-DOM-Notation für document.body ist document.getElementsByTagName("body")[0] • Das innerHTML-Attribut ist eine nicht standardisierte Microsoft-Erweiterung Ein standardisiertes direktes Äquivalent gibt es nicht! Fazit: Komplexer Javascript-Code erfordert Browser-abhängige Varianten IBS - SS 2009 225 Das globale DOM-Objekt window“ ” • window ist die Wurzel der Javascript-DOM-Hierarchie • repräsentiert das Browser-Fenster • Einige Attribute: name, outerHeight, status • Einige Methoden: open alert confirm home moveTo neues Fenster öffnen Meldung anzeigen Bestätigung holen zur Startseite verschieben • Unterobjekte: document navigator history event location DOM-Baum der aktuellen Seite Browser-Objekt Liste besuchter Seiten Details zu Tastatur- oder Mausereignis URI des Dokuments IBS - SS 2009 226 Beispiel <html> <head> <title> Test </title> <script type="text/javascript"> function FensterOeffnen (Adresse) { MeinFenster = window.open(Adresse, "Zweitfenster", "width=300,height=200,scrollbars=yes"); MeinFenster.focus(); } </script> </head> <body> <a href="datei2.htm" onclick="FensterOeffnen(this.href); return false"> Neues Fenster </a> </body> </html> IBS - SS 2009 227 DOM-Objekt window.document“ ” • document repräsentiert die aktuelle HTML-Seite • Mit vordefinierten Methoden können Knoten im DOM-Baum selektiert und der Baum verändert werden <html> <head> <title>Test</title> </head> <body> <div id="Bereich" style="border:1px black solid; padding:10px"></div> <script type="text/javascript"> var ueberschrift = document.createElement("h1"); var text = document.createTextNode("dynamische Seite"); ueberschrift.appendChild(text); var ausgabebereich = document.getElementById("Bereich"); ausgabebereich.appendChild(ueberschrift); </script> </body> </html> IBS - SS 2009 228 DOM-Beispiel: HTML-Tabelle aufbauen function start() { var body = document.getElementsByTagName("body")[0]; var tbl = document.createElement("table"); for (var j = 0; j < 2; j++) { var row = document.createElement("tr"); for (var i = 0; i < 2; i++) { var cell = document.createElement("td"); var cellText = document.createTextNode("Zelle[" + j + ", " + i + "]"); cell.appendChild(cellText); row.appendChild(cell); } tbl.appendChild(row); } body.appendChild(tbl); tbl.setAttribute("border", "2"); } IBS - SS 2009 229 Wichtige Methoden von window.document • document.write Anstatt mit den Baumfunktionen dynamischen Inhalt zu erzeugen, kann man mit dieser Methode HTML-Code dynamisch einfügen document.writeln("<ul><li> dynamisch eingefuegte Liste </li></ul>"); • document.getElementById Element über eindeutiges ID-Attribut selektieren • document.getElementsByTagName Element über Elementtyp selektieren, liefert ein Feld IBS - SS 2009 230 Beispiel zur Elementselektion <html> <head> ... </head> <body> <div id="einleitung" title="Einleitung"> Dies ist die Einleitung </div> </body> Folgende Ausdrücke sind austauschbare Selektionen dieses div-Elements: document.getElementById("einleitung") document.getElementsByTagName("div")[0] document.getElementsByTagName("body")[0].firstChild IBS - SS 2009 231 HTML-DOM: HTML-Element-Objekte • HTML-DOM ist HTML-spezifisch, lässt sich also nicht für XML verwenden • Methoden/Attribute dieses DOM erkennt man an HTML-spezifischen Namen • Ein HTML-Elementobjekt hat universelle und Element-spezifische Attribute und/oder Methoden Beispiele: Elementtyp Attribut-Beispiele Methoden-Beispiele alle html h1 img input form a id, title, className version align height, border, src value, form, type method, action href select, click submit, reset focus IBS - SS 2009 232 Selektion von HTML-Elementobjekte über Elementtyp oder name-Attribut • Elemente werden oft gemäß HTML-DOM mit dem Elementtyp selektiert, z.B. document.body Achtung: Dies geht nur bei einigen Elementtypen • Elemente werden oft gemäß HTML-DOM mit dem Wert des name-Attributs selektiert, z.B. formular.vorname Achtung: – das Name-Attribut muss nicht eindeutig sein – seine Verwendung wird ab XHTML 1.1 sehr eingeschränkt besser: formular.getElementsByName("vorname")[0] noch besser: id verwenden IBS - SS 2009 233 Beispiel für Attributzugriff: Tooltip-Text (title-Attribut) HTML-DOM: function aendereTooltip (element, neuerText) { var alterText = element.title; element.title = neuerText; return alterText; } W3C-XML-DOM: function aendereTooltip (element, neuerText) { var alterText = element.getAttribute("title"); element.setAttributeNode("title",neuerText); return alterText; } IBS - SS 2009 234 Ereignisse zur Anbindung von Javascript-Aktionen onabort onblur onchange onclick ondblclick onerror onfocus onkeydown onkeypress onkeyup onload onmousedown onmousemove onmouseout onmouseover onmouseup onreset onselect onsubmit onunload bei Abbruch des Ladevorgangs beim Verlassen des aktiven Elements bei erfolgter Änderung eines Formularfelds beim Anklicken eines Elements bei doppeltem Anklicken im Fehlerfall (beim Laden von Bildern) beim Aktivieren (Formularfelder, Links) beim Herunterdrücken einer Taste bei Drücken einer Taste bei Loslassen einer Taste beim Laden einer Datei bei gedrückter Maustaste bei weiterbewegter Maus beim Verlassen des Elements mit der Maus beim Überfahren des Elements mit der Maus bei losgelassener Maustaste beim Zurücksetzen des Formulars beim Selektieren von Text beim Absenden des Formulars beim Verlassen der Datei IBS - SS 2009 235 Beispiel: CSS-Stil dynamisch ändern <html> <head> <title>Test</title> <style type="text/css"> .hinterlegt { background-color:green } </style> <script type="text/javascript"> function stilAendern () { var elemente = document.getElementsByTagName("li"); for (var i = 0; i < elemente.length; i++) if (i % 2 != 0) { elemente[i].className = "hinterlegt"; elemente[i].type = "I"; // römische Ziffern } } </script> </head> IBS - SS 2009 236 <body> <ol> <li>Ein <li>Ein <li>Ein <li>Ein <li>Ein <li>Ein </ol> ungerader Listenpunkt</li> gerader Listenpunkt</li> ungerader Listenpunkt</li> gerader Listenpunkt</li> ungerader Listenpunkt</li> gerader Listenpunkt</li> <a href="javascript:stilAendern()">gerade Listenpunkte hinterlegen!</a> </body> </html> IBS - SS 2009 237 Beispiel: Dynamische Längenanpassung eines Eingabefelds <html> <head> <title>Test</title> <script type="text/javascript"> var Breite = 3; function erweitern () { Breite += 1; document.getElementById("Eingabe").size = Breite; } </script> </head> <body> <form id="Formular"> Geben Sie Text ein:<br> <input type="text" size="3" id="Eingabe" onkeypress="erweitern();"> </form> </body> </html> IBS - SS 2009 238 Beispiel: Formular-Validierung <html> <head> <title>Formulareingaben &uuml;berpr&uuml;fen</title> <script type="text/javascript"> function pruefe (form) { if (form.Name.value == "") { alert("Bitte Ihren Namen eingeben!"); form.Name.focus(); return false; } if (form.Mail.value.indexOf("@") == -1) { alert("Keine E-Mail-Adresse!"); form.Mail.focus(); return false; } var alter=form.Alter.value; if (parseInt(alter) != alter ) { alert("Altersangabe fehlt oder ist keine Zahl!"); form.Alter.focus(); return false; } } </script> </head> IBS - SS 2009 239 <body> <h1>Formular</h1> <form id="Formular" action="http://de.selfhtml.org/cgi-bin/formview.pl" method="post" onsubmit="return pruefe(this)" > <pre> Name: <input type="text" size="40" name="Name"> E-Mail: <input type="text" size="40" name="Mail"> Alter: <input type="text" size="40" name="Alter"> Formular: <input type="submit" value="Absenden"> <input type="reset" value="Abbrechen"> </pre> </form> </body> </html> IBS - SS 2009 240 Javascript-Beispiel mit Objektdefinition: <html><head><title>Test</title> <script type="text/javascript"> function Farbe (rot, gruen, blau) { this.r = rot; this.g = gruen; this.b = blau; this.toString = function (){ return "#"+this.r+this.g+this.b; } } function farbeWechseln () { var hellgruen = new Farbe("E0", "FF", "E0"); document.bgColor = hellgruen.toString(); } </script></head> <body bgcolor="#FFFFFF"> <h1>Das eigene Farb-Objekt mit JavaScript</h1> <a href="javascript:farbeWechseln()">Hintergrundfarbe wechseln</a> </body> </html> IBS - SS 2009 241 Cookies in Javascript Das vordefinierte document-Attribut cookie erlaubt den Zugriff auf Cookies. Beispiel: <script type="text/javascript"> var ablauf = new Date(); var infuenfTagen = ablauf.getTime() + (5 * 24 * 60 * 60 * 1000); ablauf.setTime(infuenfTagen); if (navigator.cookieEnabled){ document.cookie = "name=SELFHTML; expires=" + ablauf.toGMTString(); alert(document.cookie); } </script> IBS - SS 2009 242 Ajax • Ajax = Asynchroneous Javascript + CSS + DOM + XMLHttpRequest“ ” • Ajax ist eine Sammlung von Techniken, um die Benutzerschnittstelle Browser-basierter Anwendungen agiler zu gestalten • Ajax ersetzt das übliche starre Kommunikationsschema: Formular abschicken – neue HTML-Seite empfangen – Bildschirm neu aufbauen • Stattdessen: – beliebig feinkörnige Übertragung von Serverdaten im Hintergrund (typisch: einzelne HTML-Elemente als XML-DOM-Baum) – mit partieller Seitenaktualiserung nach Empfang (mit den Javascript-DOM-Operationen) • Bekannte Anwendungen: Google-Maps (maps.google.com), Google Suggest (www.google.de/webhp?complete=1), Google Mail (mail.google.com) IBS - SS 2009 243 Beispiel: Online-Landkarten • Eine Webanwendung zeigt einen Kartenausschnitt. Der Benutzer verschiebt die Karte, ein neuer Ausschnitt muss angezeigt werden. • Klassische Interaktion: Neue Koordinaten an Server übertragen, mit GET-Request komplett neuen Kartenausschnitt laden und anzeigen (Beispiel: Wanderwege Tirol, http://gis2.tirol.gv.at/scripts/esrimap.dll?Name=wander&Cmd=Start) • Ajax: Das Kartenbild ist in kleine Teilbilder zerlegt, diese werden (über CSS-Attribute) zu einem Kartenausschnitt zusammengesetzt. • Beim Verschieben werden die neu benötigten Teilbilder im Hintergrund nachgeladen. • Die CSS-Positionsattribute aller Teilbilder werden angepasst und damit das Boxmodell des neuen Kartenausschnitt konstruiert. • Nach Empfang eines Teilbilds wird es in den DOM-Baum eingefügt und per CSS sichtbar gemacht. Dies hat keine Auswirkungen auf den Rest des Browserfensters. IBS - SS 2009 244 XMLHttpRequest • Ein XMLHttpRequest ist ein Javascript-Objekt, mit dem man Daten vom Server im Hintergrund laden kann • Für den Übertragungsvorgang sind 4 Zustände (request.readyState) definiert • Bei jeder Zustandsänderung wird eine für die Behandlung registrierte Callback-Funktion (request.onreadystatechange) aufgerufen • Die Callback-Funktion kann nach erfolgreicher Datenübertragung den DOM-Baum des aktuellen Dokuments und damit das Browserfenster modifizieren • Die Serverdaten sind als Text und als XML-DOM-Baum verfügbar (request.responseText, request.responseXML) IBS - SS 2009 245 Beispiel für XMLHttpRequest <script type="text/javascript" language="javascript"> function sendeRequest(url) { if (window.XMLHttpRequest) { // Mozilla, Safari,... http_request = new XMLHttpRequest(); http_request.onreadystatechange = reagiere; http_request.open(’GET’, url, true); http_request.send(null); else if (window.ActiveXObject) { ... Code für Internet Explorer ... } } function reagiere () { if (http_request.readyState == 4) { if (http_request.status == 200) { alert(http_request.responseText); } else { alert(’Bei dem Request ist ein Problem aufgetreten.’); } } } IBS - SS 2009 246 </script> <span style="cursor: pointer; text-decoration: underline; color: blue" onclick="sendeRequest(’test.html’)">Einen Request absetzen </span> • Die Codierung ist teilweise Browser-abhängig • Nachladen funktioniert nur vom Server, der auch die aktuelle Seite geliefert hat • Bei manchen Browsern gibt es Probleme mit dem MIME-Type der Antwort, ggf. ergänzen mit http_request.overrideMimeType(’text/xml’); IBS - SS 2009 247 Attribute und Methoden des XMLHttpRequest Methoden: open(HTTP-Methode, URL, asyncFlag) send( requestAttribute ) abort() setRequestHeader( key, value ) getResponseHeader( key ) getAllResponseHeaders() initialisieren absenden, Parameter bei GET-Request: null Bricht eine aktuell laufende Anfrage ab Attribute: onreadystatechange readyState status, statusText responseText responseXML Handler-Callback-Methode 0=uninitialized, 1=loading, 2=loaded, 3=interactive, 4=complete HTTP-Status Serverantwort als Text-String Serverantwort XML-Dokument IBS - SS 2009 248 Javascript-/Ajax-Frameworks • Viele Web-Anwendungen sind sogenannte rich clients“: ” – Die Benutzeroberfläche und das Interaktionsverhalten ähnelt einer klassischen GUI – Ajax wird für inkrementelle Aktualisierung der Benutzersicht verwendet • Der dazu erforderliche Javascript-Code ist vor allem wegen der vielen Browser-Fallunterscheidungen unhandlich • Ein Javascript-/Ajax-Framework – – – – – ist eine Sammlung wiederverwendbarer Javascript-Definitionen versteckt Browser-Fallunterscheidungen erleichtert DOM-Operationen erleichtert Ajax-Requests definiert ggf. GUI-Bausteine ( widget sets“) ” • Beispiele: prototype, dojo, jquery, extjs • Das Google Web Toolkit (GWT) erzeugt den Javascript-Code aus Java IBS - SS 2009 249 Java Enterprise • Das Java Enterprise Framework dient zur Entwicklung der Serverseite von Web-Anwendungen in Java • Kern ist die Entwicklungsplattform JEE5: Java Platform Enterprise Edition“, ” Version 5 • JEE wird vor allem für größere Projekte eingesetzt, bei denen Sicherheit, Performanz und Stabilität wichtig sind • Zu JEE gehören u.a. – – – – – – – Architekturmodelle (3-tier, 4-tier) Spezielle Entwurfsmuster (z.B. front controller“) ” APIs (z.B. JDBC, EJB, JNDI) Bibliotheken (z.B. JSTL, Klassenbibliotheken für die APIs) Entwicklungswerkzeuge (z.B. Eclipse-Plugins) Spezielle Laufzeitumgebungen (z.B. Tomcat, JBOSS, Glassfish) Frameworks (z.B. Struts, Java Server Faces) IBS - SS 2009 250 Grundlegende JEE-Begriffe und Techniken • Servlets: serverseitige Komponenten, vielseitig verwendbar – zur dynamischen HTML-Erzeugung – zur Interaktionssteuerung – zur Kapselung von Geschäftslogik • JSP (Java Server Pages): dienen zur HTML-Erzeugung • JSP-Tag-Bibliotheken: benutzerdefinierte XML-Tags zum Verstecken von Java-Code • Daten-Beans: kapseln Anwendungsdaten • EJBs (Enterprise Java Beans): kapseln Sitzungslogik, Daten, Nachrichten • Servlet-Container: Umgebung zur Ausführung von Servlets • JEE-Applikationsserver: Umgebung zur Ausführung von EJBs IBS - SS 2009 251 Wichtige JEE-APIs • JDBC (Java Database Connectivity) - Datenbankzugriff per SQL • JNDI (Java Naming and Directory Interface) - Zugriff auf Verzeichnisdienste • Java Persistence API - Speicherung von Java-Objekten in SQL-Datenbanken • JAX-WS - Implementierung und Nutzung von Webservices • JMS (Java Messaging Service) - Zugriff auf MOM-Nachrichten-Server • JAXP (Java API for XML Processing) • JAXB (Java XML Binding) IBS - SS 2009 252 JEE-Architekturmodell mit 4 Ebenen ( tiers“) ” aus http://java.sun.com/javaee/5/docs/tutorial IBS - SS 2009 253 Kommunikationsmodell für Java- und Web-Applikationen aus http://java.sun.com/javaee/5/docs/tutorial IBS - SS 2009 254 JEE-Architekturmodell mit EJBs in der Geschäftsebene aus http://java.sun.com/javaee/5/docs/tutorial IBS - SS 2009 255 APIs im JEE-Architekturmodell aus http://java.sun.com/javaee/5/docs/tutorial IBS - SS 2009 256 Komponenten und Container • Eine JEE-Komponente – enthält fachliche Funktionen ( Geschäftslogik“) ” – ist kein für sich alleine lauffähiges Programm – benötigt einen Container als Laufzeitumgebung • Ein Container liefert anwendungsunabhängige technische“ Funktionen ” (z.B. Transaktionssteuerung, Lastverteilung, Verzeichnisdienst) • JEE-Containertypen: – Servlet-Container für Servlets und JSPs – Applikationsserver für EJBs und alle anderen Arten von Komponenten • Die Integration einer Komponente in den Container heißt Deployment“ oder ” Bereitstellung“ ” IBS - SS 2009 257 Java Server Pages – JSP • JSPs sind serverseitige Komponenten zur dynamischen HTML-Erzeugung • JSP-Code wird in HTML-Seiten eingebettet • JSP-Code besteht aus – beliebigem Java-Code – JSP-Tags: XML-Tags, hinter denen sich Java-Code verbirgt – Ausdrücken der JSP Expression Language“ ” • Servlet-Container erforderlich (z.B. Apache Tomcat) • Alternative Techniken: – Anbindung von Scriptsprachen durch ∗ CGI (Common Gateway Interface) ∗ Webserver-Plugins – Beispiele für geeignete Sprachen: Ruby, PHP, Perl, Python – Microsoft ASP.net (Active Server Pages) IBS - SS 2009 258 Grundlagen der JSP- und Servlet-Verarbeitung Zum Verständnis der JSPs sind einige Servlet-Grundlagen wichtig: • Ein Servlet definiert eine Klasse mit einer service-Methode zur Bearbeitung eines Requests • Die Servlet-Klasse hat nur ein Objekt Dieses ist für alle Requests zuständig • Deployment“ (Auslieferung): Integration einer JSP in den Container ” – Eine JSP wird vom JSP-Compiler zu einem Servlet übersetzt – Der Administrator vergibt für das Servlet einen URL • Das Laden der Servlet-Klasse in die JVM des Containers erfolgt bei der ersten Nutzung (oder schon beim Container-Start) • Das Servlet benutzt – Request-Objekt für die Request-Daten – Response-Objekt für die Antwort-Daten IBS - SS 2009 259 Einfaches JSP-Beispiel: <html> <title> JSP-Beispiel </title> <body> Dies ist eine dynamische JavaServer Page. <br/> Datum und Uhrzeit: <%= new java.util.Date() %> </body> </html> • Ein HTTP-Request aktiviert die service-Methode des Servlet-Objekts • service enthält println-Anweisungen für die statischen HTML-Zeilen, z.B. out.println("<html>"); out.println(" <title> JSP-Beispiel </title>"); • Die Ausgabe der dynamischen Zeile wird vom JSP-Compiler zusammengesetzt out.println (" Datum und Uhrzeit: " + new java.util.Date() ); IBS - SS 2009 260 JSP-Scriptlets: Lokale Variablen und Anweisungen • Syntax: <% . . . Java-Code . . . %> • Scriptlet = Programmfragment mit Variablendefinitionen und Anweisungen • Code wird in den Rumpf der service-Methode eingebettet • Variablen des Scriptlets sind lokale Variablen der service-Methode −→ Werte nicht Request-übergreifend verfügbar • Scriptlets können an beliebigen Stellen in der JSP-Datei stehen • Ausgaben des Scriptlets: – Ein Scriptlet erzeugt nicht automatisch HTML – Standardausgabe (System.out): Protokolldatei oder Konsole des Containers – Für die HTML-Antwort gibt es das vordefinierte PrintWriter -Objekt out IBS - SS 2009 261 JSP-Ausdrücke: Werte ausgeben Vorbemerkung: Ein Ausdruck ist ein Code-Fragment, das einen Wert repräsentiert. • Syntax: <%= . . . Java-Ausdruck . . . %> • Jeder JSP-Ausdruck beinhaltet einen Java-Ausdruck. • Der Ausdruck wird im Rahmen der Request-Bearbeitung ausgewertet • Der Wert wird anstelle des JSP-Ausdrucks in die HTML-Ausgabe geschrieben IBS - SS 2009 262 Beispiel: BMI-Rechner <%-- hier kommt ein Scriptlet: <% --%> float gewicht=83.5, groesse=1.81, bmi; bmi = gewicht / (groesse * groesse); %> <html> <title> BMI-Berechnung mit festen Werten </title> <body> <p> Bei einem Gewicht von <%= gewicht %> kg und einer Größe von <%= groesse %> cm ist der BMI <%= bmi %>. </p> <p> Wenn dein BMI über 24 liegt, bist du zu schwer! </p> </body> </html> IBS - SS 2009 263 JSP-Deklarationen: Erweiterung der Servlet-Klasse • Syntax: <%! . . . Java-Deklarationen . . . %> • Eine JSP-Deklaration besteht aus Java-Deklarationen • Die deklarierten Variablen und Methoden werden in die Servlet-Klassendefinition eingebettet • Beachte: Das es nur ein Servlet-Objekt gibt, werden diese Klassen-Variablen Request-übergreifend und von allen Clients gemeinsam benutzt • Beispiel: Webseite mit Zugriffszähler <%! int zaehler = 1; %> <html> <title> Zugriffszähler </title> <body> Sie sind der <%= zaehler++ %>. Besucher dieser JSP. </body> </html> IBS - SS 2009 264 Wichtige vordefinierte Objekte in JSP Objekt out Typ und Verwendung javax.servlet.jsp.JSPWriter request zum Schreiben des Inhalts der HTTP-Antwort javax.servlet.http.ServletRequest response zum Auslesen aller Request-Daten javax.servlet.http.ServletResponse session zum Erzeugen der Antwort javax.servlet.http.HttpSession application zur Sitzungsverwaltung javax.servlet.ServletContext config Anwendungskontext, Servlet-übergreifende Infos über den Container , z.B. Version der Servlet-API javax.servlet.http.ServletConfig pageContext Konfigurationsschnittstelle, Zugriff auf die Container-Konfiguration javax.servlet.jsp.PageContext über den pageContext erhält eine JSP die anderen vordefinierten Objekte IBS - SS 2009 265 Requestdaten auslesen Das vordefinierte Request-Objekt bietet Methoden zum Auslesen des Requests: request.getParameterNames() request.getParameter(name) request.getHeaderNames() request.getHeader(name) request.getMethod() request.getRequestURI() request.getContentType() request.getCookies() request.getLocales() Namen aller Parameter Wert eines Parameters Namen aller HTTP-Header Wert eines HTTP-Headers Requesttyp Request-URI MIME-Typ des Requestrumpfs Namen der Cookies bevorzugte Sprachen IBS - SS 2009 266 Beispiel: Schema zur Verarbeitung der Parameter <% // Auslesen aller übermittelten Request-Parameter java.util.Enumeration paramNamen = request.getParameterNames(); while (paramNamen.hasMoreElements()) { String name = (String) paramNamen.nextElement(); String wert = request.getParameter(name); // Verarbeitung von name und wert ... } %> • HTTP-Header und Cookies werden in gleicher Weise verarbeitet • Die Expression Language (ab JSP-Version 2) bietet kürzere Notationen, z.B. ${param} statt request.getParameterNames() IBS - SS 2009 267 Beispiel: Schema für Browser-spezifische Antwort <% String userAgent = request.getHeader("User-Agent"); if (userAgent != null) if (userAgent.indexOf("MSIE") != -1) .... else if (userAgent.indexOf("Safari") != -1) ... %> IBS - SS 2009 268 Sitzungen Anwendungsbeispiel: Eine Einkauftour in einem Onlineshop besteht aus mehreren Requests. Für eine Warenkorbverwaltung muss jeder Request eindeutig einer Sitzung zugeordnet werden. Techniken: • Beim ersten Request generiert der Server eine Sitzungsnummer • Die Nummer wird so an den Browser übermittelt, dass dieser sie bei allen Folge-Requests wieder zurückschickt: – als Cookie (Standardverfahren, aber: Cookies im Browser abschaltbar!) – im URL codiert ( URL-Rewriting“) ” – als verstecktes Formularfeld • Bei SSL-Sitzungen (https) könnte man auch das SSL-Sitzungskonzept verwenden IBS - SS 2009 269 Sitzungsdaten speichern mit dem JSP Session-Objekt • Das JSP-Objekt session unterstützt – Sitzungsnummern auf der Basis von Cookies oder URL-Rewriting – das Setzen und Auslesen beliebiger Sitzungsdaten in Form von Attributen • Der Container automatisiert die Cookie-basierte Sitzungnummernverwaltung – generiert und verschickt Sitzungsnummer-Cookie JSESSIONID“ ” – ordnet jeden Request anhand der Nummer dem richtigen Session-Objekt zu • URL-Rewriting erfordert explizite Programmierung Dazu dient die Methode des response-Objekts: encodeURL(String) • Schnittstelle für die Sitzungsattribute: setAttribute(Name, Wert) getAttribute(Name) removeAttribute(Name) IBS - SS 2009 270 Gültigkeitsbereich und Lebensdauer benutzerdefinierter JSP-Attribute Page Scope • Attribute existieren nur für die Dauer der Request-Bearbeitung • nur innerhalb einer JSP-Seite verwendbar • technisch: lokale Objekte der service-Methode Request Scope • Attribute existieren nur für die Dauer der Request-Bearbeitung • verwendbar in allen JSPs und Servlets, die an der Request-Bearbeitung beteiligt sind Session Scope • Request-übergreifend innerhalb einer Sitzung verwendbar Application Scope • Request-übergreifend von allen Clients gemeinsam benutzbar IBS - SS 2009 271 JSP-Scopes und Attribute • Für jede Scope-Kategorie ist ein vordefiniertes Scope-Objekt verfügbar: page, request, session, application • Die Scope-Objekte dienen – zum Anheften“ von JSP-Attributen (z.B session.setAttribute(...) ) ” – für spezifische sonstige Zwecke (z.B. request.getParameter) • benutzerdefinierte Variablen werden als Attribute eines solchen Scope-Objekts verwaltet Methoden dazu: void setAttribute(String name, Object wert) Object getAttribute(String name) void removeAttribute(String name) • Das page-Objekt ist technisch einfach nur eine Referenz auf die aktuelle Servlet-Instanz (also this) IBS - SS 2009 272 JSP-Direktiven Direktiven sind Verarbeitungsanweisungen für den JSP-Compiler. Sie beeinflussen die Erzeugung des Servlet-Codes. include-Direktive Von mehreren JSP-Seiten gemeinsam benutzte Fragmente können mit dieser Direktive eingebunden werden. Syntax: <%@ include file=" ... Pfad ..." %> taglib-Direktive Ein Tag-Bibliothek ist eine Sammlung von benutzerdefinierten Aktionen, die innerhalb einer JSP durch Tags in XML-Syntax verwendet werden können. Syntax: <%@ taglib uri="..." prefix="..." %> Viele häufig benutzte Aktionen stehen in der JSTL (Java Standard Tag Library). IBS - SS 2009 273 page-Direktive Diese häufig benutzte Direktive hat verschiedene Verwendungsaspekte, die durch separate Attribute konfiguriert werden. Beispiel: <%@ page contentType="text/html" session="false" import="java.util.*, java.io.*" %> Attribute der page-Direktive (Auswahl) Attribut import session isThreadSafe errorPage contentType pageEncoding Defaultwert true true Verwendung Import von Klassen und Paketen Wird eine Sitzungsverwaltung gebraucht? Ist nebenläufiger Zugriff möglich? Verweis auf Fehlerbehandlungs-JSP MIME-Typ der Antwort Zeichencodierung IBS - SS 2009 274 Beispiel: BMI-Rechner, Version 2 Diese Variante des Beispiels demonstriert • die Nutzung der Direktiven: page und include • das Auslesen der Request-Parameter • wie unübersichtlich eine Mischung aus HTML und Script-Code sein kann bmiBerechnung.jsp <%! float bmiBerechnung (float gewicht, float groesse) { return gewicht / (groesse*groesse); } %> IBS - SS 2009 275 bmi.jsp <%@ contentType="text/html" pageEncoding="UTF-8" %> <%@ include file="bmiBerechnung.jsp" %> <% float gewicht, groesse, bmi; boolean gueltigeParams = true; try { gewicht = Float.parseFloat(request.getParameter("gewicht")); groesse = Float.parseFloat(request.getParameter("groesse")); } catch (Exception e) { gueltigeParams = false; } IBS - SS 2009 276 if (gueltigeParams) { bmi = bmiBerechnung (gewicht, groesse); %> <html> <title> Ergebnis der BMI-Berechnung </title> <body> <p> Bei einem Gewicht von <%= gewicht %> kg und einer Größe von <%= groesse %> cm ist der BMI <%= bmi %>. </p> </body> </html> <% } else { %> <html> <title> Fehler bei BMI-Berechnung </title> <body> <p> Sie müssen in beiden Feldern Zahlen eingeben <p> <p> <a href="..."> Zurück zum Formular </a> </p> </body> </html> <% } %> IBS - SS 2009 277 Java Beans • Eine Java Bean ist eine Java-Klasse mit bestimmten Eigenschaften – ein parameterloser Konstruktor – Attribute ( properties“) mit get- und/oder set-Methoden ” Für ein Attribut xxx heißen die Methoden: getXxx bzw. setXxx • Beispiel: public class Bmi { private float groesse; private float gewicht; public Bmi() {} public float getGroesse() { return groesse; } public void setGroesse(float neueGroesse) { groesse=neueGroesse; } ... IBS - SS 2009 278 JSP und Java Beans • Beans werden von JSPs oft zur Kapselung von Formulardaten verwendet • Beans sind einem der JSP-Scopes zugeordnet • Die Übertragung der Formulardaten in die Bean und umgekehrt (inklusive Typkonversion) muss nicht in Java codiert werden: Spezielle JSP-Tags sind als Standardaktionen verfügbar: – Mit <jsp:useBean ... /> wird eine Bean in eine JSP eingebunden – Mit <jsp:setProperty ... /> werden Bean-“Setter“ aktiviert – Mit <jsp:getProperty ... /> werden Bean-“Getter“ aktiviert • Beispiel <jsp:useBean id="bmiFormular" class="bmi" scope="session" /> <jsp:setProperty name="bmiFormular" property="gewicht" value="<% request.getParameter("gewicht") %>" /> IBS - SS 2009 279 Vorteile der Bean-Nutzung in JSPs • Wenn die Attribute des Formulars und der Bean die gleichen Namen haben, können alle Attribute mit einer Aktion kopiert werden, z.B <jsp:useBean id="bmiFormular" class="bmi" scope="session" /> <jsp:setProperty name="bmiFormular" property="*" /> Dies vereinfacht die JSP bei großen Formularen erheblich. • Die Typkonversionen String ↔ Attributtyp müssen nicht codiert werden • Die JSP wird von Java-Code befreit, die Trennung von Darstellung und Verarbeitung wird klarer IBS - SS 2009 280 XML-Notation für JSP • XML-Syntax ab JSP-Version 1.1: traditionell <% ... %> <%= ... %> <%! ... %> freier Text XML <jsp:scriptlet> <jsp:expression> <jsp:declaration> <jsp:text> ... ... ... ... </jsp:scriptlet> </jsp:expression> </jsp:declaration> </jsp:text> • Dadurch ist eine JSP ein wohlgeformtes XML-Dokument. • Beide Notationen können in Version 1.1 gemischt verwendet werden IBS - SS 2009 281 JSP ab Version 2 Ziel der JSP-Weiterentwicklung: Eliminierung von Java-Code aus den JSPs Werte Aktionen alt Java-Ausdrücke Java-Anweisungen neu Expression Language Tags in XML-Syntax • Aktionen werden durch JSP-Tags repräsentiert, in der Regel a) JSTL-Tags oder b) in JSP definierte Anwender-Tags c) bei Verwendung eines Frameworks: Tags des Frameworks • Werte werden durch Ausdrücke der Expression Language“ (EL) repräsentiert. ” Ab JSP 2.1 ist dies eine mit dem JSF-Framework (Java Server Faces) gemeinsam benutzte Unified Expression Language“ ” • Aktuelle Container unterstützen die JSP-Version 2.1 und erlauben eine Mischung aus klassischer und neuer Syntax IBS - SS 2009 282 Die neue Ausdruckssprache für JSP: Unified Expression Language“ (EL) ” • Ab JSP-Version 2.1: gemeinsame Ausdruckssprache für JSP und JSF • EL-Ausdrücke erlauben u.a. – dynamisches Auslesen von Daten aus Request, Beans, impliziten Objekten usw. – dynamisches Schreiben von Daten, z.B. in Formulare oder Beans – beliebige Methodenaufrufe – beliebige arithmetische Operationen – Aufruf benutzerdefinierter Funktionen • EL-Ausdrücke können als Attributwerte in Tag-Attributen oder im statischen Text verwendet werden IBS - SS 2009 283 Beispiele Verwendungs-Beispiel: im statischen Text: <irgendein:tag> irgendein text ${expr} irgendein text </irgendein:tag> Verwendungs-Beispiel: in einem Tag-Attributwert: <irgendein:tag value="${expr}" /> Ausdrucks-Beispiele: ${header["User-Agent"]} ${param["vorname"]}, ${param[’vorname’]}, ${param.vorname} ${!empty param.nachname} ${param.alter + 100} ${warenkorb.summe > 100} ${zahlung == "vorkasse"} ${sessionScope.warenkorb.betragSumme} ${meineFunktionen:istEmailAdresse(param.email)} IBS - SS 2009 284 Weitere Merkmale der Unified Expression Language“ ” • verzögerte Auswertung von Ausdrücken ( Syntax: #{...} ) • Erweiterung durch benutzerdefinierte Funktionen • Ausdrücke, die Referenzen repräsentieren ( lvalue“-Expression) ” • Benutzerdefinierte Auswertungsalgorithmen ( pluggable resolver“) ” • Mehr dazu: http://java.sun.com/javaee/5/docs/tutorial/doc/bnahq.html IBS - SS 2009 285 JSP-Tags: XML-Tags für Aktionen JSP-Tags • sind syntaktisch XML-Elemente • repräsentieren externen Java-Code • ersetzen Scriptlets Vorteile: • Bessere Lesbarkeit der JSP-Seiten • Vereinfachte Wiederverwendbarkeit des Java-Codes Tag-Definitionen • Standardbibliothek JSTL: Java Standard Tag Library • Framework-Bibliotheken (z.B. Struts-Tags) • Benutzer-definierte Tags IBS - SS 2009 286 Klassische“ Tag-Definitionen: Tag-Bibliotheken ” • Eine Tag-Bibliothek besteht aus – einer XML-Beschreibungsdatei: tag library descriptor“ (.tld-Datei) ” – Tag-Handler-Klassen, in Java codiert • Die Bibliothek wird mit der taglib-Direktive eingebunden • Die Bibliothek muss in der Containerkonfiguration deklariert werden IBS - SS 2009 287 Die neue Methode: Tag-Dateien für einfache Tags (ab JSP 2.0) Einfache Tags • • • • repräsentieren wiederverwendbaren JSP-Code sind mit Attributen parameterisierbar werden i.d.R. ohne Java-Codierung in JSP definiert erlauben ab Version 1.1 aber auch Java-Scripting in den Attributen und im Rumpf Deployment • Pro Tag wird eine Datei mit der Definition erstellt (.tag) • Container-Konfiguration ist nicht nötig • Der Tag-Handler wird vom JSP-Compiler automatisch erzeugt Vorteile • Tag-Definition wird stark vereinfacht • Entwickler sind motiviert, eigene Tags statt Scriptlets zu schreiben • Standardbibliotheken und einfache Tags reichen meist aus IBS - SS 2009 288 Die JSTL Die JSTL definiert JSP-Tags für häufig benötigte Funktionen, z.B. • Iteratoren und bedingte Anweisungen • String-Funktionen • URL-Verwaltung • Verarbeitung von XML-Dokumenten (Parser, XSLT, XPath) • Internationalisierung von Web-Seiten (I18N) • Datenbankzugriff mit SQL Die JSTL ist modularisiert und verwendet 5 Tag-Präfixe: c x fmt sql fn (core) (XML) (I18N) (SQL) (functions) Grundfunktionalität XML Internationalisierung DBMS-Zugriff Hilfsfunktionen (vor allem String-Funktionen) IBS - SS 2009 289 JSTL-Beispiele: Variablen Variable definieren (JSTL-Tag c:set) und verwenden (EL) <c:set var="farbe" value="rot" /> ... <irgendein:tag irgendeinAttribut="${farbe}" /> ... <tr> <td> Farbe: </td> <td> ${farbe} </td> </tr> • Über Variablen können verschiedene Tags Daten austauschen • Variablen können in den bekannten JSP-Scopes gespeichert werden, z.B. <c:set var="userid" scope="session" value="${param.user}" /> IBS - SS 2009 290 JSP-Beispiele Bedingte Anweisung <c:if test="${param.kaufen}"> <strong> Danke für Ihren Auftrag! </strong><br> </c:if> Schleife: Anzeigen aller HTTP-Header des Requests in einer Tabelle <table ... > <tr><th> Name </th> <th> Wert </th></tr> <c:forEach var="hname" items="${pageContext.request.headerNames}"> <c:forEach var="hvalue" items="${headerValues[hname]}"> <tr><td> <c:out value="${hname}" /> </td> <td> <c:out value="${hvalue}" /> </td> </tr> </c:forEach> </c:forEach> IBS - SS 2009 291 JSP-Beispiele: XML-Verarbeitung • Eine XML-Bücherliste (booklist) wird in die JSP importiert. (URL ist ein Init-Parameter, die XML-Datei wird ggf. mit GET-Request geladen) • Der XML-Parser erzeugt einen DOM-Baum als Application-Objekt. • Mit dem Request-Parameter bookId wird ein dynamischer XPath-Ausdruck zur Selektion des Buchs konstruiert, der Buchtitel serialisiert, und in die Antwort geschrieben. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/XML" prefix="x" %> <c:if test="${applicationScope:booklist == null}" > <c:import url="${initParam.booksURL}" var="xml" /> <x:parse doc="${xml}" var="booklist" scope="application" /> </c:if> <x:set var="selectedbook" select="${applicationScope.booklist/books/book[@id=$param:bookId]}" /> <h2><x:out select="$selectedbook/title"/></h2> IBS - SS 2009 292 Eigene JSP-Tags • Ein JSP-Tag ist syntaktisch ein XML-Element und besteht insofern aus Start-Tag (ggf. mit Attributen), Inhalt und Ende-Tag • JSP-Tags sind flexibel verwendbar: – – – – – Parameterisierbarkeit durch Attribute Werte können an die aufrufende JSP zurückschickt werden Datenaustausch der Tags untereinander möglich Tag sind verschachtelbar uneingeschränkter Zugrif auf implizite JSP-Objekte (request, session, usw.) IBS - SS 2009 293 Tag-Handler • Ein Java-Tag-Handler ist eine Klasse mit mehreren Methoden, deren Aufrufzeitpunkt an die syntaktische Struktur des Tags gebunden ist: Handler-Methode doStartTag() doInitBody() doAfterBody() doEndTag() Aufrufzeitpunkt beim Parsen Start-Tag vor Bearbeitung des Rumpfs nach Bearbeitung des Rumpfs Ende-Tag • Die Klasse javax.servlet.jsp.tagext.TagSupport definiert leere Handler-Methoden und ist als Basisklasse für Tag-Handler gedacht IBS - SS 2009 294 Beispiel: Java-Handler für ein <datum />-Tag package ibs; import java.io.IOException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.Tag; import javax.servlet.jsp.tagext.TagSupport; public class DatumTag extends TagSupport implements Tag { public int doStartTag() { try { JspWriter out = pageContext.getOut(); out.print(new java.util.Date()); } catch (IOException e) { e.printStackTrace(); } // keine Verarbeitung des Rumpfs return SKIP_BODY; } } IBS - SS 2009 295 Taglib-Deskriptor Der Taglib-Deskriptor (.tld-Datei) • enthält die verwendete Taglib-Version • enthält die Tag-Definitionen (Name, Attribute) • ordnet jedem Tag den zuständigen Java-Tag-Handler zu Beispiel: <taglib xmlns="http://java.sun.com/xml/ns/javaee" ... <tlib-version>1.0</tlib-version> <short-name>mt</short-name> <uri>/BeispielTags</uri> <tag> <name>datum</name> <tag-class>ibs.DatumTag</tag-class> <body-content>empty</body-content> </tag> </taglib> IBS - SS 2009 296 Einbindung und Nutzung Einbinden in eine JSP durch: <%@ taglib uri="/meineTags" prefix="mt" %> Nutzung in der JSP durch: <mt:datum /> IBS - SS 2009 297 Beispiel: Eine Tag-Datei für ein einfaches Tag mit Attributen Das hallo-Tag erzeugt eine Begrüßungszeile (Text und Name variabel) Definition in der Tag-Datei hallo.tag: <%@ attribute name="halloText" required="true" %> <%@ attribute name="name" required="true" %> <h2 style="color:red"> ${halloText}, ${name}! </h2> Verwendung: • Der Tag-Name ergibt sich aus dem Dateinamen: hallo • Einbinden in die JSP: alle Tag-Dateien sind im selben Verzeichnis (tagdir) <%@ taglib tagdir="/WEB-INF/tags" prefix="meinetags" %> • keine Container-Konfiguration nötig! IBS - SS 2009 298 Verwendung des hallo-Tags in einer JSP <%@ taglib tagdir="/WEB-INF/tags" prefix="meinetags" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> <html> <head><title>Willkommen</title></head> <body> <c:set var="text" value="Guten Tag" /> <h1> ${text}, wie ist dein Name? </h1> <form method="get"> <input type="text" name="username" size="25"> <input type="submit" value="Submit"> <input type="reset" value="Reset"> </form> <c:if test="${fn:length(param.username) > 0}" > <meinetags:hallo halloText="${text}" name="${param.username}" /> </c:if> </body> </html> IBS - SS 2009 299 Servlets: Interface und Klassen << interface >> Servlet • Servlets implementieren das Interface javax.servlet.Servlet init() service() destroy() ... • Servlet-Methoden sind u.a. GenericServlet – init - Initialisierung – service - Request bearbeiten – destroy - beenden • Die Servlet-Klasse GenericServlet ist als Basis für protokollspezifische Servlets gedacht • Die Subklasse HttpServlet ist als Basis für HTTP-Requests gedacht: Eine spezifische Servletklasse erbt also i.d.R. von HttpServlet { abstract } ... HttpServlet { abstract } doGet() doPost() ... DatumServlet IBS - SS 2009 300 Servlets: Methoden und Objekte • Ein Servlet bearbeitet Web-Requests in der Service-Methode • HTTP-Servlets implementieren die Service-Methode durch Delegation an Request-Typ-spezifische Methoden: doGet, doPost usw. • Eine einzige Instanz der Servletklasse bearbeitet mehrere Requests Zur Lastverteilung können Container auch mehrere Instanzen erzeugen • Request- und Response-Objekte sind Parameter der Service-Methode • Das Servlet erhält Request-unabhängige Informationen über ein PageContext-Objekt, u.a. – ServletConfig-Objekt – Session-Objekt – Application-Objekt IBS - SS 2009 301 Beispiel für ein einfaches Servlet package IBSBeispiele; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class DatumServlet extends HttpServlet { public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { out.println("<html><head><title> DatumServlet </title></head>"); out.println("<body>"); out.println("Datum: " + new java.util.Date()); out.println("</body></html>"); } finally { out.close(); } } IBS - SS 2009 302 public String getServletInfo() { return "zeigt Datum und Uhrzeit"; } } IBS - SS 2009 303 Beispiel für ein aus JSP generiertes Servlet package org.apache.jsp; import import import import javax.servlet.*; javax.servlet.http.*; javax.servlet.jsp.*; java.util.*; public final class Beispiel1_jsp extends org.apache.jasper.runtime.HttpJspBase ... private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory(); ... public void _jspService(HttpServletRequest request, HttpServletResponse response) throws ... { PageContext pageContext = null; // HttpSession session = null; // ServletContext application = null; ServletConfig config = null; // JspWriter out = null; // Object page = this; ... zum Zugriff auf die anderen Objekte Sitzungsdaten // Servlet-übergreifende Daten Konfigurationsdaten zum Schreiben der Antwortseite IBS - SS 2009 304 try { response.setContentType("text/html;charset=UTF-8"); pageContext = _jspxFactory.getPageContext(...); application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); ... out.write("<html>\n"); out.write(" <head>\n"); out.write(" <title>JSP Page</title>\n"); out.write(" </head>\n"); out.write(" <body>\n"); out.write(" Dies ist eine dynamische JavaServer Page. <br/>\n"); out.write(" Datum und Uhrzeit: "); out.print( new Date()); out.write(" \n"); out.write(" </body>\n"); out.write("</html>\n"); } catch (Throwable t) { ... IBS - SS 2009 305 Die Initialisierungsmethode des Servlets: init public void init() throws ServletException public void init(ServletConfig config) throws ServletException • init dient zur Initialisierung des Servlet, z.B. – Kontextinformation vom Container erfragen – Datenbankverbindung aufbauen • Der Container ruft init beim Erzeugen des Servletobjekts auf • Die zweite Variante von init bietet Zugriff auf die Servlet-Konfiguration: ein Objekt des Typs ServletConfig, das dem Servlet den Datenaustausch mit dem Container ermöglicht, z.B. – Zugriff auf Initialisierungsparameter aus dem Deployment-Deskriptor – Zugriff auf den ServletContext mit der Möglichkeit, Request- und Session-übergreifende Attribute dort zu speichern – Zugriff auf die Protokolldatei IBS - SS 2009 306 Verwendungsschema für init public class BeispielServlet extends HttpServlet { // ServletContext protected ServletContext application = null; public void init(ServletConfig conf) throws ServletException { super.init(conf); // Beispiel für Zugriff auf Initialisierungsparameter: String p = conf.getInitParameter("param1"); // Kontext merken application = conf.getServletContext(); // Attribut im Kontext speichern: application.setAttribute("initzeit", new java.util.Date()); ... } IBS - SS 2009 307 Die Destroy-Methode des Servlets • wird vom Container bei Beendigung des Dienstes aufgerufen • bietet die Möglichkeit, Ressourcen des Servlet freizugeben • Beispiel: in der Init-Methode erzeugte Datenbankverbindung wieder schließen IBS - SS 2009 308 Online-Bank-Beispiel package Bank; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class KontoServlet extends HttpServlet { public class Konto { private int betrag = 0; void setBetrag(int neu) { betrag = neu; } int getBetrag() { return betrag; } } Konto kto; public void init(ServletConfig conf) throws ServletException { super.init(conf); kto = new Konto(); } IBS - SS 2009 309 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h2> Servlet-Bank - Wir schreiben SERVICE groß</h2>"); out.println("Kontostand: <b>" + kto.getBetrag() + "</b><br>"); out.println("<form method=\"post\" action=\"" + request.getRequestURI() + "\">"); out.println("Betrag: <input type=\"text\" name=\"betrag\" size=\"5\"><br>"); out.println("<input type=\"submit\" name=\"abheben\" value=\"abheben\">"); out.println("<input type=\"submit\" name=\"einzahlen\" value=\"einzahlen\">"); out.println("</form>"); out.println("</body></html>"); out.close(); } IBS - SS 2009 310 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int betrag = 0, kontostand = kto.getBetrag(); try { betrag = Integer.parseInt(request.getParameter("betrag")); } catch (NullPointerException e) { } catch (NumberFormatException e) { } if (request.getParameter("abheben") != null && betrag <= kontostand) kontostand -= betrag; else if (request.getParameter("einzahlen") != null && betrag > 0) kontostand += betrag; synchronized (kto) { kto.setBetrag(kontostand); } doGet(request, response); } public String getServletInfo() { return "Konto-Beispiel"; } } IBS - SS 2009 311 Beispiel: Sitzungsmanagement mit Servlets package shop; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Onlineshop extends HttpServlet { public String getServletInfo() { return "OnlineShop Servlet Beispiel"; } IBS - SS 2009 312 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.print("<html><head><title>Online Obstladen</title>" + "</head><body><h1>Obstladen</h1><form method=\"post\">" + "<input type=\"submit\" name=\"apfel\" value=" + "\"Packe einen Apfel in den Korb\"><br />" + "<input type=\"submit\" name=\"birne\" value=" + "\"Packe eine Birne in den Korb\"><br />" + "<input type=\"submit\" name=\"zeige\" value=" + "\"Zeige den Einkaufskorb\"><br />" + "<input type=\"submit\" name=\"kaufe\" value=" + "\"Kaufe den Korbinhalt\">" + "</form></body></html>"); out.close(); } IBS - SS 2009 313 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String msg; HttpSession session = request.getSession(true); if (session.isNew()) { session.setAttribute("apfel", new Integer(0)); session.setAttribute("birne", new Integer(0)); } int apfelAnzahl = (Integer) session.getAttribute("apfel"); int birneAnzahl = (Integer) session.getAttribute("birne"); if (request.getParameter("apfel") != null) { apfelAnzahl++; session.setAttribute("apfel", apfelAnzahl); msg = "Apfel hinzugefügt! Du hast jetzt " + apfelAnzahl + "."; } else if (request.getParameter("birne") != null) { birneAnzahl++; session.setAttribute("birne", birneAnzahl); msg = "Birne hinzugefügt! Du hast jetzt " + birneAnzahl + "."; IBS - SS 2009 314 } else if (request.getParameter("kaufe") != null) { session.invalidate(); msg = "Dein Auftrag " + apfelAnzahl + " Äpfel und " + birneAnzahl + " Birnen wurde ausgeführt. Der Korb ist wieder leer."; } else { msg = "Du hast " + apfelAnzahl + " Äpfel und " + birneAnzahl + " Birnen im Einkaufskorb."; } response.setContentType("text/html"); response.setHeader("pragma", "no-cache"); PrintWriter out = response.getWriter(); out.print("<html><head><title>Obstkorb</title></head><body>"); out.print(msg); out.print("<hr><a href=\""); out.print(request.getRequestURI()); out.print("\">Zurück zum Obstladen</a></body></html>"); out.close(); } } IBS - SS 2009 315 Servlet-Filter • Mehrere Servlet-Filter können gemäß dem Pipes and Filters“-Architekturstil in ” Filterketten eingebunden werden • Jeder Filter wird sowohl in die Verarbeitung des Request- als auch des Response-Objekts eingebunden und kann diese modifizieren • Beispiele für Filtermodule: Request-Protokollierung, Benutzerauthentifizierung • Die Filterketten werden über die Container-Konfiguration spezifiziert • Ein Servlet-Filter implementiert die Schnittstelle javax.servlet.filter Request Servlet− Filter Client Servlet− Filter Servlet− Filter Servlet Antwort IBS - SS 2009 316 Struts und JSF: Frameworks für die Web-Ebene ( web tier“) ” Struts und JSF (Java Server Faces) sind in etwa gleichwertige Frameworks zur Vereinfachung der Entwicklung von Webanwendungen mit JEE. Die Frameworks bieten: • Regel-basierte Spezifikation der Navigationslogik • vereinfachte Konstruktion von HTML-Benutzerschnittstellen • Validierung von Eingabewerten • Vereinfachte Fehlerbehandlung • Automatisierte Bean-Verwaltung ( managed beans“) ” • Ereignisbehandlung • Internationalisierung des Webauftritts IBS - SS 2009 317 MVC – Das Entwurfsmuster Model View Controller“ ” MVC ist ein generisches Entwurfsmuster für Web-Systeme. View: Präsentationsebene, Benutzerschnittstelle Model: Systemmodell mit Geschäftsdaten und Geschäftslogik Controller: Interaktionsssteuerung • • • • • • reagiert auf GUI-Ereignisse sorgt für Aufrufe der zuständigen Model-Operationen vermittelt Eingabedaten an das Model wählt neue Benutzersicht aus überträgt aktualisierte Geschäftsdaten in die Benutzersicht aktualisiert die Benutzersicht IBS - SS 2009 318 MVC – Folie von Sun IBS - SS 2009 319 Umsetzungsbeispiel für MVC Client (WWW−Browser) 1 Controller (Servlet) 4 2 Model (Web−unabhängig) 3 View (JSP) Ein Front-Controller ist ein Controller, der zwischen einem Web-basierten Frontend und einer Web-unabhängigen Geschäftslogik ( back end“) vermittelt. ” IBS - SS 2009 320 Gemeinsame Merkmale von Struts und JSF • Die Anwendungen benutzen das MVC-Muster • Ein Servlet agiert als Front-Controller • Die Navigation wird über XML-Deskriptoren konfiguriert: – Festlegung der Einstiegsseite – Zuordnung einer Model-Aktion zum Request anhand von Request-Parametern – Auswahl der nächsten Benutzersicht (JSP) abhängig vom Resultat der Model-Aktion • HTML-Formulardaten werden mit Formular-Beans synchronisiert • Für die GUI-Konstruktion gibt es JSP-Tagbibliotheken • Für die Internationalisierung gibt es Ressourcenbündel IBS - SS 2009 321 Struts • Historie – – – – Apache Open-Source Projekt, seit 2000 ständig weiterentwickelt, stabil, weit verbreitet aktuelle Version: 2.0 Struts-Varianten gibt es auch für PHP und C# • Merkmale einer Struts-Anwendung: – Ein Action-Servlet und ein Request-Dispatcher agieren als Front-Controller – Anwendungsprogrammierer entwickelt ∗ JSPs (für jede HTML-Ansicht) ∗ Pro Formular eine ActionForm-Bean zur Datenrepräsentation ∗ Pro Formular eine Action-Klasse zur Bearbeitung ∗ XML-Deskriptor für die Navigationslogik IBS - SS 2009 322 Kontrollfluss im Struts-Modell IBS - SS 2009 323 Java Server Faces • mehrere Implementierungen (jar-Archive) verfügbar, z.B. von Sun, Apache, IBM • Beispiel für eine Entwicklungsumgebung für JSF: Netbeans • JSF-Merkmale – – – – vordefinierte GUI-Komponenten + API für benutzerdefinierte GUI-Bausteine serverseitiges Ereignismodell Verwaltung von Komponentenzuständen über Request-Grenzen hinweg Formulardaten und Request-Behandlung in einer einzigen POJO-Bean (POJO = plain old java object“: normale, vom Framework unabhängige ” Klasse) • Ein schönes JSF-Beispiel: http://www.developertutorials.com/tutorials/java/ jsp-application-lifecycle-050504/page9.html IBS - SS 2009 324 Request Sicht wiederhestellen Requestdaten dekodieren Ereignisse behandeln Cancel−Button Validierung Phasen der Bearbeitung von Faces−Requests Ereignisse behandeln Validierungsfehler Model−Daten aktualisieren Ereignisse behandeln Konvertierungsfehler Geschäftslogik ausführen Ereignisse behandeln Antwort Model−Ereignisse Antwortsicht berechnen IBS - SS 2009 325 JSF-Bausteine: Verwaltete Beans ( managed beans“) ” • Beans sind in JSF für Datenspeicherung und Request-Bearbeitung zuständig • Eine Bean heißt managed“, wenn der Container den Lebenszyklus verwaltet ” • Verwaltete Beans werden mit Bezeichner und Java-Klasse in der Container-Konfiguration /WEB INF/faces-config.xml definiert, z.B. <managed-bean> <managed-bean-name>person</managed-bean-name> <managed-bean-class> jsfBeispiel.PersonBean </managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean> • Verarbeitung der Bean-Attribute mit EL, z.B.: (verzögerte Auswertung!) #{person.name} • Container kann Bean-Attribute initialisieren IBS - SS 2009 326 • Vordefinierte Java-Klassen als Beans verwendbar, z.B. <managed-bean> <managed-bean-name>aufgabenliste</managed-bean-name> <managed-bean-class>java.util.ArrayList</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> <list-entries> <value>Einkaufen</value> <value>Sitzung planen</value> <value>Flug buchen</value> </list-entries> </managed-bean> • Verwendungs-Beispiele in einer JSP: – 3. Listenelement: #{aufgabenliste[2]} – Einspaltige HTML-Tabelle mit dataTable-Iterator: <h:dataTable value="#{aufgabenliste}" var="eintrag" border="1"> <h:column> <h:outputText value="#{eintrag}"/> </h:column> </h:dataTable> IBS - SS 2009 327 JSF-Bausteine: Navigationsregeln Beispiel für eine JSF-Navigationsregel: <navigation-rule> <from-view-id>/index.jsp</from-view-id> <navigation-case> <from-outcome>hallo</from-outcome> <to-view-id>/hallo.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>tschuess</from-outcome> <to-view-id>/tschuess.jsp</to-view-id> </navigation-case> </navigation-rule> IBS - SS 2009 328 JSF-Bausteine: Navigationsregeln • Interaktionssteuerung durch die Navigationsregeln in der Konfigurationsdatei faces-config.xml • Basiselemente der Regeln: navigation-rule navigation-case from-view-id to-view-id from-outcome from-action Navigationsregel Teilregel aktuelle Sicht nächste Sicht Resultat Aktion aktuelle Sicht −→ nächste Sicht abhängig von Bedingung JSP JSP Resultatswert der Aktion Name der gewählten Aktion • In den Regeln können Patterns verwendet werden, z.B. <from-view-id>/hilfe/*</from-view-id> IBS - SS 2009 329 from-action und from-outcome Die Aktion ist dabei i.d.R. das action-Attribut einer Schaltfläche: • ein einfacher String, der als from-outcome dient <h:commandButton action="loginHelp" value="Login-Hilfe"> • oder ein Methodenaufrauf der Action-Bean, z.B. <h:commandButton action="#{loginBean.help}" value="Login-Hilfe"> In diesem Fall ist – from-action die aufgerufene Methode – from-outcome das Resultat des Methodenaufrufs (vom Typ String) IBS - SS 2009 330 Beispiele zu from-action und from-outcome • Eine Regel für alle Aktionen, die help“ zurückliefern, benutzt: ” <from-outcome>help</from-outcome> • Eine Regel für die Aktion abmelden“ benutzt: ” <from-action>abmelden</from-action> • Kombination: Aktion bestellungAbschicken“ liefert abbruch“ als Ergebnis: ” ” <from-action>bestellungAbschicken</from-action> <from-outcome>abbruch</from-outcome> IBS - SS 2009 331 JSF-Bausteine: Ressourcenbündel für die Internationalisierung • Ein Ressourcenbündel enthält alle Strings der Anwendung in einer Sprache • Bündel für beliebige Sprachen werden in der Konfigurationsdatei definiert • Einbinden in eine JSP mit loadBundle, z.B. <f:loadBundle basename="ibg.messages" var="msg" /> • Verwendungs-Beispiel: #{msg. ...}-Ressourcen auf einer Login-Seite <h:outputLabel for="name" value="#{msg.userName}:" /> <h:panelGroup> <h:inputText id="name" required="true" value="#{loginBean.loginName}"/> <h:message for="name" /> </h:panelGroup> <h:outputLabel for="passwort" value="#{msg.loginPassword}:" / > <h:panelGroup> <h:inputSecret id="passwort" required="true" value="#{loginBean.passwort}" /> <h:message for= "passwort" /> </h:panelGroup> IBS - SS 2009 332 JSF-Bausteine: Validierer für Eingaben Die Validierung von Formularfeldern erfolgt mit • vordefinierten Validierern, z.B. validateLength <h:inputText id="plz" required="true" value="#{adresse.plz}"> <f:validateLength minimum="5" maximum="5"/> </h:inputText> <h:message for="plz" /> • oder Benutzer-definierten Validierern: Java-Klasse mit einer validate-Methode, die bei Fehlschlag eine ValidatorException erzeugt • Fehlermeldungen: Das <h:message>-Tag erzeugt eine Fehler-Nachricht bei ValidatorException IBS - SS 2009 333 Ein simples JSF-Beispiel: Einstiegsseite+Hallo+Tschuess In einem Formular der Einstiegsseite wird der Name erfragt und dann eine der Aktionen hallo oder tschuess gewählt: Die Bean für die Formulardaten PersonBean.java: package jsfBeispiel; public class PersonBean { private String name; public void setName(String name) { this.name = name; } public String getName() { return this.name; } } Beachte: In den JSPs wird die Bean mit verzögert ausgewerteten EL-Ausdrücken benutzt, also nicht ${person.name} , sondern #{person.name} Dahinter steckt, abhängig von der Verarbeitungsphase • ein setName-Aufruf in der Phase Model-Daten aktualisieren“ ” • ein getName-Aufruf in der Phase Antwortsicht berechnen“ ” IBS - SS 2009 334 Einstiegsseite: JSP mit JSF-Tags Die Einstiegsseite: index.jsp <html> <%@taglib uri="http://java.sun.com/jsf/core" prefix= "f"%> <%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <f:view> <head><title>Willkommen mit JSF</title></head> <body> <h:form id="halloFormular"> <h:outputLabel for="erfrageName" value="Wie heisst du?" /> <h:panelGrid columns="2"> <h:outputLabel for ="name" value="Name:"/> <h:inputTextid ="name" value="#{person.name}"/> <h:commandButton value="hallo" action="hallo"/> <h:commandButton value="tschuess" action="tschuess"/> </h:panelGrid> </h:form> </body> </f:view> </html> IBS - SS 2009 335 Hallo-Seite mit Abbruch-Button: hallo.jsp <%@ taglib uri="http://java.sun.com/jsf/html"prefix="h"%> <%@ taglib uri="http://java.sun.com/jsf/core"prefix="f"%> <html> <f:view> <head><title>Willkommen</title></head> <body> <h:form> <h1>Hallo,<h:outputText value="#{person.name}" /></h1> <h:commandLink id="Abbruch" action="index" immediate="true"> <h:outputText value="Abbruch"/> </h:commandLink> </h:form> </body> </f:view> </html> Das immediate-Attribut erzeugt in der Phase Requestdaten dekodieren“ ein ” Ereignis, das zum Überspringen der nachfolgenden Phasen führt. IBS - SS 2009 336 Die Konfigurationsdatei für das Beispiel: faces-config.xml <?xml version="1.0"?> <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd" version="1.2"> <navigation-rule> <from-view-id>/index.jsp</from-view-id> <navigation-case> <from-outcome>hallo</from-outcome> <to-view-id>/hallo.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>tschuess</from-outcome> <to-view-id>/tschuess.jsp</to-view-id> </navigation-case> </navigation-rule> IBS - SS 2009 337 <managed-bean> <managed-bean-name>person</managed-bean-name> <managed-bean-class> jsfBeispiel.PersonBean </managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean> <navigation-rule> <from-view-id>*</from-view-id> <navigation-case> <from-outcome>index</from-outcome> <to-view-id>/index.jsp</to-view-id> </navigation-case> </navigation-rule> </faces-config> IBS - SS 2009 338 Web-Container-Konfiguration: /WEB INF/web.xml <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee ... " version="2.5"> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> IBS - SS 2009 339 Namens- und Verzeichnisdienste Namensdienst • • • • • Anwendungen benötigen Transportadressen entfernter Ressourcen Das Prinzip der Ortstransparenz verbietet hart kodierte“ Adressen ” Ressourcen werden über logische“ Adressen angesprochen ” Ein Namensdienst bildet logische Adressen ab auf Transportadressen Ressourcen können ohne Änderung der Anwendung verlagert und repliziert werden Verzeichnisdienst • Erweiterung des Namensdienst-Konzepts • verwaltet ein Verzeichnis von im Netz nutzbaren Objekten/Diensten • Verzeichnis-Eintrag kann beliebige Attribute enthalten Ressourcen-Beispiele • Pool von Datenbankverbindungen ( data source“) ” • Web-Service • Enterprise Java Bean IBS - SS 2009 340 Beispiel: Namensdienst mit Lastverteilung durch Replikation Namensdienst Instanz von Dienst X suche Dienst X Adresse einer Instanz von Dienst X Registrierung Instanz von Dienst X Instanz von Dienst X Client nutze Dienst X IBS - SS 2009 341 JNDI – Java Naming and Directory Interface API • JNDI beinhaltet ein Java-API für die Nutzer von Namens- und Verzeichnisdiensten • Das API ermöglicht einen einheitlichen Zugriff auf verschiedene Dienste SPI – Service Provider Interface • JNDI beinhaltet ein SPI • Ein Diensteanbieter stellt die Funktionalität seines Dienstes durch Implementierung der SPI-Operationen zur Verfügung. Beispiele für Namensdienste DNS, LDAP, NDS (Novell Directory Service), RMI, COS (CORBA Naming Service), Dateisysteme IBS - SS 2009 342 JNDI-Merkmale Objekte werden in hierarchisch aufgebauten Kontexten verwaltet. Kontext • entspricht einem Ordner“ (z.B. in einem Dateisystem) ” • enthält primitive Objekte und/oder Subkontexte (Unterordner) • Ein initialer Kontext“ ist die Wurzel der Hierarchie ” Operationen • • • • • • • bind - neuen Eintrag einfügen rebind - Eintrag einfügen/ersetzen unbind - Eintrag löschen lookup - Eintrag suchen list - Kontextinhalt auflisten rename - Objekt umbenennen createSubcontext - Unterordner erzeugen IBS - SS 2009 343 Aufbau von Namen • Ein atomarer Name (atomic name) ist eine nicht weiter strukturierte Zeichenkette • Ein Verbundname (compound name) ist eine Sequenz atomarer Namen Die konkrete Syntax ist vom Namensdienst abhängig, z.B. java.sun.com, /produktkatalog/hilfe/index.jsp • Ein zusammengesetzter Name (composite name) ist aus mehreren Verbundnamen gebildet, für die unterschiedliche SPIs zuständig sind, z.B. www.mni.fh-giessen.de/studium/master/index.html Der erste Teil ist ein DNS-Verbundname der zweite ein Dateipfad IBS - SS 2009 344 JNDI-Verwendungs-Beispiel: neuer Eintrag für DataSource • Eine MySQL-Datenquelle wird im Verzeichnis per JNDI eingetragen (rebind-Methode) • Die Kontext-Variable INITIAL CONTEXT FACTORY liefert Konstruktor für Root-Verzeichnis • INITIAL CONTEXT FACTORY ist abhängig vom Namensdienst, hier: Dateisystem, Sun Referenzimplementierung com.sun.jndi.fscontext.RefFSContextFactory“ ” import import import import import javax.naming.Context; javax.naming.InitialContext; javax.naming.NamingException; java.util.Hashtable; javax.sql.DataSource; import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; public class BindDataSource { IBS - SS 2009 345 public static void main(String[] args) { try { MysqlDataSource ds = new MysqlDataSource(); // Datenbank-Verbindung konfigurieren ds.setServerName("localhost"); ds.setDatabaseName("shopdb"); ds.setPortNumber(3306); ds.setUser("hans"); ds.setPassword("geheim!"); Hashtable<String, String> env = new Hashtable<String, String>(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); Context ctx = new InitialContext(env); ctx.rebind("comp/env/jdbc/mysql/dataSource", dataSource); ctx.close(); } catch (NamingException e) { e.printStackTrace(); }}} IBS - SS 2009 346 JNDI-Verwendungs-Beispiel: Benutzung des DataSource-Objekts ... Hashtable<String, String> env = new Hashtable<String, String>(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); Context ctx = new InitialContext(env); DataSource ds = (DataSource) ctx.lookup("comp/env/jdbc/mysql/dataSource"); ctx.close(); Connection conn = ds.getConnection(); ... IBS - SS 2009 347 Wozu 4-Tier-Systeme? Anforderungen komplexer Web-Anwendungen • Entkopplung von Geschäftslogik und Interaktionssteuerung z.B. zur Unterstützung alternativer Front-End-Systeme • Verteilte Transaktionen, langlebige Transaktionen • Persistenzdienst für Objekte erforderlich • Hohe Skalierbarkeit: – Ressourcen-Pooling (z.B. für Datenbankverbindungen) – Lastverteilung durch Dienst-Replikation – Caching • Fehlertoleranz-Mechanismen (z.B. automatischer Dienst-Neustart) • bedarfsorientierte Dienstaktivierung • Multiprotokoll-Kommunikation • Einbindung von Message-Servern (MOM) IBS - SS 2009 348 EJB - Enterprise Java Bean EJB ist ein Java-Standard von Sun zur Implementierung von Tier 3 in einer verteilten 4-Tier-Architektur: Geschäftslogik Merkmale: • serverseitige Backend-Komponenten • kapseln Geschäftslogik und/oder Daten • bestehen aus mehreren Java-Klassen • implementieren mehrere Schnittstellen • brauchen zur Ausführung einen EJB-Container • kommunizieren mit CORBA/IIOP • aktueller EJB-Standard: Version 3.0 IBS - SS 2009 349 Beispiel-Szenario für den Einsatz der EJB-Technologie (frei nach Enterprise Java in a Nutshell“, O’Reilly) ” Die Münchener Traditionsfirma Weißbier- und Weißwurst-Warenhaus AG“, kurz ” WWW-AG, möchte mit ihren Produkten ins lukrative Internetgeschäft einsteigen. Der Online-Einkauf wird als 3-Tier-Architektur realisiert: • Ein Kunde besucht die Webseite der Firma um im Produktkatalog zu stöbern und einzukaufen. • Der Webserver benutzt ein Servlet zur Warenkorb- und Sitzungsverwaltung, der Warenkorb wird in einer Datenbank gespeichert • Zum Bestellen verwendet der Webserver ein weiteres Servlet, das über JDBC auf den Warenkorb zugreift • Das Bestellservlet erfragt Kundeninformationen wie Lieferadresse und Rechnungsadresse und speichert diese in der Kundendatenbank IBS - SS 2009 350 • Integration einer proprietären Anwendung ( legacy software“: spezielle, keinem Standard entsprechende Schnittstelle): ” Das Bestellservlet sendet Rechnungsadresse und Gesamtpreis zum Rechnungsschreibungs-Server. Dieser wurde vor 22 Jahren in COBOL programmiert und hat eine nicht standardisierte Schnittstelle. Er wird daher über einen Webservice-Adapter benutzt. • Verwendung eines LDAP-Servers: Die Firma betreibt 67 Filialen in Bayern und dem Rest der Welt. Die Filialliste wird von einem LDAP-Verzeichnisdienst verwaltet. Das Bestellservlet verwendet JNDI zum Zugriff auf das Filialverzeichnis, um die dem Kunden nächstgelegene Filiale zu ermitteln. • Verwendung eines MOM-Servers: Das Bestellservlet benutzt JMS, um einen Lieferauftrag über das Messagingsystem an den Lieferauftragsserver der Filiale zu senden IBS - SS 2009 351 Modell des Online-Shops IBS - SS 2009 352 IBS - SS 2009 353 Probleme Rechnung, aber keine Lieferung Manchmal wird eine Rechnung an den Rechnungsschreibungs-Server übermittelt aber wegen eines System- oder Netzwerkfehlers wird keine Lieferung veranlaßt. Hier fehlt ein Transaktionskonzept! Überlastete Server Nach einigen Monaten steigt die Kundenzahl auf 1000 pro Tag. In den Spitzenzeiten sind einzelne Server (Web- und Persistenzschicht) so überlastet, dass Kunden-Requests zeitweise nicht mehr bedient werden können. System bleibt bei Fehlern hängen Wegen Wartungsarbeiten und vereinzelter technischer Probleme bei den Datenhaltungs-Servern ist der Onlineshop öfter nicht verfügbar. Resultat: Verzweifelte Kunden drohen schon mit dem Umstieg auf hessischen Handkäse und Apfelwein. Eine Katastrophe! IBS - SS 2009 354 Was kann ein JEE5-Applikationsserver zur Problemlösung beitragen? • Einbindung aller Bestell-Aktivitäten in eine verteilte Transaktion • bessere Performanz durch Ressourcen-Pooling und Caching • bessere Fehlertoleranz durch Failover“-Mechanismen (Dienste-Überwachung, ” automatischer Neustart von Diensten nach Fehlern) IBS - SS 2009 355 Konsequenzen aus dem Einsatz einer 4-Tier-Architektur Investition in die Server-Infrastruktur Ein Applikationsserver muss angeschafft, installiert, betreut werden Architekturumstellung erfordert Aufwand Angesichts der Komplexität des Systems und der Lastabschätzung hätte man besser von vorneherein das 4-Tier-Modell gewählt Komplexität des Anwendungs-Code Der Java-Code der 4-Tier-Anwendung ist einfacher: • Programmierung entfällt für: – Transaktionssteuerung – Persistenz der Objekte – Ressourcenverwaltung • EJB-Komponenten werden durch einfache Annotationen eingebunden IBS - SS 2009 356 JEE-Applikationsserver • Ein JEE-Applikationsserver beinhaltet – einen Servlet-Container (Unterstützung von Servlets und JSPs) – einen EJB-Container (Unterstützung von Enterprise Java Beans) • Der EJB-Container verwaltet – Session Beans - Bausteine der Geschäftslogik – Entity Beans - Datenobjekte, Schnittstelle zur Persistenzschicht – Message Beans - Nachrichtenschnittstelle zu MOM-Systemen • Beispiele für Applikationsserver: – – – – – JBoss (Open Source) BEA Weblogic (BEA/Oracle) IBM Websphere Sun Glassfish (in Netbeans 6.x bereits integriert) SAP Netweaver IBS - SS 2009 357 Mehrschicht-Architektur mit EJBs Browser WS−Clients HTTP Get/Post JSPs JEE− Applikations− server "Dicke" Clients RMI/IIOP SOAP Servlets RMI/IIOP Web Services RMI/IIOP RMI/IIOP EJBs Konnektor JDBC DBMS SOAP Proprietäre Systeme Web Services JMS MOM−Server IBS - SS 2009 358 Persistenz von Objekten • Problem: dauerhafte Speicherung von Geschäftsdaten (in fast allen nicht-trivialen Web-Anwendungen) • Geschäftsdaten werden unterschiedlich repräsentiert: – Java-Komponente: Objekte, Objekt-Beziehungen, Klassen – Datenbank: Relationen, SQL-Datentypen • ORM ( object relational mapping“) ” definiert den Bezug zwischen Java- und Datenbank-Repräsentation – Speicherung von (Java-)Objekten in relationalen Datenbanken – Abbildung von Objekten und Objekt-Beziehungen auf Relationen – Objekt-Beziehungen: Vererbung, Aggregation, Komposition usw. • Persistenz-Frameworks implementieren ORM IBS - SS 2009 359 Historisches zu EJB und Persistenz Einige hilfreiche historische Fakten zu den Java-Persistenz-Mechanismen: • EJB 1.x (1997): Dauerhafte Speicherung ist Problem des Anwendungsprogrammierers • EJB 2.x (2001): Container Managed Persistence“ (CMP) ” – Datenobjekt wird als Entity Bean“ definiert ” – Container besorgt die Synchronisation mit der Datenbank – Beziehungen müssen in der Container-Konfiguration definiert sein EJB 2.x wird derzeit noch verbreitet genutzt! IBS - SS 2009 360 • Sun entwickelte zwei Persistenz-Standards – 2001: JDO ( Java Data Objects“), wird von Apache weiterentwickelt ” – 2006: JPA ( Java Persistence API“) ” – Gemeinsames Merkmal: ∗ nicht nur für JEE, sondern für Java allgemein nutzbar ∗ persistente Datenobjekte sind POJOs • EJB 3.0 (2006): basiert auf JPA – Das allgemeinere JPA-Konzept ersetzt das ältere CMP-Modell – Entity-Beans sind jetzt POJOs • Für die JPA gibt es mehrere Standard-Implementierungen ( Persistenz-Frameworks“): ” – JBoss Hibernate, Open Source, (sehr weit verbreitet) – Oracle Toplink, Open Source, (in Netbeans integriert) – BEA Kodo / Apache OpenJPA IBS - SS 2009 361 Kommunikation mit EJBs • EJBs benutzten die CORBA-Middleware zur Kommunikation – Middleware: Software-Infrastruktur zur Kommunikation – CORBA (Common ORB Architecture): plattform- und sprachunabhängiger OMG-Standard für objektorientierte Middleware – ORB (Object Request Broker): objektorientierter Kommunikationsbus“ ” – Broker: Makler-Dienst, vermittelt zwischen Client und Server • ORB-Kommunikationsschema: entfernter Methodenaufruf • CORBA-Kommunikationsprotokoll: IIOP (Internet Inter-ORB-Protocol) • Java-API zur CORBA-Nutzung: RMI (Remote Method Invocation) • EJB-Adressen sind CORBA-Objektreferenzen und werden über Verzeichnisdienste verwaltet IBS - SS 2009 362 Kommunikation mit EJBs EJB EJB−Client Geschäftslogik EJB−Adresse Container−Methoden: JNDI Interceptor RMI Verzeichnis− dienst Skeleton Stub Parameter serialisieren versenden Transaktionslogik Persistenz Lebenszyklus Ergebnis empfangen deserialisieren Parameter empfangen deserialisieren Container− Konfiguration Ergebnis serialisieren versenden ORB / IIOP EJB−Container IBS - SS 2009 363 EJB-Typen: Session Bean Merkmale: • implementiert Workflow • transient, kurzlebig • Client-gebunden • kann in Transaktionen eingebunden werden • modifiziert Datenbank Anwendungs-Beispiele: • Bankautomat-Steuerung • Warenkorb im Online-Shop (nicht-persistent) • Fabrik-Objekt • Suche in einem Auktionsportal IBS - SS 2009 364 Session-Bean-Kategorien • Zustandslos ( stateless“) ” – kein Gedächtnis“ über den Methodenaufruf hinweg ” – kann nacheinander für unterschiedliche Clients verwendet werden – Poolbildung möglich • Zustandsvoll ( stateful“) ” – Bean mit Konversationsgedächtnis“ ” – Nutzung vergleichbar mit dem Session-Objekt eines Servlets – modelliert typischerweise Sitzung eines Client – nur eine zustandsvolle Session-Bean pro Client – kein Pooling möglich, ineffizienter als stateless Beans IBS - SS 2009 365 EJB-Typen: Entity Bean (EJB-Version 2.x) Merkmale: • repräsentiert persistente Daten (meist Datenbank-Daten) • unterstützt konkurrierende Client-Zugriffe Beispiele: • Bankkonto-Bean • Produktkatalog im Online-Shop Wegfall ab EJB 3.0: • Ab EJB-Version 3.0 sind die Entity EJBs überflüssig! • stattdessen persistente Objekte der JPA verwenden (Annotation: @Entity) • Diese sind keine EJBs, sondern POJOs, werden aber auch als Entity Beans bezeichnet • mehr dazu: Persistenz für alle“ ” http://www.ordix.de/ORDIXNews/2_2007/Java_J2EE_JEE/java_persistence_api.html} IBS - SS 2009 366 MOM und JMS MOM: Message-Oriented Middleware“ ” • asynchrone Client-Server-Kommunikation: – Client sendet Auftrag ( Auftragsnachricht“) ” – Nachrichten können zwischengespeichert werden ( message queue“) ” – Server kann Auftrag zeitversetzt bearbeiten • lose Kopplung zwischen Client und Server (gegenüber RMI) • verschiedene Nachrichtenaustausch-Muster, z.B. – Auftrag - Antwort – Publisher-Subscriber – Multicast • Einsatz im kommerziellen Backend-Bereich • Beispiel: IBM Websphere MQ (früher MQSeries) JMS: Java Message Service“ ” • JMS: Java API zur Verwendung von MOM-Systemen IBS - SS 2009 367 EJB-Typen: Message Bean Merkmale: • kapselt den Zugriff auf MOM-Server • bearbeitet JMS-Nachrichten Beispiele: • nachrichtenorientierte Auftragserstellung IBS - SS 2009 368 Schnittstellen von EJBs Remote Interface • Geschäftslogik-Schnittstelle für den Client • enthält die applikationsspezifischen Geschäftsmethoden“ ” • Aufrufe indirekt über den EJB-Container Local Interface • optionale Geschäftslogik-Schnittstelle für lokale Clients (lokal: gleiche virtuelle Maschine) • lokale Methodenaufrufe statt RMI → bessere Performanz • Verletzung des Ortstransparenz-Prinzips Home-Interface • Fabrik-Schnittstelle für den Client • zum Erzeugen, Löschen und Suchen von Bean-Objekten • wird von der Bean direkt implementiert IBS - SS 2009 369 Schnittstellen zwischen Bean und Bean-Container • Methoden zur Lebenszykluskontrolle durch EJB-Container IBS - SS 2009 370 EJB 2.x versus EJB 3.x Der wesentliche Fortschritt der Version 3: Vereinfachung der EJB-Verwendung • In den EJB-Versionen 1 und 2 mussten umfangreiche Deployment-Deskriptoren in XML geschrieben werden • Der Anwendungsprogrammierer musste zu jeder EJB mehrere Schnittstellen implementieren • Bei EJB-Version 3 wird alles, was automatisch generiert werden kann, auf der Basis von Java-Annotationen erzeugt, z.B. die Implementierung des Home-Interface von Session Beans und der Deployment-Deskriptor • Der Anwendungsprogrammierer beschränkt sich nun im Wesentlichen auf Implementierung der Geschäftslogik: Deklaration und Implementierung des Remote Interface IBS - SS 2009 371 Beispiel: Hallo Welt“-Stateless Session Bean ” Remote Interface: HalloWelt.java package ibs.ejb; public interface HalloWelt { public String getBegruessungsText(); } Anmerkung: Remote-Interface ist ein POJO, bis EJB-Version 2 war das nicht so: public interface HalloWelt extends EJBObject { ... } IBS - SS 2009 372 Beispiel: Implementierung des Remote-Interface Implementierung: HalloWeltImpl.java package ibs.ejb; import import import import javax.ejb.Remote; javax.ejb.Stateless; java.rmi.RemoteException; java.util.*; @Stateless @Remote(ibs.ejb.HalloWelt.class) public class HalloWeltImpl implements HalloWelt, Serializable { public String getBegruessungsText() throws RemoteException { return "Hallo Welt!"; } } IBS - SS 2009 373 Beispiel: Hallo Welt“-Statefull Session Bean ” Remote Interface: HalloWeltStateful.java package ibs.ejb; public interface HalloWeltStateful { public String getBegruessungsText(); public void setBegruessungsText(String text); } IBS - SS 2009 374 Implementierung: HalloWeltStatefulImpl.java package ibs.ejb; import import import import javax.ejb.Remote; javax.ejb.Stateful; java.rmi.RemoteException; java.util.*; @Stateful @Remote(ibs.ejb.HalloWeltStateful.class) public class HalloWeltStatefulImpl implements HalloWeltStateful, Serializable { private String begruessungsText: public String getBegruessungsText() throws RemoteException { return begruessungsText; } public void setBegruessungsText(String text) throws RemoteException { begruessungsText = text; } } IBS - SS 2009 375 Beispiel: Nutzung einer EJB in einem Servlet import javax.naming.* import javax.servlet.http.* public class HalloWeltClientServlet extend HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); Context ctx = new InitialContext(); HalloWelt hwEJB = (HalloWelt) ctx.lookup("ibs.ejb.HalloWelt"); String begruessungsText = hwEJB.getBegruessungsText(); ctx.close(); ... } catch (NamingException e) { e.printStackTrace(); } } IBS - SS 2009 376 Deployment-Aspekte für EJBs • Eine EJB besteht aus diversen Java-Schnittstellen und Klassen, die teilweise aus den Annotationen automatisch generiert werden Die zugehörigen Dateien werden in ein Jar-Archiv verpackt • EARs: Eine komplette Webanwendung mit EJBs wird i.d.R. in eine ZIP/JAR-Archivdatei mit der Endung ear ( Enterprise Application Archive“) ” verpackt • Ein EAR enthält einen Deployment-Deskriptor META-INF/application.xml • Der Deskriptor deklariert die zur Anwendung gehörenden EJBs (jar-Archive) und das Web-Frontend (war-Archiv) • Eintragung der EJBs in den Verzeichnisdienst ist in manchen Aspekten vom EJB-Container abhängig und mit Annotationen kontrollierbar, z.B. @Stateful(mappedName="...") IBS - SS 2009 377 Alternative Java-Frameworks • Spring – meist als die schlankere“ Haupt-Konkurrenz zu JEE angesehen ” – wird neuerdings auch mit JEE kombiniert verwendet (z.B. in BEA Weblogic) – mehr: http://www.springframework.org • JBoss Seam – – – – Versuch, diverse Techniken zu verbinden Front-End: Ajax, JSF, Portlets u.a. Backend: Hibernate, EJB 3.0, BPM ( Business Process Management“) ” mehr: http://www.seamframework.org IBS - SS 2009 378 SOA - Service-orientierte Architektur • Komponentenmodell für verteilte Anwendungen • Komponenten sind Dienste ( Services“) ” – Rollen: Dienstanbieter ( Service Provider“) ” Dienstnutzer ( Service Requester“) ” – formal definierte Dienste-Schnittstelle – asynchrone Kommunikation, MOM – Service-Verzeichnisse • Kommunikationsbasis: plattformunabhängige Standards (meist Webservices) HTTP, XML, XML-RPC, SOAP, WSDL, UDDI, . . . • Implementierung der Dienste: – herkömmliche Programmiersprachen (Java, C#, Skriptsprachen) – Orchestrierung durch Prozesssprachen (z.B. BPEL - Business Process Execution Language) IBS - SS 2009 379 Typische Probleme größerer Unternehmen Flexibles Geschäftsprozessmanagement (BPM - Business Process Management) • Geschäftsprozesse im Unternehmen ändern sich schneller als früher • Anforderung: Änderung und Neudefinition von Geschäftsprozessen mit geringem Aufwand • Lösungsansatz: Geschäftsprozesse aus Diensten baukastenmäßig zusammenstellen Idealbild: graphischer Prozessdesigner“ mit automatischer Code-Erzeugung ” statt Refactoring von 5000 Zeilen Java-Code Integration heterogener Anwendungen (EAI - Enterprise Application Integration) • Anwendungen berechnen und verwalten Daten, die in anderen Anwendungen benötigt werden • Datenaustausch über gemeinsam benutzte Datenbanken oft nicht realisierbar • Lösungsansatz: Dienste-orientierte Middleware als einheitliche Schnittstelle zur Kommunikation zwischen vorhandenen Anwendungen IBS - SS 2009 380 Integration externer Anwendungen • zunehmende Anzahl unternehmensübergreifender Anwendungen – Anwendungen als allgemein im Web verfügbare Dienstleistung – Kollaboration zwischen zwei Unternehmen • Lösungsansatz: externe und interne Anwendungen über Dienste-Schnittstellen koppeln IBS - SS 2009 381 SOA – Architekturmerkmale • lose Kopplung der Komponenten • Asynchroner Nachrichtenaustausch als Kommunikationsbasis • komplexes Nachrichten-Konzept • offene Standards • Dienst als einheitliches Abstraktionskonzept Ein Dienst repräsentiert beispielsweise – – – – Prozesslogik (z.B. kompletten Geschäftsprozess) Daten/Entitäten (z.B. Kunde, Auftrag) technische Funktionalität (z.B. Benutzer-Authentifizierung, Lastverteilung) Schnittstelle zu einer Anwendung ( Wrapper“) ” IBS - SS 2009 382 Webservices • Auf XML und anderen offenen Standards basierende Middleware • Kernkomponenten – Nachrichten-System: SOAP, Nutzlast sind XML-Dokumente – Schnittstellenspezifikation: XML Schema und WSDL (Webservice Description Language) – Verzeichnisdienst: UDDI (Universal Description, Discovery and Integration) • Erweiterungen: WS-* (Security, Transaction, ...) • Diensteorchestrierung mit WS-BPEL IBS - SS 2009 383 Verantwortung für Standards und Spezifikationen • W3C – XML-Standards als SOA-Basis (XML, XML Schema, XSLT usw.) – SOA-spezifische Standards (SOAP, WSDL u.a.) • OASIS – Organization for the Advantage of Structured Information Standards ebXML, WS-BPEL, WS-Security, UDDI, SAML (Security Assertions Markup Language), XACML (Extensible Access Control Markup Language). • Web Services Interoperability Organization (WS-I) – Basic Profile“: Empfehlung für eine Zusammenstellung der ” WS-Technologien und ihrer Versionen – Anwendungsmuster – Beispiel-Implementierungen IBS - SS 2009 384 SOAP W3C-Standard für den Nachrichtenaustausch (früher Simple Object Access Protocol“). ” Bestandteile des SOAP-Standards • SOAP-Envelope: XML-Nachrichtenformat – Envelope“ enthält Header“ und Body ” ” – Header“-Elemente sind Metainformationen zur Nachricht ” – Nutzlast: XML-Dokumente • SOAP-Processing: Regeln für den Nachrichtentransport • SOAP-Binding: Anbindung an die darunter liegende Transportschicht (z.B. HTTP) Verwendungsmöglichkeiten • Asynchrone Vermittlung von XML-Dokumenten (SOA-typisch) • RPC (untypisch für SOA) IBS - SS 2009 385 Beispiel für eine SOAP-Nachricht: Reisebuchung (W3C-Spezifikation SOAP Version 1.2) <?xml version=’1.0’ ?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:Header> <m:reservation xmlns:m="http://travelcompany.example.org/reservation" env:role="http://www.w3.org/2003/05/soap-envelope/role/next" env:mustUnderstand="true"> <m:reference>uuid:093a2da1-q345-739r-ba5d-pqff98fe8j7d</m:reference> <m:dateAndTime>2001-11-29T13:20:00.000-05:00</m:dateAndTime> </m:reservation> <n:passenger xmlns:n="http://mycompany.example.com/employees" env:role="http://www.w3.org/2003/05/soap-envelope/role/next" env:mustUnderstand="true"> <n:name>Karl Dall</n:name> </n:passenger> </env:Header> IBS - SS 2009 386 <env:Body> <p:itinerary xmlns:p="http://travelcompany.example.org/reservation/travel"> <p:departure> <p:departing>New York</p:departing> <p:arriving>Los Angeles</p:arriving> <p:departureDate>2001-12-14</p:departureDate> <p:departureTime>late afternoon</p:departureTime> </p:departure> <p:return> <p:departing>Los Angeles</p:departing> <p:arriving>New York</p:arriving> <p:departureDate>2001-12-20</p:departureDate> <p:departureTime>mid-morning</p:departureTime> </p:return> </p:itinerary> <q:lodging xmlns:q="http://travelcompany.example.org/reservation/hotels"> <q:preference>none</q:preference> </q:lodging> </env:Body> </env:Envelope> IBS - SS 2009 387 WSDL – Webservice Description Language • XML-Sprache zur Schnittstellenbeschreibung eines Dienstes • Ein Webservice hat eine Schnittstelle • Die Schnittstelle besteht aus beliebig vielen Operationen • Eine Operation definiert eine Eingabe- und/oder eine Ausgabe-Nachricht • benötigte Datentypen sind i.d.R. separate Schema-Definitionen • Aufteilung der Schnittstellenbeschreibung in – abstrakte Beschreibung (portType oder interface) – konkrete Beschreibung (Transport-Endpunkte) IBS - SS 2009 388 WS-Erweiterungen • Viele zusätzliche Leistungsmerkmale der Kommunikations-Infrastruktur sind als WS-Erweiterungen (WS-*) standardisiert, z.B. – WS-Transaction: verteilte Transaktionen – WS-ReliableMessaging: zuverlässige Nachrichtenübermittlung – WS-Security: Verschlüsselung, Authentifizierung u.a. Sicherheitsfunktionen • Die Nutzung dieser Leistungsmerkmale erfolgt über SOAP-Header • SOAP ist dadurch vergleichweise leicht erweiterbar IBS - SS 2009 389 Webservice Baukastensystem IBS - SS 2009 390 Beispiel für WS-Erweiterungen: Digital signierte Dokumente • Der XML-Standard XML-Signature ermöglicht die elektronische Signatur von XML-Dokumenten (oder einzelnen XML-Elementen) • WS-Security nutzt diesen XML-Standard für SOAP: – XML-Nutzlast der SOAP-Nachricht wird digital signiert – Signatur und Angaben zur Auswertung werden als SOAP-Header in die Nachricht integriert. IBS - SS 2009 391 Web-Services Orchestrierung BPEL WS−Reliable Messaging WS−Transaction Dienst− Qualität WS−Coordination WSDL WS−Security WS−Policy SOAP UDDI Beschreibung Entdeckung Nachrichten− Format XML Transportdienste: HTTP, E−Mail, TCP, ... Transport IBS - SS 2009 392 Web-Services und Java Java enthält mehrere APIs für die Web-Service-Entwicklung. Webservices und WS-Clients lassen sich auch ohne Befassung mit der XML-Ebene (SOAP, WSDL) entwickeln. • JAXB (Java Architecture for XML Binding) ist eine API zur Erzeugung von Java-Klassen aus WSDL-Schnittstellen und umgekehrt • SAAJ (SOAP with Attachments API for Java) ist eine API zur einfachen Verarbeitung von SOAP-Nachrichten • JAX-WS (Java API for XML - Web Services) ist eine API, die zur Erzeugung von Webservices aus Java-Code mit Annotationen dient • und weitere (JAXM, JAXR, . . . ) IBS - SS 2009 393 Java WS-APIs WS−Erweiterungen Security Transaction Reliable Messaging JAX−WS WSDL Java JAXB WS−Anwendung XML−freie WS−Programmierung SAAJ JAXP SOAP−Nachrichten XML Verarbeiten IBS - SS 2009 394 Beispiel für JAX-WS package helloservice.endpoint; import javax.jws.WebService; @WebService() public class Hello { private String message = new String("Hello, "); public void Hello() {} @WebMethod() public String sayHello(String name) { return message + name + "."; } } IBS - SS 2009 395 ESB - Enterprise Service Bus • Ein ESB ist ein intelligenter Nachrichtenvermittler zur Integration heterogener Anwendungen in eine SOA (unterschiedliche Protokolle, Nachrichtenformate, APIs) • Aufgaben: Nachrichtenaustausch mit API-/Protokoll-Transformation, Orchestrierungs-Engine, dynamisches content-abhängiges Routing (z.B. für Lastverteilung), Dienstverzeichnis, Sicherheitsdienste • Jede Anwendung wird als Service an den ESB angebunden Vorteil: weniger Schnittstellen gegenüber Punkt-zu-Punkt-Kommunikation • JBI (Java Business Integration) ist ein Java-Standard für ESBs • JCA (Java Connector Architecture) ist ein Standard für EAI-Adapter • Produkt-Beispiele: IBM Websphere ESB, JBoss ESB, Microsoft BizTalk, Mule • In Netbeans ist der JBI-konforme OpenESB integriert IBS - SS 2009 396