Internetbasierte Systeme“ – SS 2009 - Benutzer-Homepage

Werbung
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
&
&
ampersand“
”
'
’
apostrophe“
”
"
"
quotation mark“
”
less than“
<
<
”
greater than“
>
>
”
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ü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 überprü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
Herunterladen