Zusammenfassung - auf ThomasKaelin.ch
Transcription
Zusammenfassung - auf ThomasKaelin.ch
Internettechnologien Internettechnologien Zusammenfassung v1.0 Kälin Thomas, Abteilung I HS 07 Kälin Thomas, Abt I 1/96 17.12.2007 Internettechnologien 1. DEPLOYMENT-ARCHITEKTUR FÜR WEBAPPLIKATIONEN...................................................................... 11 1.1. Zuordnungen: Technologien zu Device ............................................................................ 11 2. GRUNDLAGEN ............................................................................................................................. 12 2.1. TCP / IP ............................................................................................................................ 12 2.2. Ports ................................................................................................................................. 12 2.3. Adressen ........................................................................................................................... 12 2.3.1. Uniform Resource Identifier (URI) ..................................................................................... 12 2.3.2. Uniform Resource Locator (URL) ....................................................................................... 12 2.3.3. Uniform Resource Names (URN) ....................................................................................... 12 2.4. HTTP ................................................................................................................................. 13 2.4.1. Version 1.0 / Version 1.1 .................................................................................................. 13 2.4.2. Persistent / Non-Persistent ............................................................................................... 13 2.4.3. Anfragen / Antworten....................................................................................................... 13 2.4.4. HTTP-Methoden ............................................................................................................... 13 2.4.5. HTTP-Statuscodes ............................................................................................................ 14 2.4.6. GET vs POST ................................................................................................................... 14 2.4.7. Authentifizierung.............................................................................................................. 14 2.5. Representational State Transfer (REST) .......................................................................... 14 2.5.1. Cookies ........................................................................................................................... 14 2.5.2. Session............................................................................................................................ 15 2.6. Server Side Includes (SSI) ............................................................................................... 15 2.7. CGI.................................................................................................................................... 15 2.7.1. Beispielcode..................................................................................................................... 15 3. INHALT UND PRÄSENTATION ......................................................................................................... 16 3.1. Generisches vs. Graphisches Markup ............................................................................... 16 3.1.1. Graphisches Markup ......................................................................................................... 16 3.1.2. Generisches Markup ......................................................................................................... 16 3.2. Standard Generalized Markup Language (SGML) ............................................................ 16 3.2.1. Beispiel............................................................................................................................ 16 3.2.2. Document Type Definition (DTD) ...................................................................................... 16 3.3. Hypertext Markup Language (HTML) ............................................................................... 17 3.3.1. Versionen ........................................................................................................................ 17 3.3.2. Varianten (Strict, Transitional, Frameset)........................................................................... 17 3.3.3. Allgemeine Struktur.......................................................................................................... 17 3.3.4. Universalattribute............................................................................................................. 17 3.3.5. HTML-Elemente ............................................................................................................... 17 3.3.6. Block-Elemente vs Inline-Elemente.................................................................................... 17 3.4. Extensible Markup Language (XML)................................................................................. 18 3.4.1. Beispiel............................................................................................................................ 18 3.4.2. Regeln (Wohlgeformtheit) ................................................................................................ 18 3.4.3. Namespaces .................................................................................................................... 18 3.4.4. XML DTD (Document Type Definition) ............................................................................... 18 3.4.5. Sonderzeichen ................................................................................................................. 19 3.5. Extensible Hypertext Markup Language (XHTML) ........................................................... 19 3.5.1. XHTML 1.0....................................................................................................................... 19 3.5.2. XHTML 1.1....................................................................................................................... 19 3.6. Cascading Style Sheets (CSS)........................................................................................... 20 3.6.1. Grund-Syntax................................................................................................................... 20 3.6.2. Selektoren ....................................................................................................................... 20 3.6.3. Einbindung als internes Style Sheet................................................................................... 20 3.6.4. Einbindung als externes Style Sheet .................................................................................. 20 3.6.5. Einbindung als inline Attribut ............................................................................................ 20 4. JAVA SERVLETS........................................................................................................................... 21 4.1. Was sind Servlets?............................................................................................................ 21 4.2. Servlet-Container ............................................................................................................. 21 4.3. Ausführen von Servlets .................................................................................................... 21 4.3.1. Aufruf von Servlets (Browser) ........................................................................................... 21 Kälin Thomas, Abt I 2/96 17.12.2007 Internettechnologien 4.3.2. Verlinken von Servlets ...................................................................................................... 21 4.4. Konfiguration (web.xml) .................................................................................................. 21 4.4.1. Registrieren von Servlets .................................................................................................. 21 4.4.2. Initialisierungsparameter festlegen.................................................................................... 22 4.4.3. Session-Timeout .............................................................................................................. 22 4.4.4. Filter ............................................................................................................................... 22 4.5. Servlet API........................................................................................................................ 22 4.5.1. Überblick über wichtige Klassen und Methoden .................................................................. 22 4.5.2. Mechanismus beim Aufruf................................................................................................. 22 4.6. Lebenszyklus .................................................................................................................... 23 4.6.1. Übersicht ......................................................................................................................... 23 4.6.2. init()................................................................................................................................ 23 4.6.3. destroy() ......................................................................................................................... 23 4.6.4. service() .......................................................................................................................... 23 4.7. HTTP – Servlet .................................................................................................................. 24 4.7.1. Einleitung ........................................................................................................................ 24 4.7.2. Erstes Beispiel.................................................................................................................. 24 4.7.3. HttpServletRequest .......................................................................................................... 24 4.7.4. HttpServletResponse ........................................................................................................ 25 4.8. Servlet Context ................................................................................................................. 25 4.9. Session.............................................................................................................................. 25 4.9.1. Session starten & Daten abrufen ....................................................................................... 25 4.9.2. Beenden einer Session ..................................................................................................... 26 4.9.3. Tracking .......................................................................................................................... 26 4.10. Cookies ............................................................................................................................. 26 4.10.1. Cookie erzeugen & versenden........................................................................................... 26 4.10.2. Cookie empfangen ........................................................................................................... 26 4.11. RequestDispatcher ........................................................................................................... 26 4.11.1. Forward() ........................................................................................................................ 26 4.11.2. Include() ......................................................................................................................... 26 4.12. Filter ................................................................................................................................. 26 4.12.1. Anwendungsbeispiele ....................................................................................................... 27 4.12.2. Beispiel............................................................................................................................ 27 5. JAVA SERVER PAGES.................................................................................................................... 28 5.1. Einleitung.......................................................................................................................... 28 5.2. JSP vs Servlets.................................................................................................................. 28 5.2.1. Servlets ........................................................................................................................... 28 5.2.2. JSP.................................................................................................................................. 28 5.3. JSP Request-Verarbeitung ............................................................................................... 28 5.4. Code-Beispiel .................................................................................................................... 29 5.5. JSP Komponenten............................................................................................................. 29 5.5.1. Fixed Template Data ........................................................................................................ 29 5.5.2. JSP Kommentare.............................................................................................................. 29 5.5.3. JSP Direktiven.................................................................................................................. 29 5.5.4. JSP Deklarationen ............................................................................................................ 30 5.5.5. JSP Expressions ............................................................................................................... 30 5.5.6. JSP Scriptlets ................................................................................................................... 30 5.5.7. JSP Standard Actions........................................................................................................ 30 5.6. JSP Syntax-Übersicht ....................................................................................................... 31 5.7. Vordefinierte Variablen .................................................................................................... 31 5.8. Java Beans ........................................................................................................................ 31 5.8.1. Anforderungen................................................................................................................. 31 5.8.2. Codebeispiel .................................................................................................................... 31 5.9. JSP Documents ................................................................................................................. 31 5.9.1. Identifikation als JSP Document ........................................................................................ 31 5.9.2. Einschränkungen.............................................................................................................. 31 5.10. JSP Expression Language ................................................................................................. 32 5.10.1. Immediate Evaluation....................................................................................................... 32 5.10.2. Deferred Evaluation.......................................................................................................... 32 Kälin Thomas, Abt I 3/96 17.12.2007 Internettechnologien 5.10.3. Value Expression.............................................................................................................. 32 5.10.4. Method Expression ........................................................................................................... 32 5.10.5. Operatoren ...................................................................................................................... 33 5.11. Tag Libraries ..................................................................................................................... 33 5.11.1. Einleitung ........................................................................................................................ 33 5.11.2. Tag Library Descriptor (TLD)............................................................................................. 33 5.11.3. Einbinden einer Tag Library .............................................................................................. 34 5.11.4. Verwendung einer Tag Library .......................................................................................... 34 5.12. JSTL – Java Server Pages Standard Tag Library .............................................................. 34 5.12.1. Einbinden der Librarys...................................................................................................... 34 5.12.2. Core Tag Libary (Präfix: c)................................................................................................ 34 5.12.3. XML Tag Library (Präfix: x) ............................................................................................... 35 5.12.4. Internationalization Tag Library (Präfix: fmt) ..................................................................... 35 5.12.5. SQL Tag Library (Präfix: sql) ............................................................................................. 35 5.12.6. Functions Tag Library (Präfix: fn) ...................................................................................... 35 5.13. Custom Tags ..................................................................................................................... 35 5.13.1. Arten der Implementierung............................................................................................... 35 5.13.2. Benötigte Elemente .......................................................................................................... 36 5.13.3. Simple Tag Handler.......................................................................................................... 36 5.13.4. Classic Tag Handler.......................................................................................................... 36 5.14. Beispiel eines Custom Tag mit Attribut ............................................................................ 36 5.14.1. JSP Dokument (= XML-Schreibweise) ................................................................................ 37 5.14.2. Tag Handler..................................................................................................................... 37 5.14.3. Tag Library Descriptor (TLD)............................................................................................. 37 6. JAVA SCRIPT .............................................................................................................................. 38 6.1. Einführung ........................................................................................................................ 38 6.1.1. Allgemein ........................................................................................................................ 38 6.1.2. Eigenschaften .................................................................................................................. 38 6.1.3. Vergleich: Java und Java Script......................................................................................... 38 6.2. Einbinden von JS .............................................................................................................. 38 6.2.1. In HTML .......................................................................................................................... 38 6.2.2. Externes JS-File ............................................................................................................... 38 6.3. Grundlegendes.................................................................................................................. 38 6.3.1. Datentypen...................................................................................................................... 38 6.3.2. Namensgebung................................................................................................................ 38 6.3.3. Operatoren ...................................................................................................................... 38 6.3.4. Sichtbarkeiten.................................................................................................................. 39 6.4. Anweisungen .................................................................................................................... 39 6.4.1. Variablendeklaration......................................................................................................... 39 6.4.2. IF / IF … ELSE ................................................................................................................. 39 6.4.3. FOR-Schleife .................................................................................................................... 39 6.4.4. WHILE-Schleife ................................................................................................................ 39 6.4.5. SWITCH .......................................................................................................................... 39 6.4.6. Sprungmarken ................................................................................................................. 39 6.4.7. Fehlerbehandlung ............................................................................................................ 39 6.4.8. WITH .............................................................................................................................. 39 6.5. Funktionen........................................................................................................................ 40 6.5.1. Funktionsdefinition ........................................................................................................... 40 6.5.2. Funktionsaufrufe .............................................................................................................. 40 6.5.3. Funktionsparameter ......................................................................................................... 40 6.5.4. Funktionen als Objekte ..................................................................................................... 40 6.5.5. Innere Funktionen............................................................................................................ 40 6.6. Objektmodell .................................................................................................................... 40 6.6.1. Allgemein ........................................................................................................................ 40 6.6.2. Erzeugen eines Objektes .................................................................................................. 40 6.6.3. Zugriff auf Attribute ......................................................................................................... 40 6.6.4. Konstruktor...................................................................................................................... 41 6.6.5. Vererbung ....................................................................................................................... 41 6.7. Array ................................................................................................................................. 41 Kälin Thomas, Abt I 4/96 17.12.2007 Internettechnologien 6.7.1. Array erzeugen ................................................................................................................ 41 6.7.2. Array erweitern ................................................................................................................ 41 6.8. Eingebaute Objekte .......................................................................................................... 41 6.9. Document Object Model (DOM)........................................................................................ 41 6.9.1. Einleitung ........................................................................................................................ 41 6.9.2. DOM Level....................................................................................................................... 41 6.9.3. Vordefinierte Objekte (DOM Level 0) ................................................................................. 41 6.9.4. Zugriff auf Kind-Knoten .................................................................................................... 42 6.9.5. Zugriff auf Nachbar-Knoten............................................................................................... 42 6.9.6. Zugriff über Tag-Name ..................................................................................................... 42 6.9.7. Zugriff über ID................................................................................................................. 42 6.9.8. Knoten erzeugen und anhängen........................................................................................ 42 6.9.9. Knoten erzeugen und einfügen ......................................................................................... 42 6.9.10. Knoten entfernen ............................................................................................................. 42 6.9.11. Werte lesen / schreiben.................................................................................................... 42 6.9.12. Attribute lesen / schreiben................................................................................................ 42 6.9.13. CSS lesen / schreiben (Ab DOM Level 2)............................................................................ 42 6.10. Event Handler ................................................................................................................... 42 6.10.1. Interaktive Handler .......................................................................................................... 42 6.10.2. Nicht-Interaktive Handler.................................................................................................. 42 6.10.3. Einbauen von Handlern .................................................................................................... 42 6.10.4. THIS in Handlern ............................................................................................................. 43 6.10.5. On Load – Problem .......................................................................................................... 43 6.11. Sonstiges .......................................................................................................................... 43 6.11.1. Live Connect .................................................................................................................... 43 7. AJAX......................................................................................................................................... 44 7.1. Einführung und Begriffe ................................................................................................... 44 7.1.1. DHTML ............................................................................................................................ 44 7.1.2. Remote Scripting.............................................................................................................. 44 7.1.3. Ajax ................................................................................................................................ 44 7.2. Unterschied zu traditionellen Webapplikationen ............................................................. 44 7.3. Problembereich 1: Transports .......................................................................................... 45 7.3.1. XMLHttpRequest .............................................................................................................. 45 7.3.2. On-Demand JavaScript ..................................................................................................... 46 7.3.3. IFrame ............................................................................................................................ 47 7.3.4. IMG................................................................................................................................. 47 7.3.5. Vergleich der unterschiedlichen Transports ........................................................................ 47 7.4. Problembereich 2: Übermittlungsformate ....................................................................... 47 7.4.1. Anmerkung...................................................................................................................... 47 7.4.2. Plain Text ........................................................................................................................ 48 7.4.3. XML ................................................................................................................................ 48 7.4.4. X(HTML).......................................................................................................................... 48 7.4.5. JSON – Java Script Object Notation ................................................................................... 48 7.5. Problembereich 3: Generierung von HTML ...................................................................... 49 7.5.1. Anmerkung...................................................................................................................... 49 7.5.2. DOM ............................................................................................................................... 49 7.5.3. String + innerHTML.......................................................................................................... 49 7.5.4. Clientseitiges Templating .................................................................................................. 50 7.5.5. XSLT – Extensible Stylesheet Language Transformations .................................................... 50 7.5.6. Vorformatiertes HTML ...................................................................................................... 50 7.5.7. E4X - ECMAScript for XML................................................................................................. 50 7.6. Architekturdiskussionen................................................................................................... 50 7.6.1. Traditionelle Webapplikationen ......................................................................................... 50 7.6.2. RIA - Rich Internet Application.......................................................................................... 50 7.6.3. SPA – Single Page Application ........................................................................................... 50 7.7. Andere Problemstellungen ............................................................................................... 51 7.7.1. Unterschiedliche Implementierungen von XMLHttpRequest ................................................. 51 7.7.2. Server Push-Problem ........................................................................................................ 51 7.7.3. Usability .......................................................................................................................... 51 Kälin Thomas, Abt I 5/96 17.12.2007 Internettechnologien 7.7.4. Suchmaschinen ................................................................................................................ 51 8. ARCHITEKTUR-PATTERNS FÜR WEB-APPLIKATIONEN ........................................................................ 52 8.1. Logische Architektur......................................................................................................... 52 8.1.1. Beschreibung ................................................................................................................... 52 8.1.2. Beispiele bei Webtechnologien .......................................................................................... 52 8.2. Physische Architektur....................................................................................................... 52 8.2.1. Beschreibung ................................................................................................................... 52 8.2.2. Beispiele bei Webtechnologien .......................................................................................... 52 8.3. Model View Controller (MVC) ........................................................................................... 52 8.3.1. Beschreibung ................................................................................................................... 52 8.3.2. MVC und Web-Applikationen ............................................................................................. 52 8.3.3. MVC-Umsetzung mittels Java-Technologien ....................................................................... 53 8.4. Andere Patterns................................................................................................................ 53 8.4.1. Application Controller ....................................................................................................... 53 8.4.2. Front Controller................................................................................................................ 53 8.4.3. Page Controller ................................................................................................................ 53 8.4.4. Template View ................................................................................................................. 54 8.4.5. Transform View................................................................................................................ 54 8.4.6. Two Step View................................................................................................................. 54 9. STRUTS ..................................................................................................................................... 55 9.1. Einleitung.......................................................................................................................... 55 9.2. Model View Controller – Architektur ................................................................................ 55 9.2.1. Übersicht ......................................................................................................................... 55 9.2.2. Controller ........................................................................................................................ 55 9.2.3. Model .............................................................................................................................. 56 9.2.4. View................................................................................................................................ 56 9.2.5. Ablauf eines Request........................................................................................................ 56 9.3. Konfiguration von Actions ................................................................................................ 56 9.3.1. Download ........................................................................................................................ 56 9.3.2. Web Application Deployment Descriptor (web.xml) ............................................................ 56 9.3.3. Action Mapping (struts-config.xml) .................................................................................... 57 9.4. Programmierung von Action-Klassen............................................................................... 57 9.4.1. Typischer Ablauf .............................................................................................................. 57 9.4.2. Multithreading.................................................................................................................. 58 9.4.3. Beispiel einer Action ......................................................................................................... 58 9.5. Programmierung von ActionForms................................................................................... 58 9.5.1. Lebenszyklus ................................................................................................................... 58 9.5.2. Beispiel einer ActionForm.................................................................................................. 58 9.6. Programmierung von View-Komponenten ....................................................................... 59 9.6.1. JSP-Syntax vs Struts-Syntax ............................................................................................. 59 9.6.2. Beispielformular ............................................................................................................... 59 9.6.3. Internationalisierung ........................................................................................................ 59 9.7. Struts Tag Libraries .......................................................................................................... 60 9.7.1. Einleitung ........................................................................................................................ 60 9.7.2. Bean Tags ....................................................................................................................... 60 9.7.3. HTML Tags ...................................................................................................................... 61 9.7.4. Logic Tags ....................................................................................................................... 62 9.8. DynaForm Beans............................................................................................................... 63 9.8.1. Einleitung ........................................................................................................................ 63 9.8.2. Verwendung .................................................................................................................... 63 9.8.3. Definition......................................................................................................................... 63 9.9. Validatoren ....................................................................................................................... 63 9.9.1. Einleitung ........................................................................................................................ 63 9.9.2. Einbindung ...................................................................................................................... 63 9.9.3. Verwendung .................................................................................................................... 63 9.9.4. Eigene Regeln.................................................................................................................. 64 9.9.5. Vordefinierte Validierungsregeln........................................................................................ 64 9.9.6. Fehlermeldungen ............................................................................................................. 64 Kälin Thomas, Abt I 6/96 17.12.2007 Internettechnologien 9.9.7. Client-Seitige Validierung .................................................................................................. 65 9.10. Struts Tiles........................................................................................................................ 65 9.10.1. Einleitung ........................................................................................................................ 65 9.10.2. Konfiguration ................................................................................................................... 65 9.10.3. Beispiel............................................................................................................................ 65 10. JAVA SERVER FACES (JSF) ........................................................................................................... 67 10.1. Grundlagen ....................................................................................................................... 67 10.1.1. Einleitung ........................................................................................................................ 67 10.1.2. Grundprinzip .................................................................................................................... 67 10.1.3. Bestandteile..................................................................................................................... 67 10.2. Lebenszyklus .................................................................................................................... 67 10.2.1. Phase 1: Restore View...................................................................................................... 67 10.2.2. Phase 2: Apply Request Values ......................................................................................... 67 10.2.3. Phase 3: Process Validations............................................................................................. 67 10.2.4. Phase 4: Update Model Values .......................................................................................... 67 10.2.5. Phase 5: Invoke Application.............................................................................................. 67 10.2.6. Phase 6: Render Response ............................................................................................... 67 10.3. UI Komponenten Modell................................................................................................... 68 10.3.1. Einleitung ........................................................................................................................ 68 10.3.2. Composite Pattern............................................................................................................ 68 10.3.3. Eingebaute Klassen .......................................................................................................... 68 10.4. JSF Events, Listener Model ............................................................................................... 68 10.4.1. Typen.............................................................................................................................. 68 10.4.2. Listener registrieren ......................................................................................................... 68 10.4.3. Listener implementieren (Value Change Listener)............................................................... 68 10.5. Validation Model ............................................................................................................... 69 10.5.1. Beispiel einer JSP-Seite..................................................................................................... 69 10.6. Managed Bean .................................................................................................................. 69 10.6.1. Definition (WEB-INF/faces-config.xml)............................................................................... 69 10.6.2. Zugriff ............................................................................................................................. 69 10.7. Navigation Rules............................................................................................................... 69 10.7.1. WEB-INF/faces-config.xml ................................................................................................ 69 10.7.2. JSP-Seite (login.jsp) ......................................................................................................... 69 10.7.3. Managed Bean Code ........................................................................................................ 69 10.8. Custom Converter............................................................................................................. 69 10.8.1. Verwendung .................................................................................................................... 69 10.8.2. Registrierung (WEB-INF/faces-config.xml) ......................................................................... 70 10.8.3. Implementierung ............................................................................................................. 70 10.9. Beispielapplikation ........................................................................................................... 70 10.9.1. UserNumberBean (Java-Quellcode) ................................................................................... 70 10.9.2. Web-Deskriptor (WEB-INF/web.xml) ................................................................................. 71 10.9.3. JSF-Konfiguration (WEB-INF/faces-config.xml)................................................................... 71 10.9.4. JSP-Seite 1 (greetings.jsp)................................................................................................ 72 10.9.5. JSP-Seite 2 (response.jsp) ................................................................................................ 72 11. ACCESSIBILITY - BARRIEREFREIHEIT.............................................................................................. 74 11.1. Definition .......................................................................................................................... 74 11.2. Standards.......................................................................................................................... 74 11.2.1. Web Content Accessibility Guidlines 1.0 (WCAG 1) ............................................................. 74 11.2.2. Web Content Accessibility Guidlines 2.0 (WCAG 2) ............................................................. 74 11.2.3. WAI-ARIA ........................................................................................................................ 74 11.3. Grundlegende Techniken.................................................................................................. 74 11.4. Barrierefreiheit bei AJAX .................................................................................................. 75 11.4.1. Herkömmliche Webseiten vs AJAX..................................................................................... 75 11.4.2. WCAG 1 und WCAG 2....................................................................................................... 75 11.4.3. Ratschläge....................................................................................................................... 75 11.5. Regeln für Formulare........................................................................................................ 75 11.5.1. Labels ............................................................................................................................. 75 11.5.2. Gruppieren von zusammengehörenden Feldern.................................................................. 75 Kälin Thomas, Abt I 7/96 17.12.2007 Internettechnologien 12. PORTLETS .................................................................................................................................. 76 12.1. Begriffe & Definitionen..................................................................................................... 76 12.1.1. Portal .............................................................................................................................. 76 12.1.2. Portlet ............................................................................................................................. 76 12.1.3. Portlet Container .............................................................................................................. 76 12.2. Aufbau .............................................................................................................................. 76 12.3. Vergleich: Portlets und Servlets ....................................................................................... 76 12.4. Lebenszyklus eines Portlets ............................................................................................. 77 12.4.1. Überblick ......................................................................................................................... 77 12.4.2. Initialisierung ................................................................................................................... 77 12.4.3. End of Service.................................................................................................................. 77 12.5. Request Verarbeitung....................................................................................................... 77 12.5.1. Phasen ............................................................................................................................ 77 12.6. Architektur eines Portals .................................................................................................. 78 12.7. Konfiguration eines Portlets............................................................................................. 78 12.7.1. WEB-INF/portlet.xml ........................................................................................................ 78 12.8. Entwicklung eines Portlets ............................................................................................... 78 12.8.1. Interface „Portlet“ ............................................................................................................ 78 12.8.2. Basisklasse „GenericPortlet“ .............................................................................................. 78 12.9. Modes ............................................................................................................................... 78 12.9.1. Konfiguration ................................................................................................................... 79 12.9.2. Mode wechseln ................................................................................................................ 79 12.10. Features .................................................................................................................... 79 12.10.1. Context ........................................................................................................................... 79 12.10.2. Window States................................................................................................................. 79 12.10.3. URLs ............................................................................................................................... 79 12.10.4. Portlet Preferences........................................................................................................... 80 12.10.5. User Information.............................................................................................................. 80 12.10.6. Session............................................................................................................................ 80 12.11. Portlets und JSP........................................................................................................ 81 12.11.1. Delegieren an JSP ............................................................................................................ 81 12.11.2. Portlet Tag Library ........................................................................................................... 81 12.12. Beispiel: Hello World................................................................................................. 81 12.12.1. WEB-INF/web.xml............................................................................................................ 81 12.12.2. WEB-INF/portlet.xml ........................................................................................................ 82 12.12.3. Portlet Klasse................................................................................................................... 82 12.12.4. Formular-Seite (Form.jsp)................................................................................................. 82 12.12.5. Ausgabe-Seite (Hello.jsp) ................................................................................................. 83 13. RUBY ON RAILS .......................................................................................................................... 84 13.1. Ruby - Grundlagen............................................................................................................ 84 13.1.1. Einleitung ........................................................................................................................ 84 13.1.2. Klasse ............................................................................................................................. 84 13.1.3. Setter / Getter ................................................................................................................. 84 13.1.4. Module ............................................................................................................................ 84 13.1.5. Array............................................................................................................................... 85 13.1.6. Hash ............................................................................................................................... 85 13.1.7. IF - Else .......................................................................................................................... 85 13.1.8. Switch ............................................................................................................................. 85 13.1.9. While / Until .................................................................................................................... 85 13.1.10. Exceptions ....................................................................................................................... 85 13.2. Rails – Einleitung.............................................................................................................. 85 13.2.1. Grundlagen...................................................................................................................... 85 13.2.2. Leitsätze.......................................................................................................................... 85 13.2.3. Merkmale ........................................................................................................................ 85 13.3. Rails – Architektur ............................................................................................................ 86 13.3.1. Ablauf beim Aufruf ........................................................................................................... 86 13.3.2. Verzeichnisstruktur........................................................................................................... 86 13.4. Rails – Routen .................................................................................................................. 86 Kälin Thomas, Abt I 8/96 17.12.2007 Internettechnologien 13.5. Rails – Controller .............................................................................................................. 86 13.5.1. Einfaches Beispiel............................................................................................................. 87 13.5.2. Umleiten.......................................................................................................................... 87 13.5.3. Cookies, Session & Flash .................................................................................................. 87 13.5.4. Filter ............................................................................................................................... 87 13.6. Rails – View ...................................................................................................................... 87 13.6.1. ActionView - Beispiel ........................................................................................................ 87 13.6.2. Helpers............................................................................................................................ 88 13.6.3. Partials ............................................................................................................................ 88 13.6.4. Layouts ........................................................................................................................... 88 13.7. Rails – Model .................................................................................................................... 88 13.7.1. SQL-Befehle..................................................................................................................... 89 13.7.2. CRUD .............................................................................................................................. 89 13.7.3. Beziehungen (1:n) ........................................................................................................... 89 13.7.4. Migrations ....................................................................................................................... 89 13.7.5. Unterschiedliche Datenbanken .......................................................................................... 89 13.8. Rails – Testing .................................................................................................................. 89 14. APPLETS .................................................................................................................................... 90 14.1. Was ist ein Applet? ........................................................................................................... 90 14.2. Einbindung in HTML.......................................................................................................... 90 14.2.1. Vollständige Spezifikation ................................................................................................. 90 14.2.2. Beispiel............................................................................................................................ 90 14.3. Beispiel eines Applets ....................................................................................................... 90 14.3.1. Version 1 ......................................................................................................................... 90 14.3.2. Version 2 ......................................................................................................................... 90 14.4. Lebenszyklus .................................................................................................................... 91 14.4.1. Anmerkung...................................................................................................................... 91 14.5. Sicherheit.......................................................................................................................... 91 14.5.1. Überwachung .................................................................................................................. 91 14.5.2. Einschränkungen.............................................................................................................. 91 14.5.3. Trusted Applets................................................................................................................ 91 14.6. User Interfaces für Applets .............................................................................................. 92 14.6.1. Besonderheiten ................................................................................................................ 92 14.7. Übliche Applet-Funktionen ............................................................................................... 92 14.7.1. Übliche Funktionen........................................................................................................... 92 14.7.2. Abspielen von Tonsequenzen ............................................................................................ 92 14.7.3. Darstellen von Bildern ...................................................................................................... 92 14.8. Threads und Applets ......................................................................................................... 92 14.9. Kommunikation mit anderen Programmen ...................................................................... 92 14.9.1. Browser........................................................................................................................... 92 14.9.2. Andere Applets ................................................................................................................ 93 14.9.3. Netzwerkverbindungen ..................................................................................................... 93 14.9.4. Javascript (DOM) ............................................................................................................. 93 15. JAVA WEB START UND JNLP ........................................................................................................ 94 15.1. Applets.............................................................................................................................. 94 15.2. Java Web Start und JNLP ................................................................................................. 94 15.2.1. Funktionsweise ................................................................................................................ 94 15.2.2. Sicherheit ........................................................................................................................ 94 15.2.3. Anforderungen................................................................................................................. 94 15.3. Architektur........................................................................................................................ 94 15.4. JNLP Datei ........................................................................................................................ 94 15.5. Security............................................................................................................................. 95 15.6. JNLP API ........................................................................................................................... 95 15.6.1. BasicService..................................................................................................................... 95 15.6.2. DownloadService.............................................................................................................. 95 15.6.3. FileOpenService und FileSaveService ................................................................................. 95 15.6.4. ClipBoardService .............................................................................................................. 96 15.6.5. PrintService ..................................................................................................................... 96 Kälin Thomas, Abt I 9/96 17.12.2007 Internettechnologien 15.6.6. PersistenceService............................................................................................................ 96 Kälin Thomas, Abt I 10/96 17.12.2007 Internettechnologien 1. DEPLOYMENT-ARCHITEKTUR FÜR WEBAPPLIKATIONEN 1.1. Zuordnungen: Technologien zu Device CLIENT->WEBBROWSER: HTML, CSS, DOM, AJAX CLIENT->WEBBROWSER->APPLET: Java-Applets SERVER->CGI-SCRIPT: Verarbeitet CGI SERVER->SERVLETCONTAINER: Servlets, JSP (Java Server Pages), JSTL (Java Standard Tag Library), Struts, JSF (Java Server Faces), Portlets Kälin Thomas, Abt I 11/96 17.12.2007 Internettechnologien 2. GRUNDLAGEN 2.1. TCP / IP Das Internet Protocol ist ein offenes, plattformunabhängiges Protokoll, welches das mehrfache Routen zwischen zwei Hosts und das Umrouten von defekten Routern erlaubt. IP ist ein unzuverlässiges Protokoll, d.h. Pakete können verloren gehen und die Reihenfolge der Pakete kann ändern. Das Transmission Control Protocol bestätigt die empfangenen Pakete, testet, ob diese richtig übertragen wurden und fordert gegebenenfalls eine neue Übertragung an. Weiter setzt TCP die empfangenen Pakete wieder in der gleichen Reihenfolge zusammen, wie sie verschickt wurden. Bei der Kombination TCP/IP arbeitet also ein zuverlässiges und verbindungsorientiertes Protokoll (TCP) auf einem unzuverlässigen und verbindungslosen Protokoll (IP). 2.2. Ports Die verschiedenen Dienste, die über TCP/IP laufen, müssen auseinandergehalten werden. Dies geschieht durch so genannte Ports auf TCP-Ebene. Ports sind reine Abstraktionen und repräsentieren nichts Physikalisches. Jeder Port ist eindeutig durch eine Nummer zwischen 1 und 65'535 identifizierbar und kann einem bestimmten Service zugewiesen werden. Portnummern zwischen 1 und 1'023 sind reserviert. Es sind die so genannten „well known ports“ und bieten „well known services“, wie Finger, FTP, HTTP und E-Mail an. 2.3. Adressen 2.3.1. Uniform Resource Identifier (URI) Mit URI wird eine allgemeine Resourcen-Benennungs- und Adressierungsart beschrieben. Ein URI ist eine Identifikation, welche aus einer Zeichenfolge besteht, die zur Indentifizierung einer abstrakten oder physischen Resource dient. URIs werden zur Bezeichnung von Resourcen im Internet (primär im WWW) eingesetzt. <Schema>:<Schema-spezifischer Teil> URIs werden weiter unterteilt in die zwei Unterarten Uniform Resource Locators (=U URL) und Uniform Resource Names (=U URN). 2.3.2. Uniform Resource Locator (URL) Ein Uniform Resource Locator identifiziert eine Resource über das verwendete Netzwerkprotokoll und den Ort der Ressource. Der Unterschied zwischen URI und URL ist in der Tat marginal, ein URL beschreibt grundsätzlich einfach eine konkrete Ressource. http://www.hsr.ch/index.html http://mmeier:[email protected]:8080/customer/mmeier ftp://ftp.funet.fi/pub/pics/gif/misc/mikez.gif news:comp.lang.java mailto:[email protected] 2.3.3. Uniform Resource Names (URN) Ein Uniform Resource Name ist ein URI mit dem Schema urn, der als dauerhafter und ortsunabhängiger Bezeichner für eine Ressource dient. URNs können nicht direkt aufgerufen werden, sie müssen durch einen Service in den konkreten URL der Ressource übersetzt werden. urn:isbn:0-395-36341-1 Zur Demonstration von URNs kann z.B. die Firefox Extension URN Support installiert werden. Durch diese Extensions können einige URNs (u.a. auch ISBN) direkt in der Adresszeile eingegeben und in URLs aufgelöst werden. Kälin Thomas, Abt I 12/96 17.12.2007 Internettechnologien 2.4. HTTP HTTP (HyperText Transfer Protocol) definiert, wie Nachrichten formatiert und übertragen werden. Ausserdem werden die Aktionen und Reaktionen von Client und Server festgelegt. HTTP-Befehle können mittels NVT gesendet werden. Es wird üblicherweise TCP auf Port 80, jedoch auch 8000 oder 8080 (Serverseitig) verwendet. Auf der Client-Seite kann ein beliebiger Port über 1024 gewählt werden. 2.4.1. Version 1.0 / Version 1.1 HTTP ist in der Version 1.0 non-persistent. Das bedeutet, dass nach jedem Request / Response eine neue TCP-Verbindung zum Server aufgebaut werden muss. In der Praxis heisst dass, dass die Antwortzeit eines Servers 2 x der RTT + Transferzeit entspricht. Die erste RTT ist für den Verbindungsaufbau, die zweite RTT für den Request. Es stehen nur GET, POST und HEAD zur Verfügung. HTTP 1.1 verwendet standardmässig persistente Verbindungen mit Pipelining. Ausserdem wurden neue Request (OPTIONS, PUT, DELETE, TRACE und CONNECT) ergänzt und das Caching verbessert. 2.4.2. Persistent / Non-Persistent Non-Persistent: Clients öffnen eine eigene TCP-Verbindung für jeden Request, also für jedes Objekt. Es sind somit 2 RTT für jedes Objekt nötig. Oft werden parallele Verbindungen geöffnet, wodurch sich die Antwortzeiten auch reduzieren. Wird in den Versionen bis 1.1 eingesetzt. Persistent: Der Server lässt die Verbindung nach der Antwort für eine bestimmte Zeit offen. Nachfolgende Nachrichten werden über dieses Socket gesendet. Es ist somit nur ein RTT für jedes Objekt nötig, da die TCP-Verbindung nur einmal geöffnet werden muss. 2.4.3. Anfragen / Antworten Alle HTTP-Transaktionen folgen demselben Muster. Jede Client-Anfrage besteht aus drei Teilen, der Anfrage-Zeile (r request line), dem Kopf (h header section) und dem Inhalt (e entity body). 2.4.4. HTTP-Methoden Nachfolgend noch einige Beispiele für Seitenaufrufe über telnet (NVT): GET /aufgabe1/index.html HTTP/1.0 GET /aufgabe1/index.html HTTP/1.1 Host: localhost Kälin Thomas, Abt I 13/96 17.12.2007 Internettechnologien 2.4.5. HTTP-Statuscodes Jede HTTP-Anfrage wird vom Server mit einem Statuscode beantwortet. Dieser gibt Informationen darüber, ob die Anfrage erfolgreich bearbeitet wurde oder teilt dem Client im Fehlerfall mit, wo (z.B. Umleitung) bzw. wie (z.B. Authentifizierung) er die Informationen erhalten kann oder dass dies überhaupt nicht möglich ist. Zusätzlich zum Code enthält der Header eine festgelegte kurze Beschreibung des Fehlers. 2.4.6. GET vs POST Bei einer GET-Übertragung von Argumenten werden diese an die URL angehängt. URLs dürfen maximale 1024 Zeichen lang sein. Sonderzeichen müssen dabei umgewandelt werden (Leerzeichen = %20, Apostroph = %27). Bei der POST-Übertragung hingegen müssen die Argumente im Body des Requests mit dem ContentType application/x-www-form-urlencoded übermittelt werden. 2.4.7. Authentifizierung HTTP bietet eine Authenfikationsmöglichkeit. Stellt der Webserver fest, dass für eine angeforderte Datei Benutzername oder Passwort nötig sind, meldet er das dem Browser mit dem Statuscode 401 Unauthorized und dem Header WWW-Authenticate. Beide folgend vorgestellten Authentifikationsmechanismen ändern nichts an der Zustandslosigkeit von HTTP, d.h. die Authentifikation muss bei jedem Request wieder vorgenommen werden, was in der Regel der Browser aber im Hintergrund erledigt. Bei der Basic Authentication meldet der Webserver dies mit dem Namen des geschützten Bereiches. Der Browser verlangt daraufhin vom Benutzer die Eingabe der Zugangsdaten, welche er anschliessend im HTTP-Header Base64-codiert an den Server sendet. Base64 ist aber nur eine Codierung und keine Verschlüsselung, sollen die Zugangsdaten wirksam geschützt werden, ist entweder eine SSL-Verbindung oder die Digest Access Authentication einzusetzen. Diese basiert auf dem Challenge-Response Verfahren: Der Server sendet eine Zahl, mit welcher sowohl der Browser als auch der Server eine Prüfsumme (MD5) errechnen. Es werden also nie persönliche Daten im Klartext übertragen. 2.5. Representational State Transfer (REST) Das Kernprinzip von REST ist, dass eine Botschaft alle Informationen enthält, die notwendig sind, um die Nachricht unabhängig von vorherigen Nachrichten zu verstehen. D.h. dass weder der Server noch der Client Zustandsinformationen zwischen zwei Nachrichten speichern müssen. Die Zustandslosigkeit des HTTP-Protokolls wird natürlich dann zu einem Problem, wenn der dynamische Teil umfangreicher wird und mit Zuständen arbeiten müssen kann. 2.5.1. Cookies Ein Cookie bezeichnet Information, die ein Webserver an einen Webbrowser sendet oder die clientseitig durch JavaScript erzeugt wird. Cookies sind demzufolge clientseitig gespeicherte Daten. Der Server sendet im HTTP-Header ein Feld Set-Cookie, das den Client auffordert, die übermittelten Daten zu speichern: Kälin Thomas, Abt I 14/96 17.12.2007 Internettechnologien HTTP/1.1 200 OK Content-type: text/html Set-Cookie: name=value Wenn der Client das Cookie akzeptiert, wird er in allen zukünftigen Anfragen an diesen Server die Daten in diesem Cookie im HTTP-Header mit senden. 2.5.2. Session Eine Session bezeichnet eine stehende Verbindung eines Clients mit einem Server, dient also eigentlich dazu, den Zustand einer Folge von Befehlen eines Benutzers zu speichern. Da es im zustandslosen HTTP-Protokoll keine stehenden Verbindungen gibt, kann eine Session erst auf Anwendungsebene implementiert werden. In der Regel wird dazu vom Client bei jedem Zugriff eine eindeutige Session-ID übermittelt, wodurch die Zugriffe zu einer zusammenhängenden Sitzung zusammengefasst werden können. Die Sitzungsdaten werden dabei serverseitig gespeichert. Die Session-ID wird vom Server vergeben und z.B. in einem Cookie gespeichert. Da Cookies auch deaktiviert werden können, wird häufig eine Fallback-Lösung eingesetzt, welche darauf basiert, dass die Session-ID als Parameter im URL übertragen wird. 2.6. Server Side Includes (SSI) Eine der ersten Möglichkeiten, HTML-Dokumente dynamisch zu manipulieren, bevor sie zum Client übertragen werden, wurde mit SSI eingeführt. SSI-Direktiven eignen sich, um zur Lösung einfacher Probleme komplizierte CGI-Programmierung zu umgehen. Da heutige Webapplikationen meist relativ umfangreich sind, ist SSI in der Praxis ziemlich unbedeutend geworden. Die meisten Server verwenden anstelle von .html die Endung .shtml, wobei sich das "s" auf SSI bezieht. Eine SSI-Direktive weist folgendes Format auf: <!--#command parameter(s)="argument" --> Dazu noch einige Beispiele aus der Übung. Beim ersten Code wird eine Text-Datei eingebunden, beim zweiten Beispiel das aktuelle Datum, bzw. letzte Aktualisierungsdatum formatiert ausgegeben: <!--#include virtual="include.txt" --> <!--#config timefmt="%d.%m.%Y" --> <!--#echo var="DATE_LOCAL "--> <!--#echo var="LAST_MODIFIED"--> 2.7. CGI Der nächste Schritt auf dem Weg zu dynamisch erzeugten Webseiten stellte das Common Gateway Interface dar. Bei CGI handelt es sich lediglich um eine Schnittstelle, über die der Webserver Programme aufruft und deren Ausgabe an den Client zurückgibt. Webserver und CGI-Programm sind über Standard-Eingabe und Standard-Ausgabe miteinander verbunden. Da also sehr wenige Anforderungen gestellt werden, können CGI-Programme in sehr vielen Programmiersprachen geschrieben sein. Ein Nachteil der CGI-Ausführung ist die relativ geringe Geschwindigkeit, da für jeden CGI-Aufruf eine neue Programm-Instanz ausgeführt wird 2.7.1. Beispielcode #!C:\Programs\cygwin\bin\bash //Shebang, Interpreter definieren echo "Content-Type: text/plain" echo "Set-Cookie: test=bla" echo "" //HTTP-Header //Setzt in COOKIE (Name=Value) //Schliesst HTTP-Header ab echo "It works!" date echo $QUERY_STRING //Datum ausgeben //GET-Parameter ausgeben!^ Kälin Thomas, Abt I 15/96 17.12.2007 Internettechnologien 3. INHALT UND PRÄSENTATION 3.1. Generisches vs. Graphisches Markup 3.1.1. Graphisches Markup Die Markup-Language enthält Informationen über die Präsentation des Textes. Beispiele hierfür sind die Schrift, die Ausrichtung oder die Farbe eines Elements. Problematisch hierbei ist, dass Änderungen der Präsentation an allen betroffenen Textstellen vorzunehmen sind. 3.1.2. Generisches Markup Es wird eine Trennung zwischen Inhalt und Präsentation vorgenommen. Die Markup beschreibt nur die Bedeutung eines Elements, die Präsentationsinformationen werden in einem separaten Style Sheet verwaltet. Das grösste Problem hierbei ist, dass es keine standardisierten Bezeichnungen gibt. HTML entwickelt sich seit Version 4.0 in Richtung generischem Markup. 3.2. Standard Generalized Markup Language (SGML) SGML (Standard Generalized Markup Language) ist eine Metasprache, mit der man Auszeichnungssprachen („Markup Languages“) definieren kann. SGML wurde ursprünglich entworfen, um maschinenlesbare Dokumente austauschen zu können, die über eine längere Periode lesbar sein bleiben sollten. Auch im Druck- und Verlagswesen wurde SGML oft eingesetzt. Doch die Komplexität von SGML hat eine wirklich grosse Verbreitung verhindert. Wichtig ist, dass SGML eine Sprache ist, um andere Sprachen zu definieren. SGML selber kann also nicht benutzt werden, um konkrete Dokumente zu verfassen. 3.2.1. Beispiel Folgend ein einfaches Beispiel in der Standardsyntax unter der Annahme, dass eine entsprechende, auf SGML basierende Sprache definiert wurde: <POEM year="1795"> <STANZA>And other thought is misfortune Is death and night to me:</STANZA> <STANZA>I hum no supportable tune, I can no poet be.</STANZA> </POEM> Anführungszeichen bei Attributen ohne Leerzeichen optional (y year=1795) Tags sind nicht case-sensitive Nachfolgend noch eine Spezialversion der Syntax: <italic>this</italic> <italic/this/ 3.2.2. //> am Ende fehlt bewusst! Kein Fehler! Document Type Definition (DTD) Eine Dokumenttypdefinition ist ein Satz von Regeln, mit dem die Grammatik von Dokumenten eines bestimmten Typs beschrieben wird. Konkret werden mit einer DTD die Reihenfolge, die Verschachtelung der Elemente sowie die Art des Inhalts von Attributen festgelegt. <!ELEMENT POEM - - (stanza+) > <!ELEMENT STANZA - O (#PCDATA) > <!ATTLIST POEM year CDATA #IMPLIED > Ein poem-Tag besteht dabei aus einem oder mehreren stanza-Tags. Dabei verlangt das poem-Tag im obigen Beispiel sowohl Start- als auch End-Tag, was die Minus-Zeichen signalisieren, optional wäre aber das End-Tag des stanza-Elements. Das stanza-Element wiederum besteht aus PCDATA, was parsed character data bedeutet, d.h. der Inhalt (Text) wird trotzdem noch geparst und auf Markup untersucht. Das poem-Tag hat zudem ein Attribut year, das optional ist. Kälin Thomas, Abt I 16/96 17.12.2007 Internettechnologien 3.3. Hypertext Markup Language (HTML) 3.3.1. Versionen HTML TAGS (1992): beschreibt Inhalt strukturell und logisch HTML (1993): erweiterter Sprachumfang, Beispiel: Bilder HTML+ (1993): nie verabschiedet, floss in spätere Versionen ein HTML 2.0 (1995): Neue Erweiterung mit Formularen HTML 3.2 (1997): Tabellen, Textfluss um Bilder, Applets HTML 4.0 (1997): Neu 3 Varianten: Strict, Transitional und Frameset. HTML 4.01 (1999): Kleinere Korrekturen 3.3.2. Varianten (Strict, Transitional, Frameset) Die Variante STRICT umfasst den Kernbestand an Elementen und Attributen. Die meisten Elemente und Attribute, die einen direkten Einfluss auf die Präsentation haben, wurden gestrichen und sind nicht mehr gültig. Innerhalb des body-Tags dürfen nur Block-Elemente benutzt werden. Die Variante TRANSITIONAL beinhaltet alle Elemente und Attribute von Strict, fügt aber zudem die veralteten (deprecated) Elemente und Attribute wieder hinzu. Zudem dürfen Text und nicht blockbildende Elemente direkt in body, blockquote, form und noscript verwendet werden. Die Variante FRAMESET enthält zusätzlich zu allen Elementen der Transitional-Variante noch die Elemente für Framesets. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"> 3.3.3. Allgemeine Struktur Ein HTML-Dokument besteht grundsätzlich aus drei Bereichen: Dokumenttypdeklaration (S Strict , Transitional oder Frameset), HTML-Kopf und HTML-Körper. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Titel der Webseite</title> </head> <body> <!-- Inhalt der Webseite --> </body> </html> 3.3.4. Universalattribute Jedes HTML-Tag besitzt gewisse Attribute. Es gibt eine Reihe von Attributen, die für alle Tags gültig sind. Beispiele: id, title, class, style, dir, lang 3.3.5. HTML-Elemente Ich spare mir hier eine Liste der wichtigsten HTML-Elemente. Wer diese nicht kennt, soll sich im Internet mal auf SELF-HTML schlau machen, dort findet man super Tutorials. 3.3.6. Block-Elemente vs Inline-Elemente Inline-Elemente müssen innerhalb von Block-Elementen verwendet werden, in der Variante Strict ist zudem die direkte Verwendung innerhalb des body-Tags nicht erlaubt. Beispiele: <em>…</em>, <strong>…</strong>, <p>…</p>, <img … />, <a>…</a> Kälin Thomas, Abt I 17/96 17.12.2007 Internettechnologien 3.4. Extensible Markup Language (XML) XML ist eine Auszeichnungssprache für hierarchisch strukturierte Daten. Grundsätzlich ist XML eine Untermenge von SGML, d.h. XML kann als SGML mit reduzierter, strikterer und dadurch einfacherer Syntax aufgefasst werden. Anders als z.B. HTML ist XML also keine konkrete SGML-Anwendung sondern wirklich lediglich eine SGML-Untermenge, in der wiederum andere Sprachen formuliert werden können. Der grosse Vorteil von XML-basierten Sprachen liegt darin, dass es durch die strikte Syntax relativ einfach ist, diese Sprachen maschinell zu verarbeiten. 3.4.1. Beispiel <?xml version="1.0" encoding="UTF-8"?> <citydirectory> <title>Cities of Switzerland</title> <!-- This is a comment --> <city> <name>Zürich</name> <population year="2005">347517</population> </city> <city> <name>Genf</name> <population year="2005">178722</population> </city> </citydirectory> 3.4.2. Regeln (Wohlgeformtheit) XML ist case-sensitive XML-Deklaration zu Beginn des Dokumentes ist optional Jedes Dokument besitzt genau ein Wurzelelement Alle Elemente mit Inhalt besitzen ein Beginn- und ein End-Tag. Alle Elemente ohne Inhalt können mit einem speziellen Tag auch direkt geschlossen werden. Die Beginn- und End-Tags müssen hierarchisch in der Reihenfolge geschlossen werden, in der sie geöffnet wurden. 3.4.3. Namespaces Wenn jedem Vokabular ein Namensraum gegeben wird, kann eine Mehrdeutigkeit von identischen Element- und Attributnamen verhindert werden. Ein Namensraum wird über das reservierte XMLAttribut xmlns deklariert. Nachfolgend zwei gleichbedeutende Varianten: <mydoc xmlns="http://www.example.com/mynamespace"> <subnode /> </mydoc> <ns:mydoc xmlns:ns="http://www.example.com/mynamespace"> <ns:subnode /> </ns:mydoc> 3.4.4. XML DTD (Document Type Definition) XML DTD entspricht im Prinzip SGML DTD, wobei natürlich der strikteren Syntax Rechnung getragen wird. Beispielsweise kann ein End-Tag nicht mehr als optional deklariert werden, da es dies in XML nicht geben darf. Nachfolgend ein Beispiel für einen Tag <note> mit 4 Attributen, bzw. Kind-Tags. <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT Kälin Thomas, Abt I note (to, from, heading, body)> to (#PCDATA)> from (#PCDATA)> heading (#PCDATA)> body (#PCDATA)> 18/96 17.12.2007 Internettechnologien 3.4.5. Sonderzeichen XML hat fünf vordefinierte benannte Entitäten. Diese benannten Entitäten sind zu verwenden, wenn diese Zeichen in einem Tag-Inhalt oder einem Attribut verwendet werden sollen, aber nicht als XMLSyntax interpretiert werden sollen. & ' " => => => & ' " < > => => < > Längere Textabschnitte, die nicht durch den Parser verarbeitet werden sollen, können auch als CDATA-Block gekennzeichnet werden: <![CDATA[Ein beliebiger Text]]> 3.5. Extensible Hypertext Markup Language (XHTML) 3.5.1. XHTML 1.0 Enthält alle Elemente aus HTML 4.01, auch die drei Varianten Strict, Transitional und Frameset wurden übernommen. Es handelt sich tatsächlich nur um eine Neuformulierung in XML-Syntax. Da es sich nun um ein XML-Dokument handelt, wird eine XML-Deklaration empfohlen. Diese wäre zwar grundsätzlich optional, teilt dem Parser aber sinnvollerweise die Zeichencodierung mit. Die DTDDeklaration für die drei Varianten muss angepasst werden: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> Weitere Änderungen, die aufgrund der XML-Syntax berücksichtig werden müssen: Alle Elementnamen müssen klein geschrieben werden. <br /> ) Leere Elemente haben eine spezielle Syntax. (< Jedes Element muss geschlossen werden. Attributwerte müssen immer innerhalb von Anführungszeichen stehen. Reservierte Zeichen müssen maskiert werden. 3.5.2. XHTML 1.1 Um zu ermöglichen, dass XHTML sowohl in abgespeckter Form sowie in erweiterter Form auf verschiedenen Geräten verfügbar ist, wurde XHTML vom W3C modularisiert. Diese Module können dann in eigenen DTDs benutzt werden. Solche Module sind z.B. das Table-Modul mit allen Elementen, die zur Strukturierung von Tabellen benötigt werden oder das Text-Modul. In der Praxis ist diese Modularisierung allerdings nicht spürbar. Viel entscheidender ist, dass XHTML 1.1 die definitive Abkehr von HTML 4 markiert. XHTML 1.1 führt LEDIGLICH DIE VARIANTE STRICT von XHTML 1.0 weiter, d.h. alle als veraltet markierten Elemente wurden demzufolge eliminiert. Die DTD-Deklaration sieht wie folgt aus: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> Kälin Thomas, Abt I 19/96 17.12.2007 Internettechnologien 3.6. Cascading Style Sheets (CSS) Als die Verbreitung von HTML zunahm, wurden mit der Zeit immer mehr Möglichkeiten eingeführt, mit denen immer mehr Bereiche der graphischen Gestaltung einer Webseite beeinflusst werden konnten. Als Paradebeispiel kann dazu das <font>-Tag bezeichnet werden. Es zeigte sich, dass es eine schlechte Entwicklung war, dass HTML weiter und weiter aufgeblasen wurde. Um die Präsentationsmöglichkeiten zu verbessern und die Wartbarkeit von HTML-Dokumenten zu bewahren, wurden Style Sheets eingeführt. CSS wird vor allem zusammen mit HTML eingesetzt, ist aber nicht darauf begrenzt. Mit CSS wird festgelegt, wie ein besonders ausgezeichneter Inhalt dargestellt werden soll. 3.6.1. Grund-Syntax Selektor { Eigenschaft-A: Wert-A; /* Kommentar */ Eigenschaft-B: Wert-B; } 3.6.2. Selektoren * { … } h1 { … } h1 em { … } body > p { … } #myId { … } .className { … } h1[title] { … } 3.6.3. /* /* /* /* /* /* /* Universal Selektor*/ Typ Selektor */ Direkte Nachfolger <h1><em> … </em></h1> */ p ist Kind von body */ <p id="myId">…</p> */ <p class="className">…</p> Alle <h1>, bei denen der Titel gesetzt ist */ Einbindung als internes Style Sheet <head> <title>Dokument mit Formatierungen</title> <style type="text/css"> body { color: purple; background-color: #d8da3d; } </style> </head> 3.6.4. Einbindung als externes Style Sheet <link rel="stylesheet" type="text/css" href="beispiel.css" /> 3.6.5. Einbindung als inline Attribut <span style="font-size: small;">Text</span> Kälin Thomas, Abt I 20/96 17.12.2007 Internettechnologien 4. JAVA SERVLETS Zur Programmierung auf dem Webserver bieten sich in Java Servlets an. Das Java Servlet-API kapselt das CGI, so dass es sehr einfach zu verwenden ist. Java Servlets bringen zudem auch für Serverprogramme Plattformunabhängigkeit, daher Unabhängigkeit vom spezifischen Betriebssystem und vom spezifischen Server. Auf Servlets basieren auch Java Server Pages, die in Servlets kompiliert werden, sowie die Implementation von Web-Services. Das Verständnis der Servlet-Technologie ist daher grundlegend. 4.1. Was sind Servlets? Das Wort Servlet ist eine Wortkreation aus Server und Applet. Sun hat mit Einführung der Sprache Java zwei Arten von Anwendungen definiert: Applications und Applets. Bei Servlets handelt es sich um ein ähnliches Konzept: Serveranwendungen, die einen Container (hier den Webserver) um sich herum brauchen, um laufen zu können. Ein Servlet ist also eine plattformunabhängige Java-Klasse in Form von Bytecode, die aufgrund von Requests an einen Server dynamisch geladen und ausgeführt wird und die Antwort erzeugt. 4.2. Servlet-Container Servlet-Container beinhalten eine Java-Umgebung und sind normalerweise Bestandteil eines Webservers. Der Servlet-Container muss das Servlet-API implementieren, ein Bestandteil der Java EE. Das Servlet-API kapselt die ganze Kommunikation zwischen Webserver und Client. Servlets sind daher einfach in der Anwendung: Der Entwickler kann sich ganz auf die Programmierung der Funktionalität des Servlets konzentrieren. 4.3. Ausführen von Servlets Zum Ausführen von Servlets wird ein Web-Server mit einer Servlet-Engine benötigt. Die meisten heute gebräuchlichen Web-Server verfügen über eine Servlet-Engine (eingebaut oder als Plug-In). 4.3.1. Aufruf von Servlets (Browser) Ein Servlet kann durch einen URL in folgender Form angesprochen werden: Grundstruktur: Beispiel: http://machine-name:port/Context-root/Servlet-name http://localhost:8080/myProject/myServlet Der CONTEXT-ROOT identifiziert dabei die Web-Applikation, der SERVLET-NAME bestimmt das Servlet innerhalb der Anwendung. 4.3.2. Verlinken von Servlets Natürlich können Servlets auch direkt im HTML-Code verlinkt werden. Dazu folgend einige Beispiele: <a href="http://localhost:8080/myProject/myServlet">Link</a> <form action="http://localhost:8080/myProject/myServlet" method="post"> 4.4. Konfiguration (web.xml) Ein so genannter Web APPLICATION DEPLOYMENT DESCRIPTOR in Form einer XML-Datei (w web.xml ) dient zur Konfiguration von Web-Applikationen mit Servlets und JSP. 4.4.1. Registrieren von Servlets In web.xml muss jedes Servlet zwei Einträge besitzen. Die Datei web.xml liegt übrigens immer an einem vordefinierten Ort in der Ordnerstruktur von Tomcat, üblicherweise ist dies WEBINF\web.xml. Nachfolgender Ausschnitt bezieht sich auf das weiter oben gezeigte Beispiel. Anzumerken ist hierbei noch, dass das Grundverzeichnis /myProject lautet! Dies muss im XML-File aber nicht konfiguriert werden, da diese in /myProject/WEB-INF/ liegt! <servlet> <servlet-name>myServlet</servlet-name> <servlet-class>SimpleServlet</servlet-class> </servlet> Kälin Thomas, Abt I 21/96 17.12.2007 Internettechnologien <servlet-mapping> <servlet-name>myServlet</servlet-name> <url-pattern>/myProject</url-pattern> </servlet-mapping> 4.4.2. Initialisierungsparameter festlegen Auch Initialisierungsparameter können direkt innerhalb der Konfigurationsdatei zugewiesen werden. Beachtet hierbei, dass sich folgende Zeile innerhalb eines <servlet>-Tags befinden muss! <init-param> <param-name>nameOfParameter</param-name> <param-value>valueOfParameter</param-value> </init-param> 4.4.3. Session-Timeout Nach welchem Zeitraum eine Session ablaufen soll wird standardmässig über die XML-Datei geregelt: <session-config> <session-timeout>30</session-timeout> </session-config> 4.4.4. Filter Filter ermöglichen die Vor- oder Nachbearbeitung einer Web-Ressource. Die Reihenfolge der FilterMappings definiert die Reihenfolge ihrer Anwendung! <filter> <filter-name>ExampleFilter</filter-name> <filter-class>example.MyExampleFilter</filter-class> </filter> <filter-mapping> <filter-name> ExampleFilter</filter-name> <servlet-name>MyExampleFilter</servlet-name> </filter-mapping> 4.5. Servlet API 4.5.1. Überblick über wichtige Klassen und Methoden 4.5.2. Mechanismus beim Aufruf Bei Anfragen (requests) an Servlets wird deren service()-Methode aufgerufen. Die service()Methode von HTTP-Servlets macht ein Dispatching entsprechend dem HTTP-Befehl an die betreffende doBefehl()-Methode. Um den jeweiligen Befehl zu implementieren, wird die entsprechende doBefehl()-Methode von der abgeleiteten Klasse überschrieben. Die Default-Implementationen signalisieren einfach einen Fehler. Kälin Thomas, Abt I 22/96 17.12.2007 Internettechnologien 4.6. Lebenszyklus 4.6.1. Übersicht Die erste Anfrage bzw. Request an ein Servlet bewirkt, dass das Servlet geladen, instanziert und die init()-Methode aufgerufen wird. In der Folge bleibt diese Instanz bestehen und wird alle Anfragen behandeln. Jeder weitere Request wird nun nur noch das Erzeugen eines separaten Threads bewirken. Zudem wird für jede Anfrage jeweils die service()-Methode ausgeführt, die wie erwähnt die Antwort generiert oder bei einem HttpServlet die Methoden aufruft. Wenn die Instanz des Servlets (bei einem Shutdown oder nach langer Inaktivität) vom Server entfernt wird, wird schlussendlich die destroy()-Methode aufgerufen. 4.6.2. init() Ein Überschreiben der init()-Methode dient einmaligen Initialisierungen, wie zum Beispiel dem Aufbau einer Datenbankverbindung. Wenn eine notwendige Initialisierung fehlschlägt, so sollte die Methode eine UnavailableException werfen. Die Spezifikation der Initialisierungsparameter erfolgt in web.xml. Mit getInitParameterNames() kann eine Enumeration aller Namen der Initialisierungsparameter erhalten werden, mit getInitParameter() ein einzelner Initialisierungsparameter. public void init(ServletConfig aConfig) throws ServletException { super.init(aConfig); String myParameter = getServletContext.getInitParameter("nameOfParam"); } 4.6.3. destroy() Die destroy()-Methode eines Servlets wird vom Webserver aufgerufen, wenn das Servlet beendet wird. Die Methode gibt das Servlet zur Garbage-Collection frei und schreibt eine entsprechende LogMeldung. Hat man die init()-Methode überschrieben, so muss man oft auch die destroy()Methode überschreiben, um eigene Aufräumarbeiten vorzunehmen und gegebenenfalls den Zustand des Servlets abzuspeichern. public void destroy() { super.destory(); } 4.6.4. service() Diese Methode kann parallel aus mehreren Threads aufgerufen werden. Es ist somit der gegenseitige Ausschluss zu gewährleisten. Ein Server ruft die destroy()-Methode auf, sobald alle service()-Methoden abgearbeitet wurden oder nach Ablauf eines Intervalls (GRACE PERIOD), je nachdem, was zuerst eintritt. Daher muss man selbst dafür sorgen, dass lang laufende service()-Methoden in jedem Fall sauber beendet werden. Kälin Thomas, Abt I 23/96 17.12.2007 Internettechnologien 4.7. HTTP – Servlet 4.7.1. Einleitung Ein HttpServlet enthält Funktionen für HTTP, eine direkte Ableitung von GenericServlet ist eher unüblich, es sei denn, es sollen andere Protokolle wie z.B. FTP angeboten werden. Ein Servlet wird immer durch den Aufruf seiner Methode service() angesprochen. Diese Methode ist bei einem HttpServlet so implementiert, dass sie das Dispatching auf die einzelnen HTTPRequest-Methoden macht, daher: sie ruft die entsprechende doXXX()-Methode auf. Will man einen bestimmten HTTP-Request verarbeiten, so muss man einfach die entsprechende do- Methode überschreiben (d doGet() in diesem Beispiel). 4.7.2. Erstes Beispiel import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class SimpleServlet extends HttpServlet { public void init(ServletConfig aConfig) throws ServletException { //Einmalige Initialisierungen super.init(aConfig); } public void destroy() { //Einmaliger Aufruf beim Beenden des Servlets super.destroy(); } public void doGet ( HttpServletRequest request, HttpServletResponse response) throws IOException { PrintWriter out; String title = "Simple Servlet Output"; response.setContentType("text/html"); String parameter = request.getParameter("ParamName"); out = response.getWriter(); out.println("<html><head><title>"); out.println(title); out.println("</title></head><body>"); out.println("<h1>" + title + "</h1>"); out.println("<p>This is output from SimpleServlet.</p>"); out.println("</body></html>"); out.close(); } public void doPost( HttpServletRequest request, HttpServletResponse response) throws IOException { //Behandlung von POST-Events this.doGet(); } } 4.7.3. HttpServletRequest Ein Objekt vom Typ HttpServletRequest erlaubt den Zugriff auf den HTTP-Header und die Daten des HTTP-Requests. Für den Zugriff auf die Header-Information existieren entsprechende Methoden. Kälin Thomas, Abt I 24/96 17.12.2007 Internettechnologien Die mit einem Request übermittelten Daten (als Query-String oder Stream) können auf zweierlei Arten gelesen werden: 1. Zugriff auf einzelne Parameter public public public public String getParameter(String name); String[] getParameterValues(String name); Enumeration getParameterNames(); Map getParameterMap(); 2. Zugriff auf Daten in Rohform, müssen noch parsed werden Bei GET Requests: Bei POST-, PUT- oder DELETE-Requests: 4.7.4. getQueryString() getReader(), getInputStream() HttpServletResponse Auch HttpServletResponse besitzt Methoden, um den Header der Antwort-Message zu manipulieren. Dies beschränkt sich sehr oft darauf, den MIME-Typ zu setzen. Der Header muss gesetzt werden, bevor auf den Ausgabestrom zugegriffen wird, auf welchen die Daten in die Message geschrieben werden. Für Textdaten wird mit getWriter() ein PrintWriter geholt, für binäre Daten mit getOutputStream() ein ServletOutputStream. Der ServletOutputStream besitzt print()-Methoden für alle einfachen Datentypen und Strings. Das Schliessen des Ausgabestroms bewirkt, dass die Nachricht an den Client zurückgesendet wird. response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("Bla bla bla..."); out.close(); 4.8. //MIME-Typ setzen //Textdaten schreiben //Nachricht an Client senden Servlet Context Der ServletContext definiert die Sicht eines Servlets auf seine Umgebung, daher auf die WebApplikation, in welcher es ausgeführt wird. Über den ServletContext kann das Servlet auf Ressourcen seiner Umgebung zugreifen, zum Beispiel Information mit an deren Servlets der gleichen Web-Applikation teilen. Pro Web-Applikation existiert also ein ServletContext. //Einzelne Parameter abrufen getServletContext().setAttribute("Param.Name ", new Integer(42)); Integer refInt = (Integer) getServletContext().getAttribute("Param.Name"); //Datei aus Context auslesen public URL getResource(String path); public InputStream getResourceAsStream(String path); 4.9. Session In vielen Anwendungen macht ein Client mehrere Requests, die zusammen eine logische Einheit bilden. Die Anwendung selbst kann auch aus mehreren Servlets bestehen (für jede Benutzerfunktion ein Servlet). Alle Requests eines Benutzers zusammen während einer bestimmten Zeiteinheit bilden eine logische Einheit. Eine solche logische Einheit wird als Session bezeichnet. 4.9.1. Session starten & Daten abrufen HttpSession refSession = request.getSession(false); //True = Neue Session! refSession.getCreationTime(); refSession.getLastAccessedTime(); refSession.getMaxInactiveInterval(); refSession.setMaxInactiveInterval(); refSession.setAttribute("Name", new Integer(42)); Integer refInt = (Integer) refSession.getAttribute("Name"); Kälin Thomas, Abt I 25/96 17.12.2007 Internettechnologien 4.9.2. Beenden einer Session Eine HttpSession kann manuell vom System entfernt werden, indem die Methode invalidate() aufgerufen wird. Webserver invalidieren teilweise Sessions, wenn über ein bestimmtes Zeitintervall (z.B. 30min) kein Request mehr stattgefunden hat. 4.9.3. Tracking Die Session-ID wird entweder in einem Cookie bei Client gespeichert oder aber über URL-Rewriting realisiert. Bei der zweiten Variante wird jeder Link mit der Session-ID ergänzt. Dies braucht gegebenenfalls Aufwand des Programmierers. 4.10. Cookies Cookies werden für das oben behandelte Session-Tracking verwendet, indem sie Zustandsinformationen einer Session in einem Cookie ablegen. Oft werden Cookies aber auch einfach als Bookmarks eingesetzt oder dienen zum Speichern von wenig sicherheitskritischer LoginInformation. Die Cookie-Informationen werden dem Header der Antwort-Message hinzugefügt. Die Aufrufe müssen somit erfolgen, bevor auf das Writer-Object der Antwort zugegriffen wird. 4.10.1. Cookie erzeugen & versenden Cookie myCookie = new Cookie("Name", "Value"); myCookie.setMaxAge(3600); myCookie.setComment("Das ist ein Kommentar"); response.addCookie(myCookie); //60 Minuten gültig 4.10.2. Cookie empfangen Cookie arrCookies[] = request.getCookies(); arrCookies[0].getName(); arrCookies[0].getValue(); 4.11. RequestDispatcher Ein RequestDispatcher für eine Ressource kann über den ServletContext angefordert werden. Die Ressource wird dabei mit einem URL /resource identifiziert, der relativ zum Context-Root ist. Kann auf die Ressource nicht zugegriffen werden, so wird null zurückgegeben. 4.11.1. Forward() Mit forward() kann ein Servlet die Behandlung des Requests an eine Ressource (z.B. Servlet, HTMLSeite) delegieren. RequestDispatcher refDis; refDis = getServletContext().getRequestDispatcher("/bla.html"); refDis.forward(request, response); 4.11.2. Include() Mit include() kann nur ein Teil der Bearbeitung an eine andere Ressource delegiert werden. RequestDispatcher refDis; refDis = getServletContext().getRequestDispatcher("/fooBar "); refDis.include(request, response); 4.12. Filter Ein Filter ist ein Objekt, das einen Request und/oder die Response einer Web-Ressource bearbeiten kann. Sowohl Header als auch Dateninhalt können dabei verändert werden. Filter werden beim Deployment im Deployment Descriptor einer Web-Applikation (w web.xml) zu WebRessourcen dazu gebunden. Sie sollten keine Abhängigkeiten von Web-Ressourcen haben, so können sie flexibel eingesetzt werden. Kälin Thomas, Abt I 26/96 17.12.2007 Internettechnologien 4.12.1. Anwendungsbeispiele Authentifizierung, Logging, Datenkompression, Bildformate umwandeln, Verschlüsselung, MIME-Type filtern. 4.12.2. Beispiel Die doFilter()-Methode ruft das nächste Filter in der FilterChain auf, indem es die doFilter()Methode des FilterChain-Objektes aufruft. Nach dem letzten Filter in der Kette geht die Kontrolle an die zugehörige Web-Ressource. public final class ExampleFilter implements Filter { public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //Mach was Schmutziges chain.doFilter(request, wrapper); //Nächster Filter aufrufen } } Kälin Thomas, Abt I 27/96 17.12.2007 Internettechnologien 5. JAVA SERVER PAGES 5.1. Einleitung Die JavaServer Pages (JSP) Technologie ermöglicht die serverseitige Generierung von dynamischen Inhalten. JavaServer Pages sind Seiten in einem textbasierten Format (z.B. HTML, XML), in denen Java-Code und spezielle JSP-Aktionen eingebettet werden können. Dadurch werden Werkzeuge zur Verfügung gestellt, um die Logik unabhängig vom Design zu implementieren. JavaServer Pages werden unter Verwendung einer JSP-Engine automatisch in Java Servlets umgewandelt und im Anschluss durch den Java-Compiler in Bytecode kompiliert, der von einer Servlet-Engine ausgeführt werden kann. 5.2. JSP vs Servlets 5.2.1. Servlets public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.print( "<html><head><title>Hello World</title></head>"); out.print( "<body><p>Hello World, the time is: " ); out.print(new java.util.Date()); out.print( "</p></body></html>“ ); } } 5.2.2. JSP <html> <head><title>Hello World</title></head> <body> <p>Hello World, the time is: <% new java.util.Date() %></p> </body> </html> 5.3. JSP Request-Verarbeitung Kälin Thomas, Abt I 28/96 17.12.2007 Internettechnologien 5.4. Code-Beispiel <%@ page language="java" import="java.util.*" %> <html> <h1>Welcome</h1> <p>Today is</p> <jsp:useBean id="clock" class="calendar.jspCalendar" /> <ul> <li>Day: <%= clock.getDayOfMonth() %></li> <li>Year: <%= clock.getYear() %>/<li> </ul> <%-- Check for AM or PM --%> <%! int time = Calendar.getInstance().get(Calendar.AM_PM); %> <% if (time == Calendar.AM) { %> Good Morning <% } else { %> Good Afternoon <% } %> <%@ include file="copyright.html" %> </html> 5.5. JSP Komponenten 5.5.1. Fixed Template Data Alle Tags, die die JSP-Engine nicht kennt, werden bei einem Request unverändert an den Client weitergeleitet. Typischerweise sind dies HTML- oder XML-Tags. 5.5.2. JSP Kommentare JSP kennt eigene Kommentare, die durch die JSP-Engine aus der Seite entfernt und nicht an den Client weitergeleitet werden. XML-Kommentare hingegen werden weitergegeben und sind einsehbar. <%-- Dies ist ein JSP-Kommentar --%> <!-- Dies ist ein XML-Kommentar --> 5.5.3. JSP Direktiven JSP-DIREKTIVEN sind Instruktionen, die durch die JSP-Engine verarbeitet werden, wenn die Seite in ein Servlet kompiliert wird. <%@ ... %> Mit Attributen der SEITEN DIREKTIVEN werden Sprache, Imports, Seitentyp und weitere Angaben festgelegt. Im Normalfall ist keines der Attribute zwingend, da sinnvolle Defaultwerte verwendet werden. Eine Auswahl der häufiger verwendeten Attribute: <%@ <%@ <%@ <%@ <%@ <%@ <%@ page page page page page page page language="java" %> import="java.util.*" %> session="true" %> contentType="text/html" %> pageEncoding="ISO-8859-1" %> errorPage="error.jsp" %> isErrorPage="true" %> Mit der INCLUDE DIREKTIVEN wird ein File in die JSP-Seite während des Servlet-Kompilationsvorgangs (also zur Translation Time) eingebunden. Dieses File wird ebenfalls nach JSP-Tags geparst und die Anweisungen in diesem externen File haben Zugriff auf die definierten Variablen / Objekte. <%@ include file="genericform.jsp" %> <%@ include file="copyright.html" %> Die Menge der Tags, welche durch einen JSP-Container interpretiert werden, kann durch so genannte Kälin Thomas, Abt I 29/96 17.12.2007 Internettechnologien Tag Libraries erweitert werden. Mit der TAGLIB DIREKTIVE werden solche Bibliotheken über eine URI eindeutig identifiziert und einem Präfix zugeordnet. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> ... Viele Zeilen Code ... <c:set var="foo" scope="session" value="..."/> 5.5.4. JSP Deklarationen Mittels JSP Deklarationen werden Variablen und Methoden ausserhalb der service()-Methode des Servlets definiert. Diese werden initialisiert, wenn die JSP-Page initialisiert wird. <%! int i = 0; %> <%! public String f(int i) { if (i<3) return("..."); ... } %> 5.5.5. JSP Expressions Die JSP-Engine wertet bei jedem Request die JSP Expression zwischen den Markern aus, und fügt die Ausgabe an der Stelle im Dokument ein. Das Resultat des Ausdrucks wird nach String gecastet. Es sind keine Semikolons gestattet! <%= clock.getDayOfMonth() %> 5.5.6. JSP Scriptlets JSP-Scriptlets werden verwendet, um Code-Blöcke auszuführen, die in der JSP-Seite eingebettet sind. Der Code zwischen den Markern wird vollständig ins generierte Servlet eingefügt. <% int time if (time %> <em>Good <% } else <em>Good <% } %> 5.5.7. = Calendar.getInstance().get(Calendar.AM_PM); == Calendar.AM) { Morning</em> { %> Afternoon</em> JSP Standard Actions JSP Actions sind grundsätzlich XML-Tags, die mit Funktionen belegt werden, die die Ausgabe verändern und Objekte benutzen, modifizieren und erzeugen können. So erweitern sie die Möglichkeiten von JSP und werden unter anderem dazu verwendet, JavaBean-Komponenten zu verwalten. Mehr dazu auch unter dem speziellen Punkt „JavaBeans“. <%@ page import="myPackage.myBean" %> //Direktive <jsp:useBean id="beanId" class="myPackage.myBean" /> //Instanzierung <jsp:setProperty name="beanId" property="XXX" value="Bla" /> //Wert setzen <jsp:getProperty name="beanId" property="XXX" /> //Wert lesen Ein Client-Request kann durch eine JSP-Seite zwecks Verarbeitung an ein HTML-File, eine weitere JSPSeite oder an ein Servlet WEITERGELEITET werden. Wesentlich dabei ist, dass das implizite requestObjekt intakt weitergegeben wird. <jsp:forward page="doit.jsp"/> <jsp:param name="paramName" value="paramValue"> </jsp:forward> Mit der JSP INCLUDE ACTION wird ein File in die Seite eingebunden. Im Gegensatz aber zur Include Directive wird die Ressource nicht statisch ins Servlet reinkompiliert, sondern bei jedem Request neu eingefügt. <jsp:include page="news/headline1.html" flush="true" /> Kälin Thomas, Abt I 30/96 17.12.2007 Internettechnologien 5.6. JSP Syntax-Übersicht 5.7. Vordefinierte Variablen request: response: out: config: session: page: pageContent: exception: 5.8. Zugriff Zugriff Zugriff Zugriff Zugriff Synonym Kapselt Mittels auf HttpServletRequest (Parameter- / Headerinfo) auf HttpServletResponse (Response-Header verändern) auf PrintWriter auf ServletConfig auf HttpSession für this. Wird i.d.R. nicht verwendet. Sever-Spezifische Features errorPage kann eine Fehlerseite angegeben werden. Java Beans Java Beans sind Java Klassen, die einfach wieder verwendbar sind und zusammen in Anwendung verwendet werden können. Jede Java-Klasse, die ein paar einfache Designregeln befolgt, ist eine JavaBean. 5.8.1. Anforderungen Set-Methode für Property Get-Methode für Property Konstruktor ohne Parameter 5.8.2. Codebeispiel public class myBean { protected String XXX; public myBean(); public String getXXX(); public void setXXX(String t); } 5.9. //Konstruktor ohne Parameter //Get-Methode für XXX //Set-Methode für XXX JSP Documents Ein JSP Document ist eine JSP-Seite, die komplett in XML-Syntax verfasst ist. Auf die herkömmlichen JSP-Marker <% ... %> wird also vollständig verzichtet. JSP Documents müssen wohlgeformte XMLDokumente sein, daher jedes öffnende Tag benötigt ein schliessendes Tag und es darf nur ein Wurzelelement vorkommen. 5.9.1. Identifikation als JSP Document Einfügen eines speziellen Wurzelelements jsp:root Erkennung an der Dateiendung (*.jspx) Anpassung in web.xml 5.9.2. Einschränkungen Weil ein JSP Document ein wohlgeformtes XML-Dokument sein muss, kommt es zu ein paar Einschränkungen. Zum Beispiel dürfen in Attributen von XML-Tags keine öffnenden und schliessenden Winkelklammern vorkommen, ein Konstrukt, das in der Standard Syntax legitim wäre. Kälin Thomas, Abt I 31/96 17.12.2007 Internettechnologien Beispiel in Standard-Syntax: <a href="<%= url %>">Linkbeschreibung</a> Beispiel in XML-Syntax: <jsp:text><![CDATA[<a href="]]></jsp:text> <jsp:expression>url</jsp:expression> <jsp:text><![CDATA[">]]></jsp:text> Linkbeschreibung <jsp:text><![CDATA[</a>]]></jsp:text> 5.10. JSP Expression Language Die Expression Language (=E EL) vereinfacht den obigen XML-Syntax, welcher ziemlich unpraktisch im Gebrauch ist, und macht somit die JSP Expressions (Punkt 5.5.5) überflüssig. 5.10.1. Immediate Evaluation Alle Ausdrücke, die den ${}-Syntax verwenden, werden sofort ausgewertet. Die JSP Engine wertet den EL-Ausdruck aus, konvertiert ihn und gibt das Resultat zurück zum Tag Handler. Immediate Evaluation Ausdrücke sind immer read-only. <%= request.getAttribute("car").getEngine().getPower() %> ${car.engine.power} //JSP-Express. //EL 5.10.2. Deferred Evaluation Deferred Evaluation Expressions verwenden den #{}-Syntax. Diese Ausdrücke können zu verschiedenen Zeitpunkten des Page-Lifecycles ausgewertet werden. Das ist dann davon abhängig, von welcher Technologie die Expression bearbeitet wird. 5.10.3. Value Expression Beispiele für den Zugriff ${pageContext.request.requestURI} ${sessionScope.profile} ${param.productId} ${paramValues.productId} ${headerValues["host"]} ${customer.orders[1]} //Aufgerufene URI //Variable im Session-Scope //Parameter (GET, POST) productId //Parameter als Array(!) //Host-Eintrag im HTTP-Header //Collection 5.10.4. Method Expression Eine Method Expression wird verwendet, um eine beliebige öffentliche Methode aufzurufen, welche ein Resultat zurückgibt. Method Expressions werden bei JavaServer Faces von Component Tags benutzt, um Methoden aufzurufen, die Verarbeitungsschritte ausführen, wie das Handling von Events oder das Validieren von Daten. Kälin Thomas, Abt I 32/96 17.12.2007 Internettechnologien 5.10.5. Operatoren Neben den bekannten arithmetischen und logischen Operatoren, gibt es bei den Vergleichsoperatoren noch eine erwähnenswerte Ausnahme. Denn damit diese XML-konform notiert werden können (die Winkelklammern für den grösser/kleiner Vergleich dürfen ja nur für Tags verwendet werden), haben diese in JSP Documents eine alternative Schreibweise: 5.11. Tag Libraries 5.11.1. Einleitung Wir haben weiter oben gesehen, dass JSP-Aktionen (JSP Standard Actions) im Prinzip Tags sind, die mit Funktionen belegt werden können. Durch diese Tags kann dann ebenfalls dynamischer Inhalt generiert werden. Eine Tag Library ist nun eine Sammlung von solchen Tags, die einem XMLNamespace zugewiesen wird. Dadurch und durch die Einführung der Expression Language kann vollständig auf Sciptlets und Scriplet Expressions verzichtet werden, wodurch eine weitere Abstraktion erzielt wird und die Trennung der Zuständigkeiten von Entwicklern und Designern weiter vereinfacht. 5.11.2. Tag Library Descriptor (TLD) Um den kompilierten Tag Handler mit der JSP-Seite zu verbinden, benötigen wir einen so genannten Tag Library Descriptor (TLD). Dieser Deskriptor enthält sowohl Informationen zur Tag Library selbst als auch zu den Tags der Tag Library. Der Tag Library Descriptor ist ein XML-File mit der Dateiendung .tld, welches sich im /WEB-INF/Verzeichnis des JSP-Containers befindet. Beim Aufstarten liest der Container automatisch die Tag Library Descriptors ein und merkt sich alle in den <uri>-Tags angegebenen URIs und die dazugehörigen TLDs. Dadurch kann die Tag Library dann über den URI in die JSP-Seiten eingebunden werden. Ein URI muss deshalb logischerweise einmalig sein. <?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd" version="2.0"> <tlib-version>1.0</tlib-version> <short-name>ml</short-name> <uri>http://www.example.ch/tag/myLib</uri> Kälin Thomas, Abt I 33/96 17.12.2007 Internettechnologien <description>Meine eigene Library</description> <tag> <name>myTagExample</name> <description>Ein Beispiel-Tag</description> <tag-class>myPackage.mySimpleTagLibrary</tag-class> <body-content>empty</body-content> <attribute> <name>myAttribute</name> <required>true</required> <rtexprvalue>false</rtexprvalue> <type>myPackage.myClass</type> </attribute> </tag> </taglib> 5.11.3. Einbinden einer Tag Library Standard-Syntax <%@ taglib uri="http://www.example.ch/tag/myLib" prefix="ml" %> Standard-Syntax für JAR <%@ taglib uri="/WEB-INF/lib/myLib.jar" prefix="ml" %> XML-Syntax <jsp:root … xmlns:ml="http://www.example.ch/tag/myLib" …> 5.11.4. Verwendung einer Tag Library Allgemeiner Syntax <prefix:tag attr1="value" … /> Beispiel von oben (myLib) <ml:myTagExample myAttribute="Beispiel" /> 5.12. JSTL – Java Server Pages Standard Tag Library Die JSTL setzt sich aus fünf Tag Libraries zusammen. Diese Libraries werden anhand ihres URI durch die Taglib-Direktive oder bei JSP DOCUMENTS (reine XML-Dateien) über die Namespace-Deklaration eingebunden. 5.12.1. Einbinden der Librarys Um die JSTL einzubinden muss zuerst die zugehörige Libary herunter geladen werden. In diesem befinden sich zwei .jar-Dateien, welche in den Ordner /WEB_INF/lib entpackt werden müssen. Anschliessend muss nur noch beim Root-Dokument folgende Zeile hinzugefügt werden: xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:fn="http://java.sun.com/jsp/jstl/functions" 5.12.2. Core Tag Libary (Präfix: c) Wie es der Name schon sagt, sind in der Core Tag Library die am häufigsten verwendeten Tags enthalten. Wahrscheinlich das wichtigste Feature der ganzen JSTL sind die Flow Control Tags, denn durch diese wird es ermöglicht, auf Scriptlets zu verzichten. Variablen setzen <c:set var="bookId" value="${param.Remove}"/> <c:set var="bookId">${param.Remove}</c:set> Variablen löschen <c:remove var="cart" scope="session"/> IF-Bedingungen <c:if test="${!empty param.Add}"> <c:set var="bid" value="${param.Add}"/> </c:if> Kälin Thomas, Abt I 34/96 17.12.2007 Internettechnologien Switch-Statement <c:choose> <c:when test="${customer.category == 'trial'}" >...</c:when> <c:otherwise>...</c:otherwise> </c:choose> For Each mit Zahlen <c:forEach var="i" begin="100" end="110">${i}</c:forEach> For Each mit Collection <c:forEach var="item" items="${sessionScope.cart.items}"> <td>${item.quantity}</td> </c:forEach> 5.12.3. XML Tag Library (Präfix: x) Die XML Tag Library stellt Tags zur einfachen Behandlung von XML-Dokumenten zur Verfügung. Diese wird im folgenden nicht näher behandelt. 5.12.4. Internationalization Tag Library (Präfix: fmt) Mit der I18n Tag Library werden Tags zur Verfügung gestellt, um die Applikation an die Sprach- und Formatierungs-Konventionen der Clients anzupassen. Über die MESSAGING-TAGS können lokalisierte Mitteilungen ausgegeben werden. Mit dem bundle, respektive dem setBundle Tag kann das Resource Bundle in der vom Client angegebenen Sprache gesetzt werden und mit dem message Tag kann ein lokalisierter String aus diesem Resource Bundle ausgegeben werden. <fmt:setBundle basename="labels" /> <fmt:message key="nameOfVar" /> Und schlussendlich gibt es noch die FORMATTING TAGS. Diese können zur Formatierung von Zahlen, Daten und Zeiten verwendet werden. 5.12.5. SQL Tag Library (Präfix: sql) Die SQL Tags, die für Zugriffe auf Datenbanken eingesetzt werden können, wurden zum schnellen Prototyping und für einfache Applikationen entwickelt. Für normale Applikationen ist es normalerweise empfehlenswert, Datenbank-Operation in JavaBeans zu kapseln. 5.12.6. Functions Tag Library (Präfix: fn) Dieser Teil der JSTL beinhaltet im Prinzip keine Tags sondern ein Reihe von nützlichen ELFUNKTIONEN. Nachfolgend ein Beispiel um die Anzahl der Elemente einer Collection zu überprüfen: <c:if test="${fn:length(param.username) > 0}" /> Die restlichen Funktionen der JSTL Functions werden zur Stringmanipulation benutzt: toUpperCase, toLowerCase, substring, indexOf, trim, replace und viele mehr… ☺. 5.13. Custom Tags 5.13.1. Arten der Implementierung Die Logik von Custom Tags kann auf zwei Arten implementiert werden. In JSP 1.2 wurde die erste Möglichkeit definiert, das API und das Aufrufen der so genannten CLASSIC TAG HANDLER ist gezwungenermassen relativ komplex, denn Scriptlets und Scriptlet Expressions im Tag Body können auf den das Tag umgebenden Kontext angewiesen sein, der wiederum durch Scriptlets definiert sein kann. Durch die Einführung der Expression Language und der JSP Standard Tag Library ist es nun aber möglich, auf Scriptlets und Scriptlet Expressions zu verzichten. Dies erlaubte es, ein einfacheres Verfahren zu definieren, die SIMPLE TAG HANDLERS. Diese können in Java und seit JSP 2.0 auch in der JSP Syntax (Tag Files) implementiert werden. Kälin Thomas, Abt I 35/96 17.12.2007 Internettechnologien 5.13.2. Benötigte Elemente JSP-SEITE: In einer JSP-Seite können Custom Tags verwendet werden, zuvor muss aber die taglib-Direktive definiert sein, die auf den Tag Library Descriptor verweist. TAG LIBRARY DESCRIPTOR (TLD): Dies ist ein XML-File, das die Custom Tags definiert und in Verbindung bringt mit einem Tag Handler. Wurde weiter oben bereits näher behandelt. TAG HANDLER: Ein Tag Handler ist eine Java-Klasse, die Operationen ausführt, entsprechend dem Custom Tag und dessen Attributen. Die vordefinierten Operationen werden durch den JSP-Container aufgerufen. 5.13.3. Simple Tag Handler Das Wort „simple“ in Simple Tag Handler deutet auf die Einfachheit hin, mit der solche Custom Tags implementiert werden können und nicht etwa auf irgendwelche Einschränkungen, die es gegenüber dem Classic Tag API geben würde. Die einzige Einschränkung gegenüber den Classic Tag Handlern ist, dass keine Scriptlets und Scriptlet Expressions im Body eines Simple Tags verwendet werden können. Ablauf eines SIMPLE-TAG-AUFRUFS: 1. 2. 3. 4. 5. 6. Tag Handler instanziieren. setJSPContext() wird aufgerufen, setzt den aktuellen Context. setParent() wird aufgerufen, optional. Setzt das Parent-Tag. setXXX() für jedes Attribut wird aufgerufen. Falls ein Body existiert wird setJspBody() als JspFragment übergeben. doTag() wird aufgerufen. Grundsätzlich implementieren Simple Tag Handlers das javax.servlet.jsp.tagext.SimpleTag Interface. Da aber fast alle Methoden nur set()-Methoden sind und deren Implementation praktisch vorgegeben ist, existiert die Klasse SimpleTagSupport, die diese bereits implementiert. Somit bleibt nur noch die doTag()-Methode übrig, in der die eigentliche Logik implementiert werden muss. public HelloWorldSimpleTag extends SimpleTagSupport { public void doTag() throws JspException, IOException { getJspContext().getOut().write("Hello, world."); } } Falls der Body verarbeitet werden soll, kann dieser als JspFragment über die getJspBody()Methode zurückgegeben werden. Die invoke()-Methode leitet den Output an den angegebenen Writer weiter oder – falls dieser angegebene Writer null ist – an den JspWriter, der von der getOut()-Methode des JspContext zurückgegeben wird. public class SimpleWriter extends SimpleTagSupport { public void doTag() throws JspException, IOException { StringWriter sw = new StringWriter(); getJspBody().invoke(sw); jspContext().getOut().println(sw.toString().toUpperCase()); } } 5.13.4. Classic Tag Handler Soll nicht näher betrachtet werden. Ist also somit auch nicht weiter prüfungsrelevant ☺. 5.14. Beispiel eines Custom Tag mit Attribut Die Mensa der Hochschule Rapperswil will den Menuplan der Woche auf dem Web verfügbar machen. Der Menuplan könnte in einer Datenbank (oder auch nur in einem File) immer aktuell vorhanden sein. Mit einer einfachen JSP-Seite wird die Datenbank mittels eines Custom Tags dynamisch verknüpft. Kälin Thomas, Abt I 36/96 17.12.2007 Internettechnologien 5.14.1. JSP Dokument (= XML-Schreibweise) <jsp:root xmlns="http://www.w3.org/1999/xhtml" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:ttl="http://www.hsr.ch/tag/ttl" version="2.0"> <jsp:output doctype-root-element="html" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system= "http://www.w3c.org/TR/xhtml1/DTD/xhtml1-strict.dtd" /> <jsp:directive.page contentType="text/html; charset=utf-8" /> <?xml version="1.0" encoding="utf-8"?> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>Menüplan</title></head> <body> <p>Montag: <ttl:insertMenu wochentag="montag" /></p> <p>Dienstag: <ttl:insertMenu wochentag="dienstag" /></p> </body> </html> </jsp:root> 5.14.2. Tag Handler package ch.hsr.tag; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class MenuHandler extends SimpleTagSupport { private String wochentag; public void setWochentag(String wochentag) { this.wochentag = wochentag; } public void doTag() throws IOException { if (wochentag.toLowerCase().equals("sonntag") { getJspContext().getOut().write("Sonntags geschlossen!"); } } } 5.14.3. Tag Library Descriptor (TLD) <?xml version="1.0" encoding="utf-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description >Test Tag Library</description > <tlib-version>1.0</tlib-version> <short-name>ttl</short-name> <uri>http://www.hsr.ch/tag/ttl</uri> <tag> <description>Menuplan einer Woche</description> <name>insertMenu</name> <tag-class>ch.hsr.tag.MenuHandler</tag-class> <body-content>empty</body-content> <attribute> <name>wochentag</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib> Kälin Thomas, Abt I 37/96 17.12.2007 Internettechnologien 6. JAVA SCRIPT 6.1. Einführung 6.1.1. Allgemein Java Script ermöglicht programmierbare Fähigkeiten in Webpages. Ein Interpreter ist heute in allen bekannten Webbrowsern implementiert, wenn auch manchmal ziemlich unterschiedlich. 6.1.2. Eigenschaften Java Script wird vom Browser interpretiert und nicht kompiliert. Es besitzt einen an Java angelehnten Syntax, ist aber eine völlig eigene Sprache. Es gibt keine strikte Trennung von Dateitypen, auch Klassen existieren (in der üblichen Form) nicht. 6.1.3. Vergleich: Java und Java Script Java Kompilierter Bytecode Objekt-Orientiert Java Applets immer in externen Files Datentypen müssen deklariert werden 6.2. Java Script Interpretiert durch Client Erweiterbare Objekte und Prototypen JS in externen Files oder direkt in HTML Datentypen müssen nicht deklariert werden Einbinden von JS 6.2.1. In HTML <script type="text/javascript"> <!-- /* <![CDATA */ {JAVASCRIPT} /* ]] */ // --> </script> CDATA: Nötig in XHTML, um Konformität zu gewährleisten /* … */: Nötig in älteren Browsern, die CDATA nicht kennen <!-- … // -->: Nötig nur bei ganz alten Browsern ohne JS 6.2.2. Externes JS-File <head> <script type="text/javascript" src="file.js"></script> </head> 6.3. Grundlegendes 6.3.1. Datentypen Wie bereits erwähnt wurde, kennt JS keine eigentlichen Datentypen, beziehungsweise müssen diese nicht deklariert werden. Dennoch gibt es einige grundlegende Typen, welche unterschiedlich behandelt werden. Number: String: Boolean : Object: Null: Undefinied: 6.3.2. 42, 0xFF, 3.14159, -3.1e12, NaN (Not a Number -> Fehlerresult) "hello" true, false Default für nicht initialisierte Variablen Namensgebung Variablen müssen mit einem Buchstaben, Underscore oder einem Dollar beginnen. Anschliessend dürfen alphanumerische Zeichen verwendet werden. JS ist weiter Case-Sensitive und kennt keine Einschränkung betreffen der Namenslänge. 6.3.3. Operatoren Assignment: Arithmetic: Logical: Comparison: Bitwise: Kälin Thomas, Abt I =, +=, -=, *=, /= +, -, *, /, %, ++, -&&, ||, ! ==, >, >=, <, <=, !=, ===, !== &, |, ^, <<, >>, >>> 38/96 //=== f. Typvergleich 17.12.2007 Internettechnologien 6.3.4. Sichtbarkeiten Bei JS haben {}-Blöcke keinen Scope. Diesen gibt es nur bei Funktionen. Alle anderen Deklarationen gelten global, also für jegliche Javascript-Befehle. Dabei werden globale Variablen von lokalen Variablen mit demselben Namen überschrieben. 6.4. Anweisungen 6.4.1. Variablendeklaration Var exampleVar1; var exampleVar2 = "exampleValue"; 6.4.2. //Ohne Initialisierung //Mit Initialisierung IF / IF … ELSE if (true) { … } if (true) { … } else { … } if (true) { … } else if (false) { … } else { … } 6.4.3. FOR-Schleife for (var i=0; i < array.length; ++i) { … } for (var nameOfVar in arrName) { alert(arrName[nameOfVar]); } 6.4.4. WHILE-Schleife while(true) { … } 6.4.5. SWITCH switch(intNumber) { case 0: … break; default: … } 6.4.6. Sprungmarken nameOfLabel: if(…) … break nameOfLabel; 6.4.7. //Springe zu nameOfLabel Fehlerbehandlung try { throw new Error(reason); } catch (e) { switch(e.name) { case 'Error': … break; default: throw e; } } 6.4.8. WITH with (nameOfObject) { //nameOfObject ist Default-Objekt für die folgenden Statements } Kälin Thomas, Abt I 39/96 17.12.2007 Internettechnologien 6.5. Funktionen Parameter werden üblicherweise by Value übergeben. Bei Objekten wird, wie in Java, by Reference übergeben. Das Return-Statement ist optional, default wird undefinied zurückgegeben. 6.5.1. Funktionsdefinition function nameOfFunction(nameOfParam) { … } 6.5.2. Funktionsaufrufe functionName(arguments); myObject.functionName(arguments); new functionName(arguments); 6.5.3. //Function Form //Method Form //Constructor Form, neues Objekt Funktionsparameter Wird eine Funktion mit zu vielen Parametern aufgerufen, werden die überflüssigen ignoriert. Wird hingegen eine Funktion mit zu wenigen Parametern aufgerufen, so sind die restlichen undefinied. Jegliche Parameter einer Funktion, ob nun überzählig oder nicht, können über das Array arguments abgerufen werden: for (var i = 0; i < arguments.length; ++i) { alert(arguments[i]; } 6.5.4. Funktionen als Objekte Ähnlich wie bei C++ können auch in JS Funktionen als Objekte definiert werden. Nachfolgende Beispiele sind identisch und erzeugen denselben Output: function square(x) { return x*x; } var square = function(x) { return x*x; }; 6.5.5. Innere Funktionen Funktionen können innerhalb von anderen Funktionen definiert werden. Innere Funktionen haben dabei Zugriff auf Variablen im Scope der äusseren Funktion. Eine CLOSURE ist eine lokale Variable, die bestehen bleibt, nachdem die Funktion beendet wurde. 6.6. Objektmodell 6.6.1. Allgemein Bei Objekten handelt es sich um beliebig erweiterbare Hashmaps. Über new Object() wird ein leerer Container von Name/Value-Paaren erzeugt. Es gibt ferner keine Klassen, aber PROTOTYPEN, welche als Vorlage zum Erzeugen anderer Objekte dienen. Alle Objekte haben Eigenschaften und Methoden. Weiter können sie, ähnlich wie bei Ruby, dynamisch erweitert werden. 6.6.2. Erzeugen eines Objektes Variante 1: Erweitern des Objektes var rect = new Object(); rect.width = 10; rect.height= 20; rect.flaeche = function() { return this.width * this.height; }; Variante 2: Object Literals var rect = { width: 10, height: 20 }; 6.6.3. Zugriff auf Attribute var myWidth = rect.width; var myWidth = rect['width']; Kälin Thomas, Abt I 40/96 17.12.2007 Internettechnologien 6.6.4. Konstruktor function Rechteck(w, h) { this.width = w; this.height = h; this.flaeche = function() { return this.width * this.height; }; } var rect = new Rechteck(10,20); 6.6.5. Vererbung Jedes Objekt besitzt eine Property prototype. Über diese Eigenschaft können einem Prototypen nachträglich Eigenschaften und Methoden hinzugefügt werden. Diese Änderungen wirken sich auf alle davon abgeleiteten Objekte aus. var Golf = new PKW("VW Golf"); PKW.prototype.Radanzahl = 4; PKW.prototype.zeigeRadzahl = function () {window.alert(this.Radanzahl); }; Golf.zeigeRadzahl(); //Golf wurde dynamisch erweitert 6.7. Array Arrays erben von Object und besitzen ein spezielles Attribut length. Arrays sollten dann verwendet werden, wenn Keys sequentielle Integer sind. Andernfalls besser Objekte einsetzen. 6.7.1. Array erzeugen arrExample = ['first', 'second']; 6.7.2. Array erweitern arrExample[arrExample.length] = 'third'; 6.8. Eingebaute Objekte Es gibt einige eingebaute Objekte in Java. Die wichtigsten sollen nachfolgend kurz erwähnt werden: String Math Date parseInt() parseFloat() 6.9. substring(), toUpperCase(), … Math.PI, Math.sin(), Math.log(), … Systemdatum, Datumsberechnungen Parst einen String und berechnet Integer Parst einen String und berechnet Float Document Object Model (DOM) 6.9.1. Einleitung Das DOM ist eine plattform- und sprachneutrale Spezifikation des W3C. Es definiert ein Objekt-Modell von Dokumenten (XML, HTML) und erlaubt den dynamischen Zugriff und die Modifikation von Inhalt und Struktur. 6.9.2. Level Level Level Level DOM Level 0: Nie formal spezifiziert, Techniken vor der Standardisierung 1: Bewegen im Baum, Manipulation von Knoten. Attribute von HTML-Tags. 2: XML-Namespaces, CSS-Formatierungen anpassen, Event-Handling 3: Serialisieren, Parsen, Validieren Heute üblich: Level 1 und einige Teile von Level 2. 6.9.3. Vordefinierte Objekte (DOM Level 0) navigator Properties mit Namen und Version des Browsers, MIME-Typen window Top-Level Objekt, Properties für gesammtes Window document Properties für einzelne Inhalte location Aktuelle URL history Zuvor besuchte Seiten Kälin Thomas, Abt I 41/96 17.12.2007 Internettechnologien 6.9.4. Zugriff auf Kind-Knoten document.body.childNodes[0]; document.body.firstChild; document.body.lastChild; 6.9.5. //Erstes Element //Erstes Element //Letztes Element Zugriff auf Nachbar-Knoten document.body.firstChild.nextSibling; document.body.firstChild.previousSibling; 6.9.6. Zugriff über Tag-Name document.body.getElementsByTagName('p')[0]; 6.9.7. Zugriff über ID document.getElementById('idOfNode'); document.getElementById('idOfNode').firstChild; 6.9.8. Knoten erzeugen und anhängen var newNode = document.createElement('p'); document.getElementById('idOfNode').appendChild(newNode); 6.9.9. Knoten erzeugen und einfügen var newNode = document.createElement('p'); var myObject = document.getElementById('idOfNode'); myObject.insertBefore(newNode, myObject.firstChild); 6.9.10. Knoten entfernen var myObject = document.getElementById('idOfNode'); myObject.removeChild(myObject.firstChild); 6.9.11. Werte lesen / schreiben document.getElementById('idOfNode').innerHTML; document.getElementById('idOfNode').innerHTML = 'New Value'; 6.9.12. Attribute lesen / schreiben document.getElementById('idOfNode').getAttribute('nameOfAttribute'); document.getElementById('idOfNode').setAttribute('nameOfAttribute', 'bla'); 6.9.13. CSS lesen / schreiben (Ab DOM Level 2) document.getElementById('idOfNode').style.color; document.getElementById('idOfNode').style.color = '#ff0000'; 6.10. Event Handler Events werden meist durch den Benutzer ausgelöst. Die so genannten Event Handler können definiert werden, um auf solche Events zu reagieren. 6.10.1. Interaktive Handler onabort onmoouseover onclick onmouseout onfocus onselect onsubmit onchange onkeypress onblur onreset 6.10.2. Nicht-Interaktive Handler onerror onload onunload 6.10.3. Einbauen von Handlern Variante 1: Direkt im Code <input type="button" onclick="myFunction();" /> Variante 2: Per JS zuweisen document.getElementById('myButton').onclick = myFunction; document.getElementById('myButton').onclick = null; Kälin Thomas, Abt I 42/96 //Setzen //Löschen 17.12.2007 Internettechnologien 6.10.4. THIS in Handlern THIS wird in den zugewiesenen Funktionen auf das auslösende Element ausgerichtet. 6.10.5. On Load – Problem DOM steht erst dann zur Verfügung, wenn die komplette Website geladen wurde. Daher gibt es den Handler window.onload, welcher ausgeführt wird, wenn die Seite inklusive Ressourcen komplett geladen ist. 6.11. Sonstiges 6.11.1. Live Connect LiveConnect erlaubt die Kommunikation zwischen JavaScript und Java Applets einer Seite, sowieso zwischen Java Script und Plug-Ins. document.applets["HelloWorld"]; Kälin Thomas, Abt I 43/96 17.12.2007 Internettechnologien 7. AJAX 7.1. Einführung und Begriffe 7.1.1. DHTML Dynamic HTML oder DHTML ist ein Begriff, der mehrere Technologien zusammenfasst, mit denen interaktive und animierte Webseiten erstellt werden können. Dazu wird heute HTML, CSS, JavaScript und das Document Object Model (DOM) verwendet. Damit ist es möglich, Webseiten zu schreiben, deren Inhalte sich während der Darstellung im Browser dynamisch ändern. 7.1.2. Remote Scripting Remote Procedure Call), also eine Technologie, die es Remote Scripting ist eine Form von RPC (R clientseitigen Applikationen, die diesem Fall in einem Webbrowser laufen, erlaubt, Daten mit einem Server auszutauschen. Das lokale Script (typischerweise JavaScript) kann dadurch Applikationen auf der Serverseite aufrufen und die empfangene Antwort verarbeiten. 7.1.3. Ajax Ajax erlaubt es, interaktive Webapplikationen zu erstellen, die auf Benutzeraktionen nicht mit einem kompletten Neuladen der Webseite reagieren, sondern durch Austauschen von kleinen Mitteilungen mit dem Server im Hintergrund und das Verändern des Inhalts der im Webbrowser geladenen Seite. Bei einer Veränderung wird also nicht mehr die komplette Seite neu geladen, sondern lediglich die geänderten Inhalte. Im Prinzip werden mit Ajax einfach die beiden vorher erwähnten Konzepte von DHTML und Remote Scripting unter einem neuen Begriff zusammengefasst. Folglich bezeichnet Ajax den ganzen Ablauf von einer Abfrage an den Server (Remote Scripting) bis zum dynamischen Manipulieren der bestehenden Webseite (DHTML). 7.2. Unterschied zu traditionellen Webapplikationen Das klassische HTTP ist zustandslos und basiert auf dem Request/Response-Prinzip. Auch HTML wurde als reine Darstellungssprache entworfen. Für den Webbrowser bedeutet dies, dass nach jedem Seitenaufruf die komplette Seite neu geladen werden muss. In Ajax wird der Request über das XMLHttpRequest-Objekt gemacht, wobei damit vom Server nur ein Block von Daten abgefragt wird und nicht eine ganze Seite. Der JavaScript-Code im Client kann dann die empfangenen Daten entsprechend behandeln und beispielsweise über die DOM-Funktionen dynamisch in die bereits angezeigte Webseite integrieren. Kälin Thomas, Abt I 44/96 17.12.2007 Internettechnologien 7.3. Problembereich 1: Transports 7.3.1. XMLHttpRequest XMLHttpRequest ist ein API, das durch JavaScript oder anderen Browser-basierten Sprachen verwendet werden kann, um Daten über das Protokoll HTTP auszutauschen. Dadurch können nun aus JavaScript heraus Daten von einem Webserver abgerufen werden, um diese dann dynamisch in die bereits geladene Webseite zu integrieren. Da XMLHttpRequest zudem asynchron arbeiten kann entsteht die Möglichkeit dies für den User unsichtbar zu realisieren. Das XMLHttpRequest-Objekt hat ferner 5 ZUSTÄNDE. Über diese kann der Client-Code überprüfen, wie weit die Abfrage vom Server bereits verarbeitet wurde. 0 1 2 3 4 Uninitialized Open Sent Receiving Completed Das Objekt wurde nicht initialisiert. Objekt initialisiert, aber kein Request gesendet. Der Request wurde gesendet. Teile der Antwort sind bereits verfügbar. Die Bearbeitung des Requests ist beendet. Die beiden nachfolgenden Beispiele demonstrieren hierbei zuerst einen SYNCHRONEN AUFRUF und anschliessend einen ASYNCHRONEN AUFRUF. Synchroner Aufruf var req = new XMLHttpRequest(); req.open('GET', 'http://www.w3.org/', false); req.send(null); handleResponse(req.status, req.responseText); Asynchroner Aufruf var req = new XMLHttpRequest(); req.open('GET', 'http://www.w3.org/', true); req.onreadystatechange = handleStateChange; req.send(null); //Zustand //Zustand //Zustand //Zustand 0 1 2 4 //Zustand 0 //Zustand 1 //Zustand 2 function handleStateChange() { switch (req.readyState) { case 0 : // UNINITIALIZED case 1 : // OPEN case 2 : // SENT case 3 : // RECEIVING break; case 4 : // COMPLETED handleResponse(req.status, req.responseText); break; default : ; // fehlerhafter Status }}; Kälin Thomas, Abt I 45/96 17.12.2007 Internettechnologien Im vorherigen Beispiel konnten wir bereits das Attribut readyState sehen. Das XMLHttpRequestObjekt hat allerdings noch mehr ATTRIBUTE: readyState onreadystatechange responseText responseXML status statusText Aktueller Zustand des Requests Wird bei einem Zustandswechsel aufgerufen Antwort als Plaintext auslesen Antwort als XML-Document auslesen. Nur bei XML! http-Status als Code (200, 404, …) http-Status als String (OK, Not Found, …) HTTP unterstützt ferner zwei unterschiedliche Methoden um Parameter zu übertragen: GET UND POST. Auch diese beiden Varianten werden unterstützt: GET-Parameter req.open("GET", "myScript.php?param1=foo¶m2=bar"); POST-Parameter req.open("POST", "myScript.php"); req.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); req.send("param1=foo¶m2=bar"); Nachfolgend soll nun jetzt noch ein komplettes Beispiel gezeigt werden, welches auf verschiedene Attribute zugreift und die Antwort des Servers in einer Dialogbox anzeigt. function getFile(file) { var req = new XMLHttpRequest(); req.onreadystatechange = function() { displayResponse(req); }; req.open("GET", file, true); req.send(null); } function displayResponse(req) { if (req.readyState == 4) { if (req.status == 200 || req.status == 304) { alert(req.responseText); } } } Abschliessend bleibt nun noch zu sagen, dass über XMLHttpRequest nur auf Daten von derselben Domain zugegriffen werden darf. Es ist allerdings ein Umweg über einen Proxy auf dem eigenen Server zum „Fremdzugriff“ denkbar. 7.3.2. On-Demand JavaScript Wie bereits erwähnt wurde ist die vorherige Lösung auf Ressourcen auf demselben Server angewiesen. Bei dem Ansatz über On-Demand JavaScript gilt dieser Beschränkung nicht, dafür können nur JS-Skripte geladen werden. Die Grundidee ist, dass über JS/DOM ein script-Tag dynamisch erstellt werden kann. function getJS(file) { //Altes Element entfernen var script = document.getElementById('lastLoadedCmd'); if(script != null) { script.parentNode.removeChild(script); } //Neues Element erstellen var script = document.createElement('script'); Kälin Thomas, Abt I 46/96 17.12.2007 Internettechnologien script.src = file; script.type = 'text/javascript'; script.defer = true; script.id = 'lastLoadedCmd'; //Neues Element in Header setzen var head = document.getElementsByTagName('head')[0]; head.appendChild(script); } Dadurch wird dynamisch ein script-Tag erzeugt, was das Laden der im src-Attribut angegebenen Ressource hervorruft. Dadurch ist aber natürlich der Antworttyp auf JavaScript eingeschränkt. In Kombination mit dem JSON-Format, lassen sich Daten aber ziemlich einfach Laden. 7.3.3. IFrame Es werden versteckte iframe-Tags dynamisch erzeugt. Durch das onload-Attribut wird ein Handler aufgerufen, sobald die Ressource fertig geladen ist. Anschliessend kann der Inhalt ausgelesen werden. 7.3.4. IMG Hier wird dynamisch ein img-Tag erzeugt. Das Bild ist dabei allerdings unwichtig, die Kommunikation geschieht nur über Cookies. 7.3.5. 7.4. Vergleich der unterschiedlichen Transports Problembereich 2: Übermittlungsformate 7.4.1. Anmerkung Alle nachfolgenden Code-Beispiele machen immer dasselbe: Es wird eine Zeitangabe aus dem Request des Servers ausgelesen und in einen div-Tag mit der ID "answer" geschrieben. <div id="answer"></div> Kälin Thomas, Abt I 47/96 17.12.2007 Internettechnologien 7.4.2. Plain Text Die simpelste Variante ist sicher, die Antwort als einfachen Text zu übergeben. Allerdings kann das bei komplexeren Antworten etwas unübersichtlich werden. Antwort Fri Aug 18 16:56:28 CEST 2006 Verarbeitung document.getElementById('answer').innerHTML = req.responseText; 7.4.3. XML Der ursprünglich für Ajax vorgesehene Anworttyp XML ist naheliegend, allerdings ist der Overhead relativ gross und der Aufwand, eine komplexere XML-Antwort über die DOMFunktionen zu parsen und in das bestehende Dokument zu integrieren, ist nicht zu unterschätzen. Antwort <?xml version="1.0" encoding="utf-8" ?> <answer> <time>Fri Aug 18 16:56:28 CEST 2006</time> </answer> Verarbeitung var res = req.responseXML; var time = res.getElementsByTagName('time')[0]; document.getElementById('answer').innerHTML = time.firstChild.nodeValue; 7.4.4. X(HTML) Der Schritt von XML zu (X)HTML ist nicht mehr weit. (X)HTML bietet aber den Vorteil, dass die Daten schon für die Anzeige aufbereitet wurden und somit nur noch in das bestehende Dokument eingefügt werden müssen. Antwort <p><em>Fri Aug 18 16:56:28 CEST 2006</em></p> Verarbeitung document.getElementById('answer').innerHTML = req.responseText; 7.4.5. JSON – Java Script Object Notation Wie erwähnt ist jedes beliebige Antwortformat denkbar, somit auch JavaScript. Zu relevanter Verbreitung hat es zuletzt aber das Format JSON geschafft. JSON ist eine Untermenge von JavaScript. Die Schreibweise von JSON ist im Vergleich zu XML kompakter und produziert deshalb weniger Overhead. Darüberhinaus kann JSON relativ einfach in die nativen Datentypen umgewandelt werden. In JavaScript wird eine JSON-Zeichenkette direkt mit der eval()-Funktion in ein JavaScript-Objekt umgesetzt. Antwort { "answer": { "time": "Fri Aug 18 16:56:28 CEST 2006" }, "answer2: { "anArray": [ {"Content": "Value"}, {"Content": "Value"} ] } } //Objekt „answer“ //Attribut „time“ //Objekt „answer2“ //Ein Array mit 2 Objekten Verarbeitung document.getElementById('answer').innerHTML = res.answer.time; Kälin Thomas, Abt I 48/96 17.12.2007 Internettechnologien 7.5. Problembereich 3: Generierung von HTML 7.5.1. Anmerkung Die bisherigen Beispiele beschränkten sich auf einen kurzen String, den es je nach Format aus der Antwort zu lesen, respektive zu parsen, galt. Dieser String wurde dann über das innerHTML-Attribut in das bestehende Dokument eingefügt. Das Lesen (oder Parsen) der Antworten kann je nach verwendetem Format mehr oder weniger komplex sein. Der nächste Schritt ist dann das Einfügen der empfangenen Daten in die schon geladene Seite. 7.5.2. DOM DOM ist relativ kompliziert und benötigt bei umfangreicheren Manipulationen einen ziemlichen Programmieraufwand. var table = document.createElement('table'); var tbody = document.createElement('tbody'); table.appendChild(tbody); for(i=0; i<5; i++) { var tr = document.createElement('tr'); var td = document.createElement('td'); td.appendChild(document.createTextNode(i)); tr.appendChild(td); var td = document.createElement('td'); td.appendChild(document.createTextNode(i*2)); tr.appendChild(td); tbody.appendChild(tr); } document.body.appendChild(table); 7.5.3. String + innerHTML Dieses Attribut speichert den Inhalt eines HTML-Elements. Dem innerHTML-Attribut kann ein String zugewiesen werden, der auch HTML-Tags enthalten darf, diese werden dann vom Browser interpretiert. var table = "<table>"; table += "<tbody>"; for(i=0; i<5; i++) { table += "<tr>"; table += "<td>" + i + "</td>"; table += "<td>" + i*2 + "</td>"; Kälin Thomas, Abt I 49/96 17.12.2007 Internettechnologien table += "</tr>"; } table += "</tbody>"; table += "</table>"; document.body.innerHTML += table; 7.5.4. Clientseitiges Templating Bei dieser Idee wieder neben der Antwort auch das Template übertragen. Bei diesem Template handelt es sich um HTML-Blöcke, welche mit einer speziellen Skriptsprache vorbereitet sind und anschliessend nur noch mit Inhalten gefüllt werden müssen. 7.5.5. XSLT – Extensible Stylesheet Language Transformations Ein ähnlicher Ansatz wie das clientseitige Templating wäre die Verwendung von XSLT. Damit kann ein XML-Dokument in jede beliebige andere XML-basierte Sprache oder aber auch in Formate, die nicht XML-basiert sind, umgewandelt werden. 7.5.6. Vorformatiertes HTML Wie bereits erklärt wurde, ist es auch möglich, dass der Server direkt mit HTML antwortet, das dann über das innerHTML-Attribut in das bestehende Dokument eingefügt wird. Dabei beschränkt sich der Code auf dem Client praktisch nur auf diese Zuweisung zum innerHTML-Attribut. Die HTML-Antwort wird in diesem Fall also vom Server generiert, zum Client gesendet und dort ins Asynch ronous HTML and Dokument eingefügt. Dieses Prinzip wird teilweise auch als AHAH (A HTTP) bezeichnet. 7.5.7. E4X - ECMAScript for XML E4X ist eine alternative, einfachere Syntax für das Bearbeiten von XML-Dokumenten als die bekannte DOM-Schnittstelle. E4X ist allerdings relativ neu und der erste Browser, der dafür Unterstützung bietet, ist Firefox. Und auch in diesem Browser muss die Unterstützung zuerst aktiviert werden, was mit folgenden Zeilen gemacht werden kann: <script type="text/javascript;e4x=1">…</script> Der Zugriff über JavaScript auf die XML-Knoten wird mit E4X enorm vereinfacht. Es ist deshalb abzusehen, dass sich E4X früher oder später durchsetzen wird. 7.6. Architekturdiskussionen 7.6.1. Traditionelle Webapplikationen Traditionelle Webapplikationen setzen auf eine Client-Server-Architektur mit einem Thin-Client. Dabei werden alle Bearbeitungen auf dem Server erledigt und der Client nur dazu benutzt, die aufbereiteten Inhalte anzuzeigen. Der grosse Nachteil dabei ist, dass jede Aktion ein komplettes Neuladen verursacht, auch wenn diese Aktion eigentlich nur einen kleinen Teil der bereits angezeigten Seite ändert. 7.6.2. RIA - Rich Internet Application Mit der Benutzung einer clientseitigen Technologie, die Instruktionen auf dem Client ausführen kann, kann das vollständige Neuladen für viele Interaktionen vermieden werden. Eine solche Applikation wird als RICH INTERNET APPLICATION (R RIA) bezeichnet. RIAs führen alle eine Zwischenschicht ein, die der Server Kommunikation und eventuell auch dem Rendering des User Interfaces dient. 7.6.3. SPA – Single Page Application Grundsätzlich ist es möglich, wenn man dieses Konzept auf die Spitze treibt, so genannte SINGLE PAGE APPLICATIONS (S SPA) zu erstellen. Eine SPA ist eine Webapplikation, die komplett im Browser läuft. Das bedeutet also, dass die Seite wird beim ersten Aufruf geladen und nachher Änderungen komplett dynamisch (beispielsweise durch DOM-Manipulationen) vorgenommen werden. Kälin Thomas, Abt I 50/96 17.12.2007 Internettechnologien 7.7. Andere Problemstellungen 7.7.1. Unterschiedliche Implementierungen von XMLHttpRequest Verschiedene Versionen des Internet Explorers implementieren die Unterstützung von XMLHttpRequest unterschiedlich. Damit der Code mit unterschiedlichen Versionen kompatibel ist muss deshalb eine Browser-Weiche eingebaut sein. var req = null; if(window.XMLHttpRequest) { req = new XMLHttpRequest(); } else { if(window.ActiveXObject) { //IE 5 & 6 req = new ActiveXObject("Microsoft.XMLHTTP"); } } 7.7.2. Server Push-Problem Der Server kann nicht von sich aus eine Verbindung mit dem Client öffnen. Events, die zum Beispiel ausgelöst werden, wenn sich Daten auf dem Server ändern, können nicht unmittelbar an den Client gesendet werden. Die naheliegendste Lösung stellt ein POLLING dar. Dadurch fragt der Client in einem bestimmten Intervall den Server nach eventuell zu verarbeitenden Events. Dies erzeugt aber auf dem Server eine entsprechend hohe Last. Eine andere Lösung ist es, einen EVENT ZURÜCKZUHALTEN und erst an den Client zu senden, wenn der Client eine Anfrage an den Server sendet. Folglich wird der Event zusammen mit der eigentlichen Antwort der Anfrage zum Client transportiert. Um diese Verzögerung bei der Auslieferung eines Events zu verhindern, ist HTTP-STREAMING eine weitere mögliche Lösung. Die meisten Webservices bearbeiten eine Anfrage, senden die Antwort und beenden sich. Beim HTTP-Streaming lassen sie die Verbindung offen. Als Alternative gilt ein Verfahren, das sich unter dem Namen COMET etabliert hat. Das Prinzip dabei ist, dass der Client eine Verbindung zum Server öffnet und dieser die Verbindung so lange hält, bis er etwas an den Client senden muss. Daraufhin öffnet der Client sofort die nächste Verbindung und ermöglicht eigentlich so dem Server, dass er jederzeit Daten an den Client senden kann. 7.7.3. Usability Ein erster Mangel kann sein, dass Ajax im Hintergrund läuft. Es ist deshalb unbedingt ein visuelles Feedback zu geben, wenn eine Ladeaktivität abläuft. Auch können unbemerkte Änderungen am UI zur Verwirrung des Benutzers führen. Ferner bleibt die URL bei Ladeaktionen im Hintergrund identisch. Die Vor- und Zurück-Buttons im Browser funktionieren deshalb nur eingeschränkt, Links und Bookmarks sind gar nicht mehr möglich. Eine mögliche Lösung führt über Fragment Identifiers, dieser optionale Teil einer URL folgt nach dem #-Zeichen. Gewöhnlich wird dies verwendet, um Anker (engl. Anchors) innerhalb eines Dokuments zu referenzieren. Ein Browser scrollt dadurch zu einem bestimmten Punkten einer Seite. Dies ist der entscheidende Punkt, denn es wird kein Reload ausgeführt, obwohl die URL ändert und ein Eintrag in der Browser-History vorgenommen wird. Dieser Hash kann durch JavaScript (w window.location.hash) manipuliert werden, was nun dazu benutzt werden kann, den Status einer Ajax-Seite zu kennzeichnen. 7.7.4. Suchmaschinen Roboter von Suchmaschinen folgen Links. Dadurch, dass Ajax-Webapplikationen grundsätzlich die URL nicht ändern, ist das Indizieren einer Ajax-Seite nicht ohne weiteres möglich. Kälin Thomas, Abt I 51/96 17.12.2007 Internettechnologien 8. ARCHITEKTUR-PATTERNS FÜR WEB-APPLIKATIONEN 8.1. Logische Architektur 8.1.1. Beschreibung Beschreibt die Gliederung in Packages und deren Abhängigkeiten. Wird meist mittels eines Klassenoder Package-Diagramms dargestellt. 8.1.2. Beispiele bei Webtechnologien UI: HTML, JavaScript, Servlets, JSP APPLICATION: JavaBeans, Java DOMAIN: Java 8.2. Physische Architektur 8.2.1. Beschreibung Beschreibt die Verteilung der logischen Architektur auf Verarbeitungseinheiten. 8.2.2. Beispiele bei Webtechnologien CLIENT TIER: Web-Browser, HTML, JavaScript (UI allgemein) WEB TIER: Servlets und JSP (UI), JavaBeans und Java (Application) 8.3. Model View Controller (MVC) 8.3.1. Beschreibung MODEL: Enthält die Business Logik, entspricht also der Problem Domain VIEW: Stellt Informationen für den Benutzer dar CONTROLLER: Nimmt Benutzer-Eingaben entgegen und leitet diese zur Verarbeitung an das Model. 8.3.2. MVC und Web-Applikationen Im originalen MVC benachrichtig das Model die angemeldeten Views über den Observer. Dies entspricht dem PUSH-PRINZIP. Bei Web-Applikationen wird allerdings nach dem PULL-PRINZIP gearbeitet, das heisst also, dass von ausserhalb ein Request kommt, welcher vom Model als Response bearbeitet wird. Diese Response entspricht dabei meist der Generierung einer View. Kälin Thomas, Abt I 52/96 17.12.2007 Internettechnologien 8.3.3. MVC-Umsetzung mittels Java-Technologien VIEWS: JSP CONTROLLER: Servlets MODEL: Java, JavaBeans, EJB 8.4. Andere Patterns 8.4.1. Application Controller Ein Application Controller ist ein zentraler Punkt, an welchem der Kontrollfluss und die Navigation der Präsentation gesteuert wird. 8.4.2. Front Controller Es existiert nur ein einziger, zentraler Input-Controller, welcher allerdings oft in einzelne Handler aufgespaltet wird. Dabei wird das GoF-Pattern COMMAND PATTERN benutzt. 8.4.3. Page Controller Hier existiert für jede Seite ein eigener Controller, welcher in der Website integriert sein kann. Empfehlenswert ist aber die Verwendung eines eigenständigen Objektes. Durch diesen Ansatz entsteht ein verteilter Controller. Kälin Thomas, Abt I 53/96 17.12.2007 Internettechnologien 8.4.4. Template View Über spezielle Marker innerhalb des HTML-Codes werden Informationen ausgegeben. 8.4.5. Transform View Eine spezielle View, welche Datenelemente aus der Problemdomain in HTML-Code transformiert. 8.4.6. Two Step View Erzeugt in zwei Schritten aus den Daten in der Problem Domain HTML-Code. Im ersten Schritt wird dabei eine Art logische Zwischenstufe erzeugt, welche noch völlig formatierungsfrei ist. Anschliessend wird in einem zweiten Schritt diese logische Information in HTML-Code umgewandelt. Kälin Thomas, Abt I 54/96 17.12.2007 Internettechnologien 9. STRUTS 9.1. Einleitung Als JAVA SERVLETS entwickelt wurden, überragten schnell die Vorteile gegenüber CGI. Servlets sind mächtiger, portabel und praktisch unbegrenzt erweiterbar. Das Schreiben von HTML-Anweisungen in zahllosen println()-Statements war jedoch mühsam und unübersichtlich. Die Antwort darauf waren die JAVA SERVER PAGES, welche das Servlet-Prinzip umkehrten. Nun konnte der Entwickler sehr einfach HTML mit Java-Code mischen und hatte alle Vorteile von Servlets. WebApplikationen wurden dadurch immer mehr JSP-zentriert. Die Durchmischung von HTML und JavaCode führte aber in der Regel zu unübersichtlichen und schlecht wartbaren Gesamtprojekten. Ein weiteres Modell war also gefragt. Viele Entwickler realisierten, dass JSP und Servlets gleichzeitig verwendet werden können. Die Servlets helfen beim Kontrollfluss und die JSPs beschränken sich auf die Ausgabe von HTML. Mit diesem Prinzip ist es möglich, die KLASSISCHE MODEL VIEW CONTROLLER-ARCHITEKTUR für WebApplikationen einzusetzen. 9.2. Model View Controller – Architektur 9.2.1. Übersicht 9.2.2. Controller ACTION SERVLET: Ist in etwa ein Front Controller. Wird beim Starten des Web-Containers geladen und nimmt alle Requests entgegen. Diese werden an den Request Processor weitergeleitet. REQUEST PROCESSOR: Ist ein Teil des Application Controllers und erledigt den Hauptteil der Aufgaben im Framework. Eingehende Request-Daten werden in ActionForms abgefüllt, was im Prinzip einfache JavaBeans sind. Weiter wird die zu einer URL zugehörige Action gesucht und die Verarbeitung des Requests an diese delegiert (Aufruf von execute()). ACTIONFORM: Ist eigentlich eine JavaBean, welche die Request-Daten enthält. Sie besitzt eine validate()-Methode, welche zur Überprüfung der Parameter durch den Request Processor aufgerufen werden kann. ACTION: Verarbeitet Requests und delegiert Arbeiten an das Model. Kälin Thomas, Abt I 55/96 17.12.2007 Internettechnologien 9.2.3. Model Das Struts-Framework bietet keine Model-Klassen an, sie sind jeweils applikationsspezifisch zu implementieren. 9.2.4. View Struts gibt keine konkrete Technologie für die View vor. Allerdings bietet sich JSP an, da von Struts verschiedene JSP Custom Tags angeboten werden, die die Entwicklung von JSP-Seiten unterstützen. Grundsätzlich könnten aber auch andere Technologien eingesetzt werden. 9.2.5. 9.3. Ablauf eines Request Konfiguration von Actions 9.3.1. Download Das Struts-Framework kann auf der Apache-Website heruntergeladen werden. Anschliessend müssen alle im Verzeichnis lib/ enthaltenen Daten nach WEB-INF/lib kopiert werden. 9.3.2. Web Application Deployment Descriptor (web.xml) Damit das ActionServlet die Rolle des Front Controllers übernehmen kann und Requests an die zugehörigen Actions weiterleiten kann, muss der Web Application Deployment Descriptor (w web.xml) angepasst werden. <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> Kälin Thomas, Abt I 56/96 17.12.2007 Internettechnologien Es gibt nun zwei gebräuchliche Arten, um eine URL für das Controller Servlet zu definieren: EXTENSION MATCHING und PREFIX MAPPING. EXTENSION MAPPING heisst, dass wir sämtliche URLs, die mit einem bestimmten String enden, an das ActionServlet weitergereicht werden. Gebräuchlich ist dazu die Endung *.do. Die zweite Möglichkeit ist das PREFIX MAPPING, das Requests, die mit einem bestimmten Wert beginnen an das ActionServlet weiterreicht. Variante 1: Extension Mapping <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> Variante 2: Prefix Mapping <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>/execute/*</url-pattern> </servlet-mapping> 9.3.3. Action Mapping (struts-config.xml) Schlussendlich muss die Action im Struts-Konfigurationsfile struts-config.xml, das vom ActionServlet bei der Initialisierung eingelesen wird, eingetragen werden. Dadurch wird beispielsweise bestimmt, welche Action-Klasse unter welchem Namen (=URL) erreichbar ist und an welche JSP-Seite anschliessend die Kontrolle weitergeleitet werden soll. <form-beans> <form-bean name="LoginForm" type="com.myproject.LoginForm" /> </form-beans> … <action-mappings> <action path="/login" //www.test.ch/myProj/login.do type="com.myproject.LoginAction" //Klassenname der Action name="LoginForm" //Name der Form-Bean scope="request" //Context der Form-Bean input="/login.jsp" //Ressource bei Fehler validate="true" //LoginForm.validate() aufrufen? <forward name="done" path="/main.jsp"/> <forward name="register" path="/register.jsp"/> </action> </action-mappings> Im obigen Beispiel wurden im Body des action-Tags mehrere forward-Tags verwendet. Über den angegebenen Bezeichner (= name) kann die Kontrolle an die im Attribut path bezeichnete Ressource weitergegeben werden. 9.4. Programmierung von Action-Klassen Die Aufgabe der Action Klasse ist es, den eingehenden Request zu verarbeiten und anschliessend ein ActionForward Objekt zurückzugeben, das einen im Konfigurationsfile von Struts definierten Forward repräsentiert. 9.4.1. Typischer Ablauf Eine typische Action wird die folgende Logik in ihrer execute()-Methode implementieren: Validierung des Zustandes der aktuellen Session Input-Validierung der Parameter mittels validate() auf ActionForm. Aufrufe an Problem Domain richten Server Objekte für Views aktualisieren ActionForward-Objekt zurück geben. Kälin Thomas, Abt I 57/96 17.12.2007 Internettechnologien 9.4.2. Multithreading Action muss threadsafe implementiert werden. Dies bedeutet: nur lokale Variablen, keine InstanzVariablen verwenden. 9.4.3. Beispiel einer Action public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { LoginForm loginForm = (LoginForm) form; loginForm.validate(); … return (mapping.findForward("done")); //Siehe Mappings in Config } 9.5. Programmierung von ActionForms Wie bereits erwähnt wurde werden die Request-Daten vom Request Processor in ActionForms verpackt. 9.5.1. Lebenszyklus Wie erwähnt, empfängt das ActionServlet die Requests für Struts und reicht diese an den RequestProcessor weiter, der den Lifecycle implementiert. Wenn ein Formular übermittelt wird, schaut Struts im Action Mapping nach, welches ActionForm Bean mit der Action verbunden ist. Wenn Struts keine ActionForm im angegebenen Scope findet, wird eine Instanz der ActionForm erzeugt. Danach wird die reset()-Methode aufgerufen und die einzelnen Properties mit den Daten aus dem Request gefüllt. 9.5.2. Beispiel einer ActionForm public class LoginForm extends ActionForm { private String login; public void setLogin(String login) { this.login = login; } public String getLogin() { return login; } //Validieren von Request-Daten public ActionErrors validate( ActionMapping mapping, HttpServletRequest request) { ActionErrors errors = new ActionErrors(); if(login == null || login.equals("")) { errors.add("login", new ActionMessage("error.login")); } if(errors.size() == 0) { return null; Kälin Thomas, Abt I 58/96 17.12.2007 Internettechnologien } return errors; } //Initialisierung von Formulardaten public void reset(ActionMapping mapping, HttpServletRequest request) { login = "Ihr Benutzername"; } } 9.6. Programmierung von View-Komponenten Nach dem Implementieren einer Action, die ein Formular später bearbeitet, und dem Erstellen einer ActionForm Bean, die also einen einfachen Zugriff auf die Felder eines Formulars ermöglicht, muss nun noch die Darstellung des Formulars definiert werden. 9.6.1. JSP-Syntax vs Struts-Syntax JSP-Syntax: <input type="text" name="login" value="<%= loginForm.getLogin() %>" /> Struts-Syntax: <html:text property="login" /> 9.6.2. Beispielformular <?xml version="1.0" encoding="utf-8"?> <jsp:root xmlns="http://www.w3.org/1999/xhtml" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:bean="http://struts.apache.org/tags-bean" xmlns:html="http://struts.apache.org/tags-html" version="2.0"> <jsp:output doctype-root-element="html" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" omit-xml-declaration="false" /> <jsp:directive.page language="java" contentType="text/html; charset=utf-8"> <html:html xhtml="true"> <head> <title><bean:message key="login.title"/></title> </head> <body> <html:errors/> <html:form action="/login"> <p> <bean:message key="prompt.login" /> <html:text property="login" size="16"/><br /> <html:submit><bean:message key="button.submit" /></html:submit> </p> </html:form> </body> </html:html> </jsp:root> Das errors-Tag zeigt sämtliche Error-Messages an, welche z.B. durch die validate()-Methode eines ActionForm Beans zurückgegeben wurden. Das message-Tag wird benutzt, um die internationalisierten Message-Strings in einem MessageRessources Objekt abzurufen, welches alle Ressourcen für diese Applikation enthält. 9.6.3. Internationalisierung Struts bietet Unterstützung bei der Entwicklung von internationalisierten Applikationen. Dazu ist zuerst eine Datei zu erstellen, die die entsprechenden Texte enthält. Kälin Thomas, Abt I 59/96 17.12.2007 Internettechnologien ApplicationResources.properties logon.title = Login ApplicationResources_de.properties logon.title = Einloggen Diese Dateien können wir in das Package com.myproject legen. Struts wird der Standort dieser Dateien über einen Eintrag in der Konfigurationsdatei struts-config.xml bekannt gemacht: <struts-config> <message-resources parameter="com.myproject.ApplicationResources" /> </struts-config> 9.7. Struts Tag Libraries 9.7.1. Einleitung Ursprünglich war es üblich, Java-Code in Form von Scriptlets direkt in eine JSP-Seite einzubetten. Dies führt dann aber zu schlecht wartbaren und unübersichtlichen JSP-Seiten. Die JSP CUSTOM TAGS wurden kreiert, um dieses Problem zu lösen. Dadurch sollte ein Entwickler in der Lage sein, vollständig auf Java Code in den JSP-Seiten zu verzichten. Das Struts-Framework beinhaltet nun einen Satz von Tag-Bibliotheken, die die Erstellung von JSPSeiten unterstützen. 9.7.2. Bean Tags Die Tags in der Bean Tag Library werden benutzt für die Erstellung und den Zugriff auf JavaBean und einige andere allgemeine Zwecke. Obwohl diese Tags eigentlich mit allen JavaBeans funktionieren, werden sie primär im Zusammenhang mit ActionForm Beans eingesetzt. Am häufigsten werden die beiden Tags write und message benutzt. <table> <!-- Beispiel einer Internationalisierung --> <tr> <th><bean:message key="user.lastname"/></th> <th><bean:message key="user.firstname"/></th> </tr> <!-- Beispiel eines Zugriff auf eine Bean-Variable --> <tr> <td><bean:write name="userForm" property="lastname"/></td> Kälin Thomas, Abt I 60/96 17.12.2007 Internettechnologien <td><bean:write name="userForm" property="firstname"/></td> </tr> </table> 9.7.3. HTML Tags Die Tags in der HTML Tag Library bilden eine Brücke zwischen der mit JSP realisierten View und den anderen Komponenten einer Webapplikation. Die HTML-Tag-Library enthält einige Tags zur Erzeugung von Formularen. Deshalb dürfen die meisten Tags nur innerhalb eines form-Tags benutzt werden. Zudem existieren einige andere Tags, die allgemein nützlich sind beim Erstellen von HTML-basierten User Interfaces. Kälin Thomas, Abt I 61/96 17.12.2007 Internettechnologien 9.7.4. Logic Tags Die Logic Tag Library enthält Tags die nützlich sind, wenn es darum geht, durch Collections zu iterieren, abhängige Ausgaben zu generieren und den Applikationsfluss zu steuern. Hier ist es jedoch besser, die STL-Core Library zu verwenden. Für Tags, die Werte vergleichen sollen (e equal, greaterEqual, greate rThan, lessEqual, lessThan, notEqual) wird der Wert geprüft. Falls der Wert erfolgreich in einen double oder long konvertiert werden kann, wird davon ausgegangen, dass der Vergleich numerisch sein wird. Falls nicht, wird ein String-Vergleich durchgeführt. Falls der Vergleich true ergibt, wird der Body Content des Tags ausgeführt. Nachfolgend noch ein Beispiel für das Iterieren über eine Collection. Wie bereits erwähnt wurde, wäre es hier besser, die STL-Core mit dem forEach-Tag zu verwenden. <logic:iterate id="user" name="userList" property="users"> <tr> Kälin Thomas, Abt I 62/96 17.12.2007 Internettechnologien <td><bean:write name="user" property="lastname"/></td> <td><bean:write name="user" property="firstname"/></td> </tr> </logic:iterate> 9.8. DynaForm Beans 9.8.1. Einleitung Irgendwann hatten einige Entwickler das Gefühl, dass das Erstellen von ActionForm-Klassen für jedes Formular zu aufwändig ist. Deshalb entstanden die DynaForm Beans (oder DynaActionForms), welche nun in struts-config.xml als Konfigurationseintrag und nicht mehr als Klasse erstellt werden. 9.8.2. Verwendung Mit den Struts Tags kann eine DynaForm Bean ganz normal wie eine ActionForm Bean verwendet werden. Über die EXPRESSION LANGUAGE ist ein Property aber nicht in der Form ${userForm.property} sondern nur in der Form ${userForm.map.property} auslesbar. Um in einer Action auf ein Property einer DynaForm Bean zuzugreifen, muss die get()-Methode mit einem Property als String-Parameter benutzt werden. ${userForm.map.property} userForm.get("property") 9.8.3. Definition <form-bean name="userForm" type="org.apache.struts.action.DynaActionForm"> <form-property name="firstame" type="java.lang.String" initial="John" /> <form-property name="lastname" type="java.lang.String" initial="Smith"/> </form-bean> 9.9. Validatoren 9.9.1. Einleitung Analog den DynaForm Beans existiert auch eine Möglichkeit, Validatoren statt in einer validate()Methode implementiert in einer XML-Konfiguration zu definieren. Gerade für DYNAFORM BEANS gibt ja es sonst keine andere Möglichkeit, um Validatoren zu definieren. Das Validator-Plugin gehört seit Struts 1.1 zum Core. Um das Validator-Plugin zu verwenden, muss dieses in struts-config.xml registriert werden. 9.9.2. Einbindung Der Struts Validator bringt eine Reihe von vordefinierten Regeln mit, die verwendet werden können. Die Definitionen dieser Regeln befinden sich in validator-rules.xml im angegebenen Pfad. Die zweite angegebene Datei validation.xml bezeichnet die eigenen Regeln. <plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <set-property property="pathnames" value="/org/apache/struts/validator/validator-rules.xml, /WEB-INF/validation.xml" /> </plug-in> 9.9.3. Verwendung Soll eine DynaForm Bean validiert werden, muss deren Definition in struts-config.xml dahingehend verändert werden, dass neu die Klasse DynaValidatorForm im type-Attribut verwendet wird. <form-bean name="userForm" type="org.apache.struts.validator.DynaValidatorForm"> <form-property name="firstname" type="java.lang.String" initial="John" /> <form-property name="lastname" type="java.lang.String" initial="Smith" /> </form-bean> Kälin Thomas, Abt I 63/96 17.12.2007 Internettechnologien 9.9.4. Eigene Regeln Über das Attribut name des form-Tags wird der Validator mit der DynaForm Bean verbunden. Zur Validierung definiert sind hier die Felder firstname und lastname. Mit dem Attribut depends werden nun die Validierungs-Regeln auf ein Feld angewendet. In diesem Beispiel sind das die bereits vordefinierten Regeln required und minlength. Die minlength-Regel besagt, dass das Feld eine Mindestlänge haben muss. Diese Mindestlänge wird über ein var-Tag übergeben. <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.3.0//EN" "http://jakarta.apache.org/commons/dtds/validator_1_3_0.dtd"> <form-validation> <formset> <form name="userForm"> <field property="firstname" depends="required"> <arg position="0" key="field.firstname"/> </field> <field property="lastname" depends="required, minlength"> <arg position="0" key="field.lastname"/> <arg position="1" name="minlength" key="${var:minlength}" resource="false"/> <var> <var-name>minlength</var-name> <var-value>3</var-value> </var> </field> </form> </formset> </form-validation> 9.9.5. Vordefinierte Validierungsregeln 9.9.6. Fehlermeldungen Die vordefinierten Regeln haben jeweils eine Standard-Message, um die Fehlermeldung darzustellen. Diese können in einem eigenen Resource-File definiert werden: errors.required errors.minlength Kälin Thomas, Abt I = {0} is required. = {0} can not be less than {1} characters. 64/96 17.12.2007 Internettechnologien Die Standard-Fehlermeldung kann mit dem msg-Tag auch überschrieben werden. <field property="firstname" depends="required"> <msg name="required" key="other.message" /> </field> 9.9.7. Client-Seitige Validierung Die Validierung mit den vordefinierten Regeln kann auch clientseitig, also mit JavaScript, erledigt werden. Dazu wird das html:javascript-Tag aus der Struts Tag Library benötigt. Im Attribut formName muss diesem der Name der zu überprüfenden Form Bean angegeben werden, wodurch der JavaScript-Code automatisch generiert wird. Im html:form-Tag muss dann die entsprechende JavaScript-Methode aufgerufen werden. <head> <html:javascript formName="actionForm" /> </head> <body> <html:form action="/test" onsubmit="return validateActionForm(this)"> </html:form> </body> 9.10. Struts Tiles 9.10.1. Einleitung Struts Tiles ist ein Template System, das die früheren Template-Tags ablöst. Es kann benutzt werden, um wieder verwendbare View-Komponenten zu erstellen. Dadurch erhalten verschiedene Seiten ein einfach wartbares, gemeinsames Layout. 9.10.2. Konfiguration Tiles greift in den Ablauf von Struts ein, weshalb folgender Eintrag in der ActionServlet-Definition im web.xml nötig ist. <init-param> <param-name>chainConfig</param-name> <param-value>org/apache/struts/tiles/chain-config.xml</param-value> </init-param> Zudem muss Tiles als Plugin in struts-config.xml eingetragen werden. Tiles wird dabei auch mitgeteilt, wo die Tiles-Konfiguration liegt. <plug-in className="org.apache.struts.tiles.TilesPlugin"> <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" /> </plug-in> 9.10.3. Beispiel <?xml version="1.0" encoding="utf-8"?> <jsp:root xmlns="http://www.w3.org/1999/xhtml" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:html="http://struts.apache.org/tags-html" xmlns:tiles="http://struts.apache.org/tags-tiles" version="2.0"> <jsp:output doctype-root-element="html" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" omit-xml-declaration="false" /> <jsp:directive.page language="java" contentType="text/html;" /> <html:html xhtml="true"> <head> <title><tiles:getAsString name="title"/></title> Kälin Thomas, Abt I 65/96 17.12.2007 Internettechnologien </head> <body> <tiles:insert attribute="header"/> <tiles:insert attribute="body"/> <tiles:insert attribute="footer"/> </body> </html:html></jsp:root> //HEADER.JSP <?xml version="1.0" encoding="utf-8"?> <jsp:root xmlns="http://www.w3.org/1999/xhtml" xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"> <p>Header</p> <hr width="100%" /> </jsp:root> //FOOTER.JSP <?xml version="1.0" encoding="utf-8"?> <jsp:root xmlns="http://www.w3.org/1999/xhtml" xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"> <hr width="100%" /> <p>Footer</p> </jsp:root> //TEST.JSP <?xml version="1.0" encoding="utf-8"?> <jsp:root xmlns="http://www.w3.org/1999/xhtml" xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"> <p>Body</p> </jsp:root> /WEB-INF/tiles-defs.xml) das Layout definiert Jetzt kann in der Konfiguration von Tiles (/ werden. In der Definition main.layout werden die Bereiche header und footer der Datei mainLayout.jsp gefüllt mit den entsprechenden Dateien (entspricht einer Art Inlcude). Titel und Body werden noch leer gelassen. Nun wird diese Definition erweitert mit der Definition test.page, die nun Titel und Body überschreibt. <?xml version="1.0"?> <!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 1.3//EN" "http://jakarta.apache.org/struts/dtds/tiles-config_1_3.dtd"> <tiles-definitions> <definition name="main.layout" path="/mainLayout.jsp"> <put name="title" value=""/> <put name="header" value="/header.jsp"/> <put name="body" value=""/> <put name="footer" value="/footer.jsp" /> </definition> <definition name="test.page" extends="main.layout"> <put name="title" value="Test Page"/> <put name="body" value="/test.jsp"/> </definition> </tiles-definitions> Kälin Thomas, Abt I 66/96 17.12.2007 Internettechnologien 10. JAVA SERVER FACES (JSF) 10.1. Grundlagen 10.1.1. Einleitung JSF ist ein serverseitiges UserInterface-Komponenten-Framework für Webapplikationen. Die Grundidee ist es, ein WebUI, ähnlich wie bei Swing, aus UI-Komponenten zusammenfügen zu können. Dazu stellt JSF einige Standard-Komponenten zur Verfügung. Eigene, wieder verwendbare Komponenten sind ausserdem leicht zu entwickeln. JSF basiert dabei auf Servlets und JSP (inklusive Tag-Libraries). 10.1.2. Grundprinzip 10.1.3. Bestandteile JSF besteht auf zwei Hauptkomponenten: Der API und den JSP-Taglibraries. Die API ist dabei für die UI-Komponenten, das Event-Handling, die Serverseitige Validierung und die Internationalisierung zuständig. Dazu werden zwei JSP-TAGLIBRARIES (h h für UI-Komponenten, f für die Verbindung zwischen UI und Serverobjekten) eingesetzt. 10.2. Lebenszyklus 10.2.1. Phase 1: Restore View Ein Request auf die JSF-Seite startet diese Phase. Beim ersten Mal wird dabei eine leere View erstellt, bei weiteren Requests werden Zustandsinformationen verwendet. Daten werden im FacesContext abgelegt. 10.2.2. Phase 2: Apply Request Values Jede Komponente im Baum extrahiert ihre neuen Wert aus dem Request-Parameter mittels ihrer decode()-Methode. Innerhalb dieser Methode wird zum richtigen Typ konvertiert. 10.2.3. Phase 3: Process Validations JSF verarbeitet alle Input-Validierungen. Es handelt sich hier um reine Input-Validierungen. Im Falle eines Fehlers geht der Lebenszyklus direkt zu „Render Response“ über. 10.2.4. Phase 4: Update Model Values JSF durchwandert den Komponenten-Baum und setzt die entsprechenden serverseitigen ObjektEigenschaften entsprechend den lokalen Werten der Komponente. 10.2.5. Phase 5: Invoke Application Hier werden alle Events auf Applikationsebene behandelt. Das könnte zum Beispiel die Verarbeitung eines Formulars oder ein Verweis auf eine andere Seite sein. 10.2.6. Phase 6: Render Response JSF startet eine eingebaute Methode zur Darstellung des Komponenten-Baums. Falls in den früheren Phasen ein Fehler aufgetreten ist, so wird die Originalseite mit entsprechendem Fehler dargestellt. Kälin Thomas, Abt I 67/96 17.12.2007 Internettechnologien 10.3. UI Komponenten Modell 10.3.1. Einleitung UI Komponenten sind wieder verwendbare Elemente. Diese erlauben es, Werte entgegen zu nehmen und auf Events zu reagieren. Alle JSF UI-Komponenten werden dabei von UIComponentBase abgeleitet. Wichtig ist dabei zu weissen, dass die Darstellung der Komponente nicht durch diese definiert wird, sondern durch ein Render-Kit. Somit könnten die Entwickler das Verhalten einmal definieren, aber verschiedene Renderer erstellen. 10.3.2. Composite Pattern Die UI-Komponenten realisieren intern das COMPOSITE PATTERN. Das bedeutet also, dass die vom Component abgeleiteten Composite’s selber wieder Component-Objekte enhalten können. Auf das UI bezogen bedeutet dass, dass komplexere Elemente aus verschiedenen einfachen zusammengesetzt werden können. 10.3.3. Eingebaute Klassen UICOMMAND: Control, dass „Actions“ abfeuert, wenn aktiviert. UIFORM: Kapselt eine Gruppe von Controls. Analog dem form-Tag in HTML. UIGRAPHIC: Zeigt ein Bild an. UIINPUT: Hält Dateninput des Benutzers fest. UIOUTPUT: Zeigt Daten auf einer Seite an. UIPANEL: Ist Container für weitere Komponenten UIPARAMETER: Konfigurationsparameter für Elternkomponenten UISELECTITEM: Einzelnes Item einer Itemliste UISELECTITEMS: Repräsentiert eine Itemliste UISELECTBOOLEAN: Erlaubt einen Boolean-Wert (Checkbox) UISELECTMANY: Erlaubt mehrere Items in einer Gruppe zu selektieren (Checkbox-Gruppe) UISELECTONE: Erlaubt ein Item in einer Gruppe zu selektieren (Radio-Buttons) 10.4. JSF Events, Listener Model Es existieren in JSF Listener- und Eventklassen, um Events zu verarbeiten, die von UI Komponenten erzeugt wurden. Das Event-Object identifiziert dabei die Komponente, welche das Event generiert hat. Um über diese Events benachrichtigt zu werden muss die Applikation eine Implementierung der Listenerklasse bereitstellen und sie bei der Komponente registrieren. JSF ruft anschliessend automatisch die angemeldeten Listener auf, sobald ein Event eintritt. 10.4.1. Typen JSF kennt VALUE CHANGE EVENTS (Beispiel: Checkboxen) und ACTION EVENTS (Beispiel: Buttons, Hyperlinks). 10.4.2. Listener registrieren <h:inputText id="name" size="50" value="#{cashier.name}" required="true"> <f:valueChangeListener type="listeners.NameChanged" /> </h:inputText> <h:commandLink id="NAmerica" action="bookstore"> <f:actionListener type="listeners.LocaleChange" /> </h:commandLink> 10.4.3. Listener implementieren (Value Change Listener) public class NameChanged implements ValueChangeListener { public void processValueChange(ValueChangeEvent event) { if (event.getNewValue() != null) { FacesContext.getCurrentInstance().getExternalContext(). getSessionMap().put("name", event.getNewValue()); } } } Kälin Thomas, Abt I 68/96 17.12.2007 Internettechnologien 10.5. Validation Model Das Validation Model definiert eine Sammlung von Standardklassen um Validierungen durchzuführen. Dazu haben die meisten Tags Attribute, um die Validator-Eigeschaften zu konfigurieren. 10.5.1. Beispiel einer JSP-Seite <h:inputText id="blz" value= "#{mitglied.blz}" required="true"> <f:validateLength maximum="7" minimum="7" /> </h:inputText> 10.6. Managed Bean Mit Hilfe von Managed-Beans können bei einer Applikation Java Bean-Klassen angemeldet werden, die als Backend-Code ihre Aufgabe erfüllen. Dazu müssen diese allerdings vorgängig in der JSFKonfigurationsdatei (W WEB-INF/faces-config.xml) definiert worden sein. 10.6.1. Definition (WEB-INF/faces-config.xml) <managed-bean> <managed-bean-name>NameDerKlasse</managed-bean-name> <managed-bean-class>Package.Pfad.NameDerKlasse</managed-bean-class> <managed-bean-scope>request | session | application</managed-bean-scope> </managed-bean> 10.6.2. Zugriff <h:inputText id="fieldId" value="#{NameDerKlasse.Attribut}"/> 10.7. Navigation Rules Über die Navigation Rules kann die Navigation innerhalb der Applikation definiert werden. Abhängig davon, was das Servlet auf einen Request für einen return-Value liefert, wird anschliessend auf eine andere Seite umgeleitet. Die Navigation-Rules werden innerhalb von WEB-INF/faces-config.xml definiert. 10.7.1. WEB-INF/faces-config.xml <navigation-rule> <from-view-id>/login.jsp</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/main.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>error</from-outcome> <to-view-id>/error.jsp</to-view-id> </navigation-case> </navigation-rule> 10.7.2. JSP-Seite (login.jsp) <h:form> <h:commandButton value="#{messages.login}" action="#{login.doLogin}" /> </h:form> 10.7.3. Managed Bean Code public String doLogin(){ if (…) { return ("success"); else { return ("error"); } } } 10.8. Custom Converter 10.8.1. Verwendung <h:inputText id="ccno" size="19" converter="CCConverter" required="true" /> Kälin Thomas, Abt I 69/96 17.12.2007 Internettechnologien 10.8.2. Registrierung (WEB-INF/faces-config.xml) <converter> <description>Beispiel-Konverter</description> <converter-id>CCConverter</converter-id> <converter-class>path.to.Class.CCConverter</converter-class> </converter> 10.8.3. Implementierung public class CCConverter implements Converter { public Object getAsObject( FacesContext context, UIComponent component, String newValue) throws ConverterException { return null; } public String getAsString( FacesContext context, UIComponent component, Object value) throws ConverterException { return null; } } 10.9. Beispielapplikation Folgende Beispielsapplikation erzeugt eine Seite, in welcher der Benutzer aufgefordert wird, eine Zahl in einem bestimmten Bereich zu erraten. 10.9.1. UserNumberBean (Java-Quellcode) package guessNumber; import java.util.Random; public class UserNumberBean { int randomInt = 0; int userNumber = 0; private int maximum = 10; private int minimum = 0; public UserNumberBean() { Random randomGR = new Random(); randomInt = randomGR.nextInt(maximum - minimum) + minimum; System.out.println("Duke's number: " + randomInt); } public int getMaximum() { return this.maximum; } public void setMaximum(int maximum) { this.maximum = maximum; } public int getMinimum() { return this.minimum; } public void setMinimum(int minimum) { this.minimum = minimum; } public void setUserNumber(int user_number){ userNumber = user_number; } public int getUserNumber() { return userNumber; } public String getResponse() { if (userNumber == randomInt) { return "Yay! You got it!"; } else { return "Sorry, " + userNumber + " is incorrect."; } } } Kälin Thomas, Abt I 70/96 17.12.2007 Internettechnologien 10.9.2. Web-Deskriptor (WEB-INF/web.xml) <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>guessNumber</display-name> <servlet> <display-name>FacesServlet</display-name> <servlet-name>FacesServlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>FacesServlet</servlet-name> <url-pattern>/guess/*</url-pattern> </servlet-mapping> </web-app> 10.9.3. JSF-Konfiguration (WEB-INF/faces-config.xml) <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"> <faces-config> <application> <locale-config> <default-locale>en</default-locale> <supported-locale>de</supported-locale> <supported-locale>fr</supported-locale> <supported-locale>es</supported-locale> </locale-config> </application> <navigation-rule> <from-view-id>/greeting.jsp</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/response.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <from-view-id>/response.jsp</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/greeting.jsp</to-view-id> </navigation-case> </navigation-rule> <managed-bean> <managed-bean-name>UserNumberBean</managed-bean-name> <managed-bean-class>guessNumber.UserNumberBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> <managed-property> <property-name>minimum</property-name> <property-class>int</property-class> Kälin Thomas, Abt I 71/96 17.12.2007 Internettechnologien <value>0</value> </managed-property> <managed-property> <property-name>maximum</property-name> <property-class>int</property-class> <value>10</value> </managed-property> </managed-bean> </faces-config> 10.9.4. JSP-Seite 1 (greetings.jsp) <?xml version="1.0" encoding="utf-8"?> <jsp:root xmlns="http://www.w3.org/1999/xhtml" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" version="2.0"> <jsp:output doctype-root-element="html" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system=" http://www.w3c.org/TR/xhtml1/DTD/xhtml1strict.dtd" /> <jsp:directive.page contentType="text/html; charset=utf-8" /> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>Hello</title></head> <body> <f:view> <h2> Hi. My name is Duke. I'm thinking of a number from <h:outputText value="#{UserNumberBean.minimum}" /> to <h:outputText value="#{UserNumberBean.maximum}" />. Can you guess it? </h2> <h:graphicImage id="waveImg" url="/wave.med.gif" /> <h:form> <h:inputText id="userNo" value="#{UserNumberBean.userNumber}"> <f:validateLongRange minimum="#{UserNumberBean.minimum}" maximum="#{UserNumberBean.maximum}" /> </h:inputText> <h:commandButton id="submit" action="success" value="Submit"/> </h:form> <p><h:message id="errors1" for="userNo" style="color: red; text-decoration: overline" /></p> </f:view> </body> </html> </jsp:root> 10.9.5. JSP-Seite 2 (response.jsp) <?xml version="1.0" encoding="utf-8"?> <jsp:root xmlns="http://www.w3.org/1999/xhtml" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" version="2.0"> <jsp:output doctype-root-element="html" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system=" http://www.w3c.org/TR/xhtml1/DTD/xhtml1strict.dtd" /> <jsp:directive.page contentType="text/html; charset=utf-8" /> Kälin Thomas, Abt I 72/96 17.12.2007 Internettechnologien <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>Guess The Number</title></head> <body> <f:view> <h:form> <h:graphicImage id="waveImg" url="/wave.med.gif" /> <h2> <h:outputText id="result"value="#{UserNumberBean.response}" /> </h2> <h:commandButton id="back" value="Back" action="success" /> </h:form> </f:view> </body> </html> </jsp:root> Kälin Thomas, Abt I 73/96 17.12.2007 Internettechnologien 11. ACCESSIBILITY - BARRIEREFREIHEIT 11.1. Definition Barrierefreiheit beschreibt die Bedienbarkeit eines Produktes für eine möglichst grosse Anzahl an Personen. Auch Menschen mit Behinderungen (Beispiel: Sehschwäche) und mit eingeschränkten technischen Mitteln (PDA, Browser ohne Plug-In XY) sollten in der Benutzung nicht eingeschränkt werden. Durch neue Technologien werden dabei häufig Barrieren abgebaut, jedoch auch neue Barrieren erschaffen. 11.2. Standards 11.2.1. Web Content Accessibility Guidlines 1.0 (WCAG 1) Diese vom W3C herausgegebenen Richtlinien nennen 14 Themengebiete mit insgesamt 66 Checkpunkten, welche sich auf die korrekte Verwendung von XHTML und CSS konzentrieren. Jedem Checkpunkt ist dabei einer der drei folgenden Prioritäten zugewiesen: Priorität 1 Priorität 2 Priorität 3 Single A Double A Triple A Muss-Anforderungen Soll-Anforderungen Kann-Anforderungen Die 14 behandelten Themengebiete sind: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Textäquivalente und Alternativen Farben und Kontraste Trennung von Inhalt und Layout Sprachliche Besonderheiten Tabellen Allgemeine Rückwärtskompatibilität Dynamische Inhalte Benutzerschnittstellen Geräteunabhängigkeit Kompatibilität zu Hilfsmitteln W3C-Techniken Kontextuelle Hilfen Navigation und Orientierung Verständlichkeit 11.2.2. Web Content Accessibility Guidlines 2.0 (WCAG 2) Diese Weiterentwicklung verfolgt die gleichen Ziele wie WCAG1, allerdings sind dieses Mal Technologie-unabhängige Formulierungen gewählt worden. Es handelt sich somit mehr um allgemeine Prinzipien: Wahrnehmbarkeit (Farben, Kontraste) Bedienbarkeit (Funktionen, Inhalte, Eingabemöglichkeiten) Verständlichkeit (Konsistenz, Erklärungen) Robustheit (Validiertes XHMTL, Alternativen) 11.2.3. WAI-ARIA WAI-ARIA (Accessible Rich Internet Client Applications) ist eine Reihe von Richtlinien, welche ausserdem ein Framework für barrierefreie, dynamische Web-Inhalte anbieten. 11.3. Grundlegende Techniken Trennung von Struktur (CSS) und Inhalt (XHMTL) Skalierbarkeit (Schriften, Abstände relativ) Logische Struktur (HTML-Elemente nur entsprechend der Semantik einsetzen) Positionierung (Nicht Tabellen, besser CSS) lang="en") Sprachwechsel auszeichnen (l Kälin Thomas, Abt I 74/96 17.12.2007 Internettechnologien 11.4. Barrierefreiheit bei AJAX 11.4.1. Herkömmliche Webseiten vs AJAX Herkömmliche Webseiten basieren auf dem Request-Response-Paradigm. Ein Screenreader kann somit eine statische Seite einmal parsen und dann das Resultat verarbeiten. Bei AJAX funktioniert das allerdings nicht mehr. Die Benutzerinteraktion führt dabei zu asynchronen Request, welche den Inhalt der dargestellten Seiten verändern. Das stellt eine grosse Herausforderung für Screenreader dar. 11.4.2. WCAG 1 und WCAG 2 WCAG1 forderte noch, dass Zugang zu einer Website auch bei ausgeschaltetem JavaScript möglich sein muss. Dies kann über alternative Versionen der Seite erreicht werden. WCAG2 enthält diese Restriktion nicht mehr. 11.4.3. Ratschläge Einstiegsseite sollte deklarieren, wenn eine Anwendung nur mit JS verwendet werden kann HTML-Dokument und JavaScript-Code vollständig trennen. Das bedingt, dass die Eventhandler Onload gesetzt werden. mittels JavaScript-O Bei dynamischen Änderungen am Inhalt Fokus auf das Element setzen (Hilft dem Screenreader) Hilfetexte nicht in Pop-Ups, sondern in HTML integrieren. 11.5. Regeln für Formulare 11.5.1. Labels <label for="fieldName">Vorname</label> <input name="vorname" type="text" id="fieldName" size="20" /> 11.5.2. Gruppieren von zusammengehörenden Feldern <fieldset> <legend>Anrede</legend> <label for="aF">Frau</label> <input type="radio" name="anrede" id="aF" value="w" /> <label for="aH">Herr</label> <input type="radio" name="anrede" id="aH" value="m" /> </fieldset> Kälin Thomas, Abt I 75/96 17.12.2007 Internettechnologien 12. PORTLETS 12.1. Begriffe & Definitionen 12.1.1. Portal Ein Portal ist eine webbasierte Applikation, die auf Aggregation personalisierter Inhalte beruht. Das Portal erlaubt einem Benutzer bei einer einmaligen Anmeldung (Single Sign On), von mehreren Quellen Informationen zur Verfügung gestellt zu bekommen. Ein Portal kann an verschiedene Benutzer und Geräte angepasst werden. 12.1.2. Portlet Ein Portlet ist eine auf Java basierende Komponente eines Portals, die Requests behandelt und statischen oder dynamischen Inhalt erzeugen kann. Der generierte Inhalt wird Fragment genannt. Ein Fragment ist ein Stück Markup-Code (z.B. HTML), der erst zusammen mit anderen Fragmenten ein komplettes Dokument bildet. Ein Portal setzt die einzelnen von den Portlets erzeugten Fragmente zu einer Portal-Seite zusammen. Portlets sind kein Ersatz für Servlets oder andere Technologien, sie sind eine Ergänzung. Portlets sind dann ideal, wenn es darum geht, unterschiedliche Daten von unterschiedlichen Quellen an einem Ort zugänglich zu machen. 12.1.3. Portlet Container Ein Portlet Container führt die Portlets aus und bietet ihnen die benötigte Laufzeitumgebung. Ein Portlet Container enthält Portlets und kontrolliert deren Lebenszyklus. Er bietet zudem Möglichkeiten zur dauerhaften Speicherung von Portlet-Einstellungen. Ein Portlet Container erhält vom Portal Requests und führt diese auf dem entsprechenden Portlet aus. 12.2. Aufbau Ein Portlet generiert also, wie erwähnt, ein Markup-Fragment. Ein Portal fügt nun normalerweise noch verschiedene Elemente wie Titel oder Kontroll-Buttons hinzu. Dieses neue Fragment wird dann PORTLET WINDOW genannt. Das Portal fügt dann diese Portlet Windows zu einem kompletten Dokument zusammen, der Portal-Seite. 12.3. Vergleich: Portlets und Servlets Servlet Generiert die ganze Seite Wird durch http-Request aufgerufen Definiert durch das Interface Servlet Abstrakte Basisklasse GenericServlet Kälin Thomas, Abt I Portlet Generiert nur Teile (Fragmente) Wird nicht direkt durch http-Request aufgerufen Definiert durch das Interface Portlet Abstrakte Basisklasse GenericPortlet 76/96 17.12.2007 Internettechnologien 12.4. Lebenszyklus eines Portlets 12.4.1. Überblick 12.4.2. Initialisierung Der Portlet Container ist für das Laden und die Instanzierung des einzelnen Portlets zuständig. Es ist dem Portlet Container überlassen, wann ein Portlet geladen wird. Der Portlet Container ruft die init()-Methode auf und setzt das Portlet in Betrieb. 12.4.3. End of Service Die Lebensdauer eines Portlets ist nicht festgelegt und kann variieren. Falls der Portlet Container ein Portlet beenden will, ruft er die destroy()-Methode des Portlets auf, um allfällige Ressourcen entfernen zu können, bevor das Portlet danach ausser Betrieb gesetzt wird. Bei allfälligen Requests muss eine neue Instanz des Portlets erzeugt werden. 12.5. Request Verarbeitung 12.5.1. Phasen Die Action-Phase erledigt einmalige Arbeiten, sie ist optional und kann entfallen. In der Render-Phase werden die Inhalte grafisch aufbereitet. Sie wird in jedem Request verarbeitet. Kälin Thomas, Abt I 77/96 17.12.2007 Internettechnologien 12.6. Architektur eines Portals Grundsätzlich sind Portlets in einer Webapplikation enthalten, wie sie von den Servlets bekannt sind. Ein Portal wird normalerweise ebenfalls in einer Webapplikation deployed und diese kann zudem auch selber Portlets enthalten. Aber Portlets können auch in einer eigenständigen Webapplikation enthalten sein. Da ein Portlet ja nicht selbst aufgerufen werden kann, wird ein Request aber immer über das Portal gehen. 12.7. Konfiguration eines Portlets 12.7.1. WEB-INF/portlet.xml In diesem Descriptor wird jeweils analog dem Servlet-Mapping in web.xml die Zuordnung eines Portlets zu einer Klasse definiert. Somit ist über portlet.xml ersichtlich, welche Portlets eine Portlet-Webapplikation zur Verfügung stellt. <?xml version="1.0" encoding="UTF-8"?> <portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd" version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"> <portlet> <description>Beschreibung</description> <portlet-name>Name des Portlets</portlet-name> <display-name>Angezeigter Name</display-name> <portlet-class>pkg.of.portlet.Classname</portlet-class> <expiration-cache>-1</expiration-cache> <supports> <mime-type>text/html</mime-type> <portlet-mode>VIEW</portlet-mode> </supports> </portlet> </portlet-app> 12.8. Entwicklung eines Portlets 12.8.1. Interface „Portlet“ init(): Initialisiert das Portlet. Diese Methode wird nur einmal aufgerufen, nachdem das Portlet instanziert wurde. processAction(): Wird aufgerufen, wenn der Benutzer eine Action auf einem Portlet aufruft. Nur eine Action wird pro Client-Request aufgerufen. render(): Generiert ein Markup-Fragment. Diese Methode wird für jedes Portlet auf der aktuellen Portal-Seite aufgerufen. destroy(): Wird beim Ende des Lebenszyklus aufgerufen. Diese Methode erlaubt dem Portlet Ressourcen frei zu geben oder Daten persistent zu speichern, bevor das Portlet ausser Betrieb gesetzt wird. 12.8.2. Basisklasse „GenericPortlet“ Um das Entwickeln von Portlets zu vereinfachen, steht die Klasse GenericPortlet zur Verfügung. Dies ist eine abstrakte Implementierung des Portlet Interfaces. Es empfiehlt sich, eigene Portlets von dieser Klasse abzuleiten. Die Klasse GenericPortlet stellt eine Implementierung der render()Methode zur Verfügung. Diese setzt den Titel mit Hilfe der getTitle()-Methode, die entsprechend überschrieben werden kann und ruft die doDispatch()-Methode auf. Letztere ruft entsprechend dem aktuellen Portlet-Modus eine der Methoden doEdit(), doHelp(), doView() auf. 12.9. Modes Der Portlet-Modus beschreibt die Funktion, die ein Portlet gerade ausübt. Je nach Funktion führen Portlets normalerweise verschiedene Aufgaben aus und erzeugen unterschiedlichen Inhalt. Der Portlet-Mode kann vom Portlet in einem Action Request programmatisch geändert werden. Spezifiziert sind drei Modi und zusätzlich die Möglichkeit, eigene Modi zu definieren Kälin Thomas, Abt I 78/96 17.12.2007 Internettechnologien VIEW MODE: Ein Portlet, das sich im View Mode befindet, zeigt Markup an. Dieser Modus muss zwingend von einem Portlet unterstützt werden. EDIT MODE: Innerhalb des Edit Modus kann ein Benutzer die Logik und den Inhalt bestimmen, beziehungsweise verändern. Typischerweise können innerhalb des Edit Modus Einstellungen des Portlets vom Benutzer verändert werden. HELP MODE: Dieser Modus erlaubt dem Benutzer Informationen über das Portlet zu erhalten. CUSTOM MODES: Es können auch eigene Modi definiert werden. 12.9.1. Konfiguration Die Modi, die von einem Portlet unterstützt werden, müssen im Portlet Application Deployment Descriptor portlet.xml registriert werden. <portlet> <supports> <mime-type>text/html</mime-type> <portlet-mode>view</portlet-mode> <portlet-mode>print</portlet-mode> </supports> </portlet> <custom-portlet-mode> <name>print</name> </custom-portlet-mode> 12.9.2. Mode wechseln if (request.isPortletModeAllowed(PorletMode.HELP)) { response.setPortletMode(PortletMode.HELP); } 12.10. Features 12.10.1. Context Die GenericPortlet-Klasse implementiert die Methode getPortletContext(), mit der die PortletContext-Instanz erhalten werden kann. 12.10.2. Window States Wie andere GUI-Komponenten bieten Portlets die Möglichkeit, die Grösse des Portlet-Fensters festzulegen. Die Spezifikation schreibt dabei drei Zustände vor: NORMAL: In diesem Zustand teilt ein Portlet die Seite mit anderen Portlets. MAXIMIZED: In diesem Zustand wird nur dieses Portlet gerendert. MINIMIZED: In diesem Zustand soll nur minimaler oder kein Inhalt gerendert werden. response.setWindowState(WindowState.NORMAL); response.setWindowState(WindowState.MAXIMIZED); response.setWindowState(WindowState.MINIMIZED); 12.10.3. URLs Als Teil des von einem Portlet ausgegebenen Inhalts muss ein Portlet auch URLs erzeugen können, die das Portlet referenzieren. Portlet URLs werden über das Interface RenderResponse durch die Methoden createActionURL(), resp. createRenderURL() erzeugt. ACTION URLS: Werden über die Methode createActionURL() erzeugt und führen schlussendlich zu einem Action Request. RENDER URLS: Werden über die Methode createRenderURL() erzeugt und führen schlussendlich zu einem Render Request. //URL (Render oder Action) erstellen PortletURL url = response.createRenderURL(); PortletURL url = response.createActionURL(); //Parameter an URL übergeben url.setParameter("varName", "varContent"); Kälin Thomas, Abt I 79/96 17.12.2007 Internettechnologien //Ausgeben writer.print("<a href=\""+ url.toString() +"\">Summary</a>"); //Mode und Window-State ändern url.setPortletMode(PortletMode.EDIT); url.setWindowState(WindowState.MAXIMIZED); 12.10.4. Portlet Preferences Durch Portlet Preferences können Benutzer ein Portlet nach ihren Bedürfnissen anpassen. Mit Portlet Preferences existiert eine einfache Möglichkeit, solche Daten persistent zu speichern. Die Speicherung erfolgt über Schlüssel-Werte-Paare, wobei sowohl der Schlüssel als auch der Wert vom Typ String sein muss. PortletPreferences prefs = request.getPreferences(); String name = prefs.getValue("varName", "Default bei Null"); prefs.setValue("varName", "Inhalt"); prefs.store(); Portlet Preferences können in portlet.xml definiert werden, dies ist aber nicht zwingend. Dadurch kann jedoch ein Default-Wert festgelegt und ein Wert als read-only definiert werden. <portlet> <portlet-preferences> <preference> <name>varName</name> <value>Default Wert</value> <read-only>true</read-only> </preference> </portlet-preferences> </portlet> 12.10.5. User Information Ein grundlegendes Konzept eines Portals ist die Anpassung der Oberfläche und des Inhalts an den Benutzer. Die Portlet Spezifikation sieht dazu einen Mechanismus vor, mit dem auf das Benutzerprofil zugegriffen werden kann. Informationen können dabei in so genannten Benutzer-Attributen gespeichert werden. Diese müssen zwingend in portlet.xml deklariert werden. Die Namen der Attribute (u user.name.given) können frei gewählt werden, die Spezifikation empfiehlt aber die Verwendung vorgegebener Namen für häufig benötigte Daten, um eine einheitliche Bezeichnung und Semantik zu gewährleisten. <portlet-app> <user-attribute> <description>Vorname</description> <name>user.name.given</name> </user-attribute> <portlet-app> Um von einem Portlet auf die Benutzer-Attribute zuzugreifen, wird ein Objekt vom Typ Map verwendet, das als Attribut im Request gespeichert ist. Map userInfo = (Map) request.getAttribute(PortletRequest.USER_INFO); givenName = (String) userInfo.get("user.name.given"); 12.10.6. Session Ähnlich wie eine HttpSession aus der Servlet Spezifikation erlaubt eine PortletSession Daten über mehrere Anfragen eines Clients zu speichern. Jede PortletSession ist dabei verknüpft mit einer HttpSession. Wenn Attribute in einer PortletSession gespeichert werden, sind sie auch in der HttpSession sichtbar und umgekehrt. Kälin Thomas, Abt I 80/96 17.12.2007 Internettechnologien Im Unterschied zu einer HttpSession kann eine PortletSession Daten in zwei Scopes ablegen: APPLICATION SCOPE: Session-Daten von ganzer Webapplikation geteilt PORTLET SCOPE: Session-Daten auf Portlet begrenzt. Auf Objekte im Portlet Scope kann entsprechend nur das Portlet zugreifen, das das Objekt erzeugt hat. PortletSession session = request.getSession(true); session.setAttribute("var1", "Content", PortletSession.APPLICATION_SCOPE); session.setAttribute("var2", "Content", PortletSession.PORTLET_SCOPE); 12.11. Portlets und JSP 12.11.1. Delegieren an JSP Portlets können das Erzeugen des Inhalts an Servlets und JSPs delegieren. Die Java Servlet Spezifikation definiert zu diesem Zweck das Interface RequestDispatcher, die Analogie bei der Portlet Spezifikation ist das Interface PortletRequestDispatcher. public void doView(RenderRequest req, RenderResponse res) { PortletRequestDispatcher prd; prd = getPortletContext().getRequestDispatcher("/view.jsp"); prd.include(req, res); } 12.11.2. Portlet Tag Library <portlet:defineObjects/> <% renderResponse.setTitle("my portlet title"); %> Definiert die folgenden Variablen in einer JSP-Seite: RenderRequest renderRequest RenderResponse renderResponse PortletConfig portletConfig <portlet:actionURL windowState="maximized" portletMode="edit" var="name" /> Das actionURL-Tag erzeugt einen URL, der einen Action Request auf dem aktuellen Portlet auslöst. <portlet:renderURL portletMode="view" windowState="maximized" var="name" /> Das renderURL-Tag erzeugt einen URL, der einen Render Request auslöst. <portlet:param name="nameOfVar" value="valueOfVar"/> Das param-Tag definiert Parameter, die Action URLs oder Render URLs mitgegeben werden können. 12.12. Beispiel: Hello World Folgender Beispielcode zeigt ein Fragment, in welchem der Benutzer aufgefordert wird, seinen Namen einzugeben. Tut er dies, so wird der Inhalt anschliessend angezeigt. 12.12.1. WEB-INF/web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>Portlets 01 HelloWorld</display-name> </web-app> Kälin Thomas, Abt I 81/96 17.12.2007 Internettechnologien 12.12.2. WEB-INF/portlet.xml <?xml version="1.0" encoding="UTF-8"?> <portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd" version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"> <portlet> <portlet-name>HelloWorld</portlet-name> <portlet-class>portlet.HelloWorldPortlet</portlet-class> <expiration-cache>0</expiration-cache> <supports> <mime-type>text/html</mime-type> <portlet-mode>VIEW</portlet-mode> </supports> <portlet-info> <title>Hello World</title> <short-title>HelloWorld</short-title> </portlet-info> </portlet> </portlet-app> 12.12.3. Portlet Klasse package portlet; public class HelloWorldPortlet extends GenericPortlet { public void processAction(ActionRequest request, ActionResponse response) throws PortletException, IOException { String name = request.getParameter("name"); //Parameter für Formular bereitstellen (${param.name}) response.setRenderParameter("name", name); } protected void doView(RenderRequest req, RenderResponse res) throws PortletException, IOException { String page; if (req.getParameter("name") == null) { page = "/form.jsp"; } else { page = "/hello.jsp"; } getPortletContext().getRequestDispatcher(page).include(req, res); } } 12.12.4. Formular-Seite (Form.jsp) <?xml version="1.0" encoding="utf-8"?> <jsp:root xmlns="http://www.w3.org/1999/xhtml" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:portlet="http://java.sun.com/portlet" version="2.0"> <portlet:actionURL var="actionUrl" /> <form method="post" action="${actionUrl}"> Ihr Name: <input type="text" name="name" size="30" value="" /> <input type="submit" value="Eintragen" /> </form> <portlet:renderURL var="renderUrl" /> </jsp:root> Kälin Thomas, Abt I 82/96 17.12.2007 Internettechnologien 12.12.5. Ausgabe-Seite (Hello.jsp) <?xml version="1.0" encoding="utf-8"?> <jsp:root xmlns="http://www.w3.org/1999/xhtml" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:portlet="http://java.sun.com/portlet" version="2.0"> <p>Hello ${param.name}.</p> <a href="${renderURL}">Zurück</a> </jsp:root> Kälin Thomas, Abt I 83/96 17.12.2007 Internettechnologien 13. RUBY ON RAILS 13.1. Ruby - Grundlagen 13.1.1. Einleitung Ruby ist eine objekt-orientierte Skriptsprache welche interpretiert wird. Es ist, grob gesagt, mächtiger als Perl. Nachfolgend werden nur die wichtigsten Sprachelemente erläutert. Im Skript selber befinden sich noch mehr, aber mit den folgenden Elementen sollte das meiste machbar sein. 13.1.2. Klasse class HelloWorld @@world = 'World' WORLD_CONSTANT = 'Hello World' #Klassenvariable #Konstante def initialize(greeting="Hi") @greeting = greeting end #Konstruktor #Instanzvariable def salute(name) puts "#{@greeting} #{name}!" end #Methode mit Parameter def to_s puts "#{@greeting} #{@@world}!" end end #toString()-Methode myClass = HelloWorld.new("Hello") myClass.salute("World") puts myClass puts HelloWorld::WORLD_CONSTANT #Instanzieren #Ausgabe: Hello World! #Ausgabe: Hello World! #Ausgabe: Hello World! 13.1.3. Setter / Getter class Coordinate attr_accessor :x end class Coordinate def x=(newx) @x = newx end def x @x end end c = Coordinate.new c.x = 42 puts c.x 13.1.4. Module module Math PI = 3.1415 #Konstante def calc_area(r) r * r * PI end end #Statische Methode include Math puts calc_area(2) #Modul einbinden #Methode aufrufen Kälin Thomas, Abt I 84/96 17.12.2007 Internettechnologien 13.1.5. Array arr = [1, 'hi', 3.14, 4] puts a[2] a.reverse #Array erstellen #3.14 #Array umdrehen 13.1.6. Hash hash = { :water => 'wet', :fire => 'hot' } puts hash[:water] #Hashmap erzeugen #Ausgabe: wet 13.1.7. IF - Else if 42 > 41 puts "bla" else puts "blubb" end 13.1.8. Switch case lang when /ruby/i … when /perl/i … else … end case number when 0: … when 1: … else … end 13.1.9. While / Until while i > 5 … end until i <= 5 … end 13.1.10. Exceptions begin raise IOError rescue IOError => ioe … ensure … End #try #throw #catch #finally 13.2. Rails – Einleitung 13.2.1. Grundlagen Rails ist ein Open-Source Web-Applikations-Framework, welches auf der MVC-Architektur basiert. Es ist vollständig in Ruby geschrieben und liegt momentan in der Version 1.2 vor (Dezember 2007). 13.2.2. Leitsätze RoR) richtet sich nach dem Leitspruch CONVENTION OVER CONFIGURATION. Das soll Ruby on Rails (=R sagen, dass RoR vieles per Konvention vorgibt. Gute Beispiele hierfür sind die Verzeichnisstruktur oder die Namenskonvention (Dateien und Datenbank). Der zweite grundlegende Leitsatz ist DON’T REPEAT YOURSELF. Es sollen soviel Code und Daten als möglich wieder verwendet werden können. Hier ist ein gutes Beispiel, dass Spalten in einer Datenbanktabelle beim zugehörigen Model-Objekt nicht erneut als Attribut definiert werden müssen – RoR macht das automatisch. 13.2.3. Merkmale Komplette MVC Lösung, in welcher alle Layer nahtlos zusammenarbeiten Ein eingebauter Webserver und Code-Generatoren erlauben schnelleres Entwickeln Eingebautes Test-Framework für Unit Tests, Functional Tests und Integration Tests. Kälin Thomas, Abt I 85/96 17.12.2007 Internettechnologien 13.3. Rails – Architektur 13.3.1. Ablauf beim Aufruf 13.3.2. Verzeichnisstruktur Über den Konsolenaufruf rails example kann ein neues Projekt mit dem Namen „example“ erstellt werden. Dieses besitzt eine vorgegebene Verzeichnisstruktur. Die wichtigsten Ordner und Files werden nachfolgend erklärt. 13.4. Rails – Routen Unter dem Routing wird im Kontext einer Railsanwendung das Umleiten der Benutzeranfragen an den richtigen Controller verstanden. Hierzu wird die angegebende URL anhand der in config/routes.rb festgelegten Regeln analysiert und ausgewertet. Sollte eine URL auf mehrere Reglen passen, wird die Regel verwendet, die zuerst in der Datei stehende Regel verwendet. Anfragen an Railsanwendungen haben typischerweise folgende Form: http://www.example.ch/store/add_to_cart/123 Diese URL wird anhand der in der Datei festgelegten Routen analysiert und weiter verarbeitet. Betrachtet man nun die oben beschriebene Anfrage, so wird diese anhand der map.connectAnweisung (ist in routes.rb definiert, hier nicht näher erläutert) folgendermassen ausgewertet werden: @params = { :controller :action :id => 'store', => 'add_to_cart', => 123 } Nach diesem Schritt lädt Rails den passenden Controller im Verzeichnis app/controllers, indem eine neue Instanz dieser Klasse erzeugt wird. 13.5. Rails – Controller Jeder Controller ist von ApplicationController (a app/controllers/application.rb) abgeleitet und enthält mehrere Actions, welche als öffentliche Methoden in der Klasse implementiert sind. Über die Controller werden der Applikationsfluss und die anzuzeigende View kontrolliert. Per Standard wird immer die View mit dem gleichen Namen wie der Controller angezeigt. Kälin Thomas, Abt I 86/96 17.12.2007 Internettechnologien 13.5.1. Einfaches Beispiel Nachfolgendes Beispiel zeigt den Controller mit dem Namen GuestbookController. Per Konvention lauten der Pfad und der Dateiname app/controllers/guestbook_controller.rb. Zu beachten ist hierbei der Name der Datei, welche mit „guestbook_“ beginnt. Dies muss so sein, da der Controller selber „GuestbookController“ heisst. Die zugehörige (standardmässige) View ist dabei app/views/guestbook/index.rhtml. class GuestbookController < ApplicationController def index @entries = Entries.find_all end end 13.5.2. Umleiten Zu Action: Zu URL: redirect_to :action => "show", :id => 1 redirect_to "/help/order_entry.html" 13.5.3. Cookies, Session & Flash cookies[:marsupial] = { :value :expires :path => "wombat", => 30.days.from_now, => "/store" } session[:user_id] = 1 flash[:notice] = "Das ist ein Beispieltext" Anmerkung: Ein Flash erlaubt die Kommunikation zwischen Actions über mehrere Requests und wird innerhalb der Session gespeichert. Per Default ist übrigens immer eine Session aktiv. 13.5.4. Filter Es sind Before-, After- und Around-Filter möglich. Die Namen sagen dabei jeweils aus, wann der jeweilige Filter aufgerufen wird. Filter sind dabei als Klasse, als Methode oder Block implementiertbar. Nachfolgedes Beispiel zeigt die Lösung über eine Klasse: class AuditFilter def self.filter(controller) … end end class SomeController < ApplicationController before_filter AuditFilter after_filter AuditFilter … End Filter, welche im ApplicationController, also der Basisklasse, implementiert sind wirken dabei applikationsweit in allen abgeleiteten Controllern. 13.6. Rails – View Nach der Standardinstallation unterstützt RoR drei Templattypen: rhtml, rxml und rjs. Beim ersten handelt sich dabei um eine Mischung von HTML mit eingebettem Ruby, was vergleichbar mit JSP ist. Beim zweiten wird eine Builder-Bibliothek zum DOM-artigen Erstellen von XML-Antworten eingesetzt. Und in der dritten Lösung wird über ein JS-Generator-Objekt JavaScript erzeugt. 13.6.1. ActionView - Beispiel Jegliche innerhalb des Controllers erstellten Instanzvariablen sind in der View verfügbar. Somit wird die Kommunikation zwischen Controller und View realisiert. Nachfolgendes Beispiel zeigt diese Verwendung: Kälin Thomas, Abt I 87/96 17.12.2007 Internettechnologien #Controller class ExampleController < ApplicationController def index @entries = Entries.find_all end end #View <h1>MyExample</h1> <% for e in @entries %> <p><%= e.name %>: <%= e.content %></p> <% end %> 13.6.2. Helpers Der Code innerhalb der View sollte sich auf die Präsentationslogik beschränken, um die strikte Trennung von MVC zu gewährleisten. Deshalb lagert RoR komplexere Logik in so genannte Helper aus. Bei diesen Helpern handelt es sich einfach um ein Ruby Modul, also eine abstrakte Klasse. Bei RoR ist es ausserdem so, dass jeder Controller sein eigenes Helper Modul besitzt, welches automatisch geladen wird. Nachfolgender Helper ist in app/helpers/example_helper.rb definiert. Auch hier ist ein Teil des ExampleController) festgelegt Namens wiederum durch den Klassennamen des Controllers (E worden. #Helper-Modul module ExampleHelper def page_title @page_title || "Example Title" end end #Zugriff in View <h1><%= page_title %></h1> Natürlich sind auch Helper für die komplette Applikation definierbar. Diese müssen dafür unter folgendem Pfad eingefügt werden: app/helpers/application_helper.rb. 13.6.3. Partials Häufig benutzte Template-Teile können in so genannte Partials ausgelagert werden. Diese liegen im normalen Views-Verzeichnis des zugehörigen Controllers. Per Konvention muss der Dateiname mit einem Underscore beginnen. #Datei: _article.html <h2><%= article.title %></h2> #Aufruf aus anderem Template <%= render :partial => "article", :object => @an_article %> #Aufruf aus anderem Template mit Collection <%= render :partial => "article", :collection => @many_articles %> 13.6.4. Layouts Über Layouts kann das Aussehen einer Anwendung vereinheitlicht werden. Dabei ist pro Controller ein eigenes Layout definiert. Dieses wird in app/views/layouts/example.rhtml definiert. Das Layout hat dabei auf dieselben Daten wie das Template Zugriff. 13.7. Rails – Model RoR macht für das Model ein automatisches Mapping zwischen Klassen und Tabellen einer Datenbank. Auch hier greifen wieder die Namenskonventionen. So wird zum Beispiel eine Klasse Product Kälin Thomas, Abt I 88/96 17.12.2007 Internettechnologien automatisch auf die Tabelle products (Mehrzahl, Kleinschreibung!) gemappt. Der PRIMÄRSCHLÜSSEL der Tabelle muss dabei id heissten, FREMDSCHLÜSSEL tragen den Singular der referenzierten Tabelle mit Ergänzung um das Postfix _id (Beispiel: product_id). 13.7.1. SQL-Befehle Rohes SQL ist zwar möglich, allerdings unnötig, da Ruby auch andere Möglichkeiten dafür bietet. #Query Product.find(:all, :conditions :order :limit => "name = 'Wii'", => "name", => 10) #Query mit Parameter Product.find(:all, :conditions :order :limit => ["name = ?", ParameterName], => "name", => 10) 13.7.2. CRUD #Einfügen newUser = User.new newUser.first_name = "Thomas" newUser.last_name = "Kaelin" newUser.save #Neue Klasse und Tupel #Speichern in Datenbank #Aktualisieren oldUser = User.find(1) oldUser.update_attributes(:first_name => "Tom") #Löschen oldUser = User.find(1) oldUser.destroy User.destroy_all #Alle löschen 13.7.3. Beziehungen (1:n) class Order < ActiveRecord::Base has_many :item … End class Item < ActiveRecord:Base belongs_to :order … end order = Order.new item = Item.new order.items << item order.save #Container #Element für Container #Element zu Container hinzufügen #Komplette Relation speichern 13.7.4. Migrations Die Datenbank wurde bislang ausserhalb des Versionssysttems definiert. Migrations löst dieses Problem, da nun Änderungen an der DB-Struktur auch versioniert werden. Die Migrationen befinden sich im Verzeichnis db/migrations. 13.7.5. Unterschiedliche Datenbanken Rails verwendet im üblichen Umfeld drei Datenbanken: development, test und production. 13.8. Rails – Testing In den Ordnern test/unit, test/function und test/integration befinden sich Unit-Tests, funktionale Tests und Integrationstests. Dabei ist nur der Integrationstest manuell zu erstellen, für die anderen beiden existieren Generatoren. Kälin Thomas, Abt I 89/96 17.12.2007 Internettechnologien 14. APPLETS 14.1. Was ist ein Applet? Applets sind Mini-Applikationen, die in WEB-Seiten eingebettet sind, das heisst die HTML-Seite wird mit einem speziellen Tag für das Applet versehen. Wird eine solche Seite durch einen Java-fähigen Browser von einem Webserver geladen und angezeigt, so holt der Browser den Bytecode für das Applet vom gleichen Webserver und bringt es auf der im Browser integrierten virtuellen Maschine zur Ausführung. 14.2. Einbindung in HTML 14.2.1. Vollständige Spezifikation <APPLET CODE = DateinameDesApplets WIDTH = BreiteInAnzahlPixel HEIGHT = HöheInAnzahlPixel [OBJECT = DateinameSerialisiertesAppletObjekt] [ARCHIVE = ListeVonJarDateien] [CODEBASE = URLdesApplets] [ALT = TextAnstelleApplet] [NAME = AppletName] [ALIGN = Ausrichtung] [VSPACE = VertikalerRandInPixels] [HSPACE = HorizontalerRandInPixels]> [<PARAM NAME = ParameterName1 VALUE = Wert1>] [<PARAM NAME = ParameterName2 VALUE = Wert2>] [Text für Browser ohne Applet-Unterstützung] </APPLET> ARCHIVE: Liste von Java Archiv Dateien. Werden gemeinsam geladen. OBJECT: Ersetzt das Code-Attribut. War ursprünglich für die Referenzierung von serialisierten AppletObjekten gedacht. 14.2.2. Beispiel <applet code=HelloWeb width=300 height=200> <param name=Param1 Value=Bla> </applet> 14.3. Beispiel eines Applets 14.3.1. Version 1 import java.awt.*; import java.applet.*; public class HelloWeb extends Applet { public void paint(Graphics g) { g.drawString("Hello World", 25, 25); } } 14.3.2. Version 2 import java.awt.*; import java.applet.*; public class HelloWeb extends Applet { public HelloWeb() { setLayout(new GridLayout()); add(new Label("Hello World", Label.CENTER)); setVisible(true); } } Kälin Thomas, Abt I 90/96 17.12.2007 Internettechnologien 14.4. Lebenszyklus public class SimpleApplet extends Applet { StringBuffer buffer = new StringBuffer(); void addItem(String newWord) { System.out.println(newWord); buffer.append(newWord); repaint(); } //Instanzieren des Applets (Seitenaufruf) public void init() { buffer = new StringBuffer(); addItem("initializing... "); } //Starten des Applets, erneutes Anzeigen des Applets public void start() { addItem("starting... "); } //Seite mit Applet wird verlassen public void stop() { addItem("stopping... "); } //Browser schliessen public void destroy() { addItem("preparing for unloading..."); } } 14.4.1. Anmerkung Ursprünglich war es so gedacht, dass beim Verlassen stop() und bei einem erneuten Betreten der Applet-Seite start() aufgerufen werden. Das Java Plug-In ruft allerdings destroy() auf und beendet somit das Applet beim Verlassen der Seite. Folglich muss es anschliessend erneut initialisiert werden. 14.5. Sicherheit 14.5.1. Überwachung Jeder Java-fähige Browser hat einen Security-Manager (Objekt einer von der abstrakten Klasse SecurityManager abgeleiteten Klasse), mit welchem die eingestellten Sicherheitsbestimmungen überwacht werden. Wenn der Security-Manager zur Laufzeit eines Applets die Verletzung einer Sicherheitsbestimmung entdeckt, so signalisiert es eine SecurityException. 14.5.2. Einschränkungen Kein Lesen und Schreiben von Dateien auf dem Rechner, auf dem es ausgeführt wird. Kein Starten von Programmen auf dem Rechner, auf dem es ausgeführt wird. Kein Aufbauen von Netzwerkverbindungen, ausser zum Rechner, von dem das Applet geladen wurde. Keine Verwendung von native-Methoden. 14.5.3. Trusted Applets Mit dem JDK 1.1 wurden Trusted-Applets eingeführt, ist der Code mit einer bestimmten digitalen Unterschrift versehen, so hat er die gleichen Rechte wie lokaler Code. Kälin Thomas, Abt I 91/96 17.12.2007 Internettechnologien 14.6. User Interfaces für Applets 14.6.1. Besonderheiten Jedes Applet ist ein Panel, welches weitere Elemente enthalten kann. Das Standardlayout ist das BorderLayout. Applets haben standardmässig einen grauen Hintergrund. Daher muss die Hintergrundfarbe oft an die HTML-Seite angepasst werden. Die Grösse der Applets ist durch den HTML-Tag vorgegeben Laden über Netzwerk ist langsam. Deshalbt sollten grosse Datenmengen über einen Hintergrundthread vorbeitend geladen werden („Preloader“). 14.7. Übliche Applet-Funktionen 14.7.1. Übliche Funktionen Aufbauen einer Netzwerkverbindung zum Rechner, von dem das Applet geladen wurde. Einfaches Laden von HTML-Seiten. Kommunikation mit anderen Applets auf der gleichen HTML-Seite Abspielen von Sound 14.7.2. Abspielen von Tonsequenzen //Laden von Tonsequenzen (AIFF, AU oder WAV) AudioClip myAudio = getAudioClip(URL); //Abspielen von Tonsequenzen, zuerst Endlos anschliessend einmalig myAudio.loop(); myAudio.stop(); myAudio.play(); myAudio.stop(); 14.7.3. Darstellen von Bildern //Bilder laden Image image1 = Image image2 = Image image3 = (GIF oder JPEG) getImage(getCodeBase(), "imageFile.gif"); getImage(getDocumentBase(), "anImageFile.jpeg"); getImage(new URL("http://www.foo.com/people.gif")); //Bild zeichnen über Graphics-Objekt von paint()-Methode //Achtung: drawImage() macht ein sofortiges Return aus der paint()-Methode! int intX = 20, intY = 20; g.drawImage(image1, intX, intY, this); 14.8. Threads und Applets Viele Browser starten jedes Applet in einem eigenen Thread. Dies ist aber nicht garantiert. Zeitaufwändige Aufgaben sollten immer in einen vom Applet erzeugten separaten Thread ausgelagert werden. 14.9. Kommunikation mit anderen Programmen 14.9.1. Browser Mit der Appletmethode getParameter(einParameterName) Appletparameters als String in das Applet übernommen werden. kann der Wert eines //HTML-Tag <applet code="MyApplet.class" width=300 height=200> <param name="foreground" value="0000FF"> </applet> //Applet-Code String value = this.getParameter("foreground"); Weiter kann das Applet verschiedene andere Informationen vom Browser anfragen: Kälin Thomas, Abt I 92/96 17.12.2007 Internettechnologien public URL getCodeBase(); //Wo wurde das Applet geladen public URL getDocumentBase(); //HTML-Seite, welches das App. Enthält public void showStatus(String msg); //Nachricht für Statuszeile in Browser Weiter kann über getAppletContext() ein Objekt geholt werden, mit welchem verschiedene Befehle an den Browser gesendet werden können. AppletContext appContext = getAppletContext(); appContext.getApplect(String name); //Applet in Seite suchen appContext.getApplets(); //Alle Applets in Seite abrufen appContext.showDocument(URL url); //Umleitung nach Seite 14.9.2. Andere Applets Über obige Methoden können auf public-Methoden eines anderen Applets auf der gleichen HTML-Seite zugegriffen werden. 14.9.3. Netzwerkverbindungen Ein Applet kann eine Netzwerkverbindung zum Rechner aufbauen, von dem es geladen wurde, also genauer gesagt zum Webserver. 14.9.4. Javascript (DOM) Das Java Plug-in erlaubt den Zugriff auf das im Browser dargestellte Dokument (in der Regel HTML) via DOM (Document Object Model). Der direkte Zugriff aus Java auf das DOM erfolgt über das COMMON DOM API. Hier geht es um den Zugriff auf JavaScript (LIVECONNECT JSOBJECT) und damit auch um eine indirekte Möglichkeit auf das DOM zuzugreifen, denn der Zugriff auf das DOM via JavaScript wurde bereits ausführlich behandelt. //Import für LiveConnect-Object import netscape.javascript.*; //Zugriff auf DOM JSObject win = JSObject.getWindow(this); JSObject doc = (JSObject) win.getMember("document"); JSObject loc = (JSObject) doc.getMember("location"); Aus Sicherheitsgründen ist die Unterstützung für JavaScript per Default ausgeschaltet. Um sie zu aktivieren, muss das Attribut MAYSCRIPT im Applet-Tag verwendet werden: <applet code="…" width=10 height=10 MAYSCRIPT>…</applet> Kälin Thomas, Abt I 93/96 17.12.2007 Internettechnologien 15. JAVA WEB START UND JNLP 15.1. Applets Ursprünglich hat Java mit der Möglichkeit, Code von einem Web-Server zu herunterzuladen und auf dem Client in Form von Applets auszuführen, grosse Aufmerksamkeit auf sich gezogen. Diese Technologie hat sich aber nicht im erwarteten Masse durchgesetzt. Die Gründe sind: INKOMPATIBILITÄTEN: durch Browser-abhängige Java Versionen DOWNLOAD-ZEITEN: Applet muss bei jeder Verwendung neu heruntergeladen werden EINSCHRÄNKUNGEN: aus Sicherheitgründen PERFORMANZ 15.2. Java Web Start und JNLP 15.2.1. Funktionsweise Mit dem JAVA NETWORK LAUNCHING PROTOCOL (J JNLP) und mit der Referenzimplementation JAVA WEB START (J JWS) ein neuer Anlauf unternommen, eine Lösung für über das Internet geladenen Code zu finden. Mit JWS können Java-Anwendungen über einen Link in einer Web-Seite gestartet werden. Der erstmalige Installationsvorgang läuft automatisch ab. Bei einem zweiten Start wird geprüft, ob eine neuere Version auf dem Internet verfügbar ist und diese heruntergeladen und gestartet, sonst wird mit der bereits heruntergeladenen Version gearbeitet. Applikationen, können auch offline (bei Windows über ein Desktop-Symbol) gestartet werden. 15.2.2. Sicherheit Per Default laufen JWS-Anwendungn in einer Sandbox. Mit speziellen JNLP-Diensten (J JNLPServices) kann eine JWS-Applikation einige zusätzliche Dinge tun. Diese bedürfen aber der ausdrücklichen Zustimmung durch den Benutzer. Braucht eine JWS-Anwendung mehr Rechte, so muss sie mit einer digitalen Unterschrift versehen sein und der Benutzer muss beim ersten Start die Zustimmung geben, dass er dieser Unterschrift vertraut und die geforderten Rechte zubilligt. 15.2.3. Anforderungen Ab J2SE 5.0 ist alles in der Standard Edition integriert. 15.3. Architektur Links auf JWS-Applikationen zeigen auf eine Datei mit der Extension .jnlp. Der Web-Server verknüpft mit dieser Extension einen Mime-Typ application/x-java-jnlp-file. Diese Datei ist eine XML-Konfigurationsdatei. Der Browser startet den JWS-Applikationsmanager bzw. das Java Control Panel, welche mit dem Mime-Typ application/x-java-jnlp-file verknüpft sind und übergibt ihnen die Konfigurationsdatei. 15.4. JNLP Datei Im RESOURCES-Tag können die jar-Dateien der Applikation spezifiziert werden und es kann der erforderliche JDK festgelegt werden. Der APPLICATION-DESC-Tag element ernthält alle notwendigen Information, um die Applikation zu starten. Dazu gehören die Angabe der Klasse mit dem main() und allfällige Parameter für die Applikation. <jnlp Kälin Thomas, Abt I spec="0.2 1.0" codebase="http://java.sun.com/products/javawebstart/apps" href="swingset2.jnlp"> 94/96 17.12.2007 Internettechnologien <information> <title>SwingSet2 App</title> <vendor>Sun Microsystems, Inc</vendor> <homepage href="http://java.sun.com/products/javawebstart/demos.html"/> <description>SwingSet2 Demo Description</description> <description kind="short">SwingSet2 Demo Short Description</description> <icon href="images/swingset2.small.jpg"/> <offline-allowed/> </information> <resources> <j2se version="1.3+" href="http://java.sun.com/products/autodl/j2se"/> <jar href="swingset2.jar" main="true" download="eager"/> </resources> <application-desc main-class="SwingSet2"/> </jnlp> 15.5. Security Per Default laufen JWS-Applikationen in einer ähnlich restriktiven Sandbox wie Applets. Allerdings hat eine JWS-Applikation über SERVICES einen eingeschränkten und vom Benutzer voll kontrollierten Zugriff auf die Systemumgebung. Java Web Start erlaubt, jar-Dateien zu signieren. Vertraut der Benutzer den Zertifikaten mit denen die Echtheit des Codes verifiziert wurde, so haben diese Applikationen erweiterte Zugriffsrechte, wie sie in der JNLP-Datei spezifiziert wurden. 15.6. JNLP API Über das JNLP-API können Applikationen nach dem Container-Konzept auf Services ihrer Umgebung zugreifen. Eine Applikation muss dieses API nur verwenden, wenn sie von diesen Services Gebrauch machen will. Der Zugriff auf die verschiedenen Services erfolgt über die statischen Methoden der Klasse javax.jnlp.ServiceManager: BasicService bs; bs = (BasicService) ServiceManager.lookup("javax.jnlp.BasicService"); 15.6.1. BasicService Über den BasicService erhält man Informationen über die Umgebung der Applikation. URL getCodeBase() boolean isOffline() boolean isWebBrowserSupported() boolean showDocument(URL url) //gibt Ursprungsort des Codes //Offline-Arbeit? //Browser unterstützt? //Umleitung auf URL 15.6.2. DownloadService Der DownloadService gibt der Applikation Kontrolle über Download und Caching ihrer Ressourcen. 15.6.3. FileOpenService und FileSaveService Der FileOpenService erlaubt dem Benutzer Dateien auf der lokalen Harddisk zu öffnen und zu speichern. Dabei wird ein FileContents Objekt verwendet. FileContents ist ein Mediator für File, verbirgt aber aus Sicherheitsgründen die Pfadangaben vor der Applikation. // Datei aussuchen FileOpenService fo; fo = (FileOpenService) ServiceManager.lookup("javax.jnlp.FileOpenService"); FileContents fc = fo.openFileDialog(null, null); Kälin Thomas, Abt I 95/96 17.12.2007 Internettechnologien // Datei abspeichern FileSaveService fs; fs = (FileSaveService) ServiceManager.lookup("javax.jnlp.FileSaveService"); fss.saveFileDialog(null, null, fc); 15.6.4. ClipBoardService Zum Verwenden des System-weiten Clip-Boards. 15.6.5. PrintService Um das Java Print-Api anzusprechen, kann der PrintService verwendet werden. 15.6.6. PersistenceService Über den PersistenceService kann die Applikation ähnlich wie bei HTTP-Cookies Informationen lokal an einer vordefinierten Stelle ablegen. Dabei wird eine URL angegeben, welcher der Codebasis entspricht. Dieser Mechanismus ist dafür gedacht, Daten, die sich auf dem Server befinden, lokal in einem Cache zu halten für schnelleren Zugriff und Offline-Betrieb. Kälin Thomas, Abt I 96/96 17.12.2007