AVID Übung1 XML, Servlets, ... Andreas I. Schmied (schmied@inf...) Abteilung Verteilte Systeme Universität Ulm SS2005 Übersicht Und nun. . . 1 Übersicht Semesterthema Konzept Literatur Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 2 / 74 Übersicht Semesterthema Übersicht – Semesterthema Kalender im Web“ ” Verteilung der Kalenderdienste auf mehrere Rechner Aggregationsdienst über mehrere Kalender Vorgehen schrittweise verfeinert mit verschiedenen Techniken implementiert verschiedene Plattformen“ ” Inhalte z.T. auch in VL Web-Engineering (MI, zuletzt WS2004) Übung ist prüfungsrelevant! Quellcodes sind meist nicht Java-konform gekürzt und nicht direkt übersetzbar Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 3 / 74 Übersicht Konzept Übersicht – Konzept Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 4 / 74 Übersicht Literatur Übersicht – Literatur Sun: J2EE-TutorialVersion1.4 Kapitelauswahl 2, 4-7, B – XML-Grundlagen 11-13 – Servlets, JSP 14-16 – TagLibs, Scripting 17-21 – JavaServer Faces 22 – i18n, l10n Spezifikationen zu Servlets, JSP, J2EE Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 5 / 74 XML Und nun. . . 2 XML SAX DOM-API JDOM, dom4j, StAX Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 6 / 74 XML XML – Relevante XML-Sprachen (X)HTML (, SVG, DocBook, XSL-FO ) XPath (, XPointer, XLink, XInclude ) Navigation/Datenextraktion in XML-Dokumenten XML-Schema (, RelaxNG, DTD, Schematron) http://www.w3.org/TR/xmlschema-0/ http://www.xfront.com/BestPracticesHomepage.html XSLT Transformation von XML nach XML/HTML/Text/... Literatur (Referenzen, Tutorials, Vergleiche) http://www.zvon.org http://www.w3schools.com Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 7 / 74 XML XML – XML-APIs für Java Konzept herstellerunabhängige Schnittstelle beliebige Implementierung Auswahl zur Laufzeit: System Properties + Factories Packages: javax.xml, org.xml, org.w3c DOM-Parser: Baum von Elementen des Dokuments sprachunabhängiges Document Object Model SAX-Parser: Stream Pushing Simple API for XML StAX-Parser: Stream Pulling JDOM-Parser: DOM à la Java aktueller Parser im Java SDK: Apache-Xerces http://xml.apache.org/xerces2-j http: //java.sun.com/j2se/1.5.0/docs/guide/standards Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 8 / 74 XML SAX SAX – Grundlagen Event-Driven Parsing Push von Elementen“ des Dokuments an Handler ” zustandsloser Stream ohne Navigationsmöglichkeit Vorgehen SAXParserFactory erzeugt SAXParser (package javax.xml.parsers) dessen SAXReader ruft diverse Handler auf ContentHandler, ErrorHandler, DTDHandler, EntityResolver, ... eigenen von DefaultHandler ableiten und ergänzen Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 9 / 74 XML SAX SAX – Programmierung DefaultHandler ableiten ggf. weitere Handler für CDATA, DTD-Elemente, ... Factory, Parser initialisieren und starten ggf. validierendes Parsen, Namespace-Awareness konfigurieren Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 10 / 74 XML SAX SAX – Handler implementieren, parsen 1 2 3 4 5 public { void void void startDocument ( ) throws SAXException { . . . } endDocument ( ) . . . s t a r t E l e m e n t ( S t r i n g namespaceURI , S t r i n g sName , S t r i n g qName, Attributes attrs ) . . . void endElement ( S t r i n g namespaceURI , S t r i n g sName , S t r i n g qName) . . . void c h a r a c t e r s ( char [ ] buf , i n t o f f s e t , i n t l e n ) . . . ... void i g n o r a b l e W h i t e s p a c e ( char [ ] buf , i n t o f f s e t , i n t l e n ) . . . void p r o c e s s i n g I n s t r u c t i o n ( S t r i n g t a r g e t , S t r i n g data ) . . . void setDocumentLocator ( Locator l ) . . . ... void warning ( SAXParseException e ) . . . void e r r o r ( SAXParseException e ) . . . 6 7 8 9 10 11 12 13 14 15 16 17 18 class MyHandler extends D e f a u l t H a n d l e r } Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 12 / 74 XML SAX SAX – Einstellungen für validierendes Parsen 1 2 3 4 5 6 7 f a c t o r y . s e t V a l i d a t i n g ( true ) ; f a c t o r y . setNamespaceAware ( t r u e ) ; ... S t r i n g JAXP SCHEMA LANGUAGE = ” h t t p : / / j a v a . sun . com / xml / j a x p / p r o p e r t i e s / schemaLanguage ” ; S t r i n g W3C XML SCHEMA = ” h t t p : / / www. w3 . org / 2 0 0 1 /XMLSchema ” ; p a r s e r . s e t P r o p e r t y (JAXP SCHEMA LANGUAGE, W3C XML SCHEMA ) ; 8 9 10 11 12 / / e v t l . b e i altem Xerces factory . setAttribute ( ” h t t p : / / apache . org / xml / f e a t u r e s / v a l i d a t i o n / schema ” , new Boolean ( t r u e ) ) ; 13 14 15 16 factory . setAttribute ( ” h t t p : / / apache . org / xml / f e a t u r e s / v a l i d a t i o n / schema−f u l l −checking ” , new Boolean ( t r u e ) ) ; Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 14 / 74 XML DOM-API DOM-API – Grundlagen Parsing läuft automatisch durch und erzeugt DOM-Baum Navigation auf Dokumentbaum von mäßig getypten Knoten sprachunabhängige API alles ist ein Knoten (Element, Attribut, Text, ...) schwerfällig, nicht Java-SDK-alike“ ” getElementsByTagName() ist transitiv, nicht auf direkte Subknoten beschränkt getChildNodes() liefert alle Subknoten, nicht nur Subelemente nervig: getNodeType()==Node.ELEMENT NODE 1 2 3 4 5 6 7 8 Node c h i l d = data . g e t F i r s t C h i l d ( ) ; while ( c h i l d ! = n u l l ) { i f ( c h i l d . getNodeType ( ) == Node . ELEMENT NODE) { Element e = ( Element ) c h i l d ; . . . } else . . . child = child . getNextSibling ( ) ; } Alternativen: dom4j, JDOM (s.u.) Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 16 / 74 XML DOM-API DOM-API – Vorgehen DocumentBuilderFactory erzeugt DocumentBuilder Document per newDocument() oder Parsing erzeugen Root-Element: Document.getDocumentElement() Node-API mit nodeValue(), nodeType(), nodeName() Beispiel: <e>bla<e> <e>: nodeType()=”e”, nodeValue()=null bla: nodeType()=”#text”, nodeValue()=”bla” Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 18 / 74 XML DOM-API DOM-API – Parsen 1 2 3 DocumentBuilderFactory f a c t o r y ; DocumentBuilder builder ; Document doc ; 4 5 6 f a c t o r y = DocumentBuilderFactory . newInstance ( ) ; / / E i n s t e l l u n g e n zum V a l i d i e r e n / Namespaces analog zu SAX 7 8 9 b u i l d e r = f a c t o r y . newDocumentBuilder ( ) ; b u i l d e r . s e t E r r o r H a n d l e r (new org . xml . sax . E r r o r H a n d l e r ( ) { . . . } ) ; 10 11 doc = b u i l d e r . parse ( new F i l e ( ” data . xml ” ) ) ; Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 20 / 74 XML DOM-API DOM-API – Methoden (Auswahl) org.w3c.dom.Node appendChild, removeChild, getTextContent, getParentNode, getOwnerDocument, getNodeName/Type/Value, get/hasAttributes, getFirst/LastChild, getNextSibling, getChildNodes org.w3c.dom.Document getDocumentElement, createAttribute, createElement, createTextNode, getElementsByTagName Ableitungen: org.w3c.dom.Element, .Attr, .Comment, .Text, ... Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 21 / 74 XML JDOM, dom4j, StAX JDOM, dom4j, StAX – JDOM Packages org.jdom.** von http://www.jdom.org nutzt SAX/DOM-Parser, z.B. via org.jdom.input.SAXBuilder konkrete Klassen anstatt Interfaces Java-OOP DOM-Zugriff eher für XML-Daten als für Mixed-Content JSR-102 javax.xml.tree analoge Methoden zum Manipulieren, Validieren Alternative dom4j schneller/kleiner auf Interfaces aufbauende Implementierung schnelle Traversierung großer Dokumente XPath-Integration Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 22 / 74 XML JDOM, dom4j, StAX JDOM, dom4j, StAX – JDOM-Beispiel 1 SAXBuilder b u i l d e r = new SAXBuilder ( t r u e ) ; 2 3 4 Document doc = b u i l d e r . b u i l d ( ” data . xml ” ) ; Element r o o t = doc . getRootElement ( ) ; 5 6 7 8 9 10 p r i n t l n ( ” Element : ” + r o o t . getName ( ) ) ; for ( A t t r i b u t e a : root . g e t A t t r i b u t e s ( ) ) p r i n t l n ( ”− A t t r i b u t e ” +a . getName ( ) + ” = ” +a . getValue ( ) ) ; f o r ( Element e : r o o t . g e t C h i l d r e n ( ) ) p r i n t l n ( ”− Element ” +e . getName ( ) ) ; Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 24 / 74 XML JDOM, dom4j, StAX JDOM, dom4j, StAX – XML-Pull-Parsing lt. JSR-173 javax.xml.stream 1 2 3 4 URL u = new URL( ” data . xml ” ) ; InputStream i n = u . openStream ( ) ; XMLInputFactory f a c t o r y = XMLInputFactory . newInstance ( ) ; XMLStreamReader p a r s e r = f a c t o r y . createXMLStreamReader ( i n ) ; 5 6 7 8 9 10 11 12 13 14 15 16 f o r ( i n t event = p a r s e r . n e x t ( ) ; event ! = XMLStreamConstants .END DOCUMENT; event = p a r s e r . n e x t ( ) ) { switch ( event ) { case XMLStreamConstants . START ELEMENT : case XMLStreamConstants . END ELEMENT : p a r s e r . getLocalName ( ) ; break ; case XMLStreamConstants .CDATA: case XMLStreamConstants .CHARACTERS: p a r s e r . g e t T e x t ( ) ; break ; } } parser . close ( ) ; Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 26 / 74 CGI Und nun. . . 3 CGI Motivation, Vorgehen Beispiele Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 27 / 74 CGI Motivation, Vorgehen CGI – Motivation, Vorgehen Dokumente mit dynamisch generierten Inhalten Verfahren zur Parameterübergabe festgelegt Common Gateway Interface Interoperabilität zw. Skripten und div. HTTP-Servern Parameter in Query-String oder als Stream in Request-Body HTTP-Server startet pro Request externen Prozess Skript-Interpreter, z.B. PHP, Perl, ... optimierbar mit Interpretern als Servermodule optimierbar durch Kommunikation zwischen HTTP- und CGI-Serverprozess Request-überdauernd Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 28 / 74 CGI Beispiele Beispiele – CGI-Skript in Perl (gekürzt) 1 # ! / u s r / b i n / p e r l −w 2 3 4 5 use s t r i c t ; use CGI qw ( : s t a n d a r d ) ; use CGI : : Carp qw( f a t a l s T o B r o w s e r ) ; 6 7 my $q = new CGI ; 8 9 10 p r i n t ” Content−Type : t e x t / h t m l \n ” ; p r i n t ” \n ” ; # EOH 11 12 p r i n t ”<html> <head><t i t l e >Test </ t i t l e ></head> <body>\n ” ; 13 14 15 16 17 print print print print ”<p>param : ” , j o i n ( ” , ” , $q−>param ( ) ) , ” </p>\n ” ; ”<p>header : ” , j o i n ( ” , ” , $q−>header ( ) ) , ” </p>\n ” ; ”<p>s e l f u r l : ” , j o i n ( ” , ” , $q−>s e l f u r l ( ) ) , ” </p>\n ” ; ”<p>q u e r y s t r i n g : ” , j o i n ( ” , ” , $q−>q u e r y s t r i n g ( ) ) , ” </p>\n ” ; 18 19 20 21 p r i n t ”<p>environment : \ n ” ; f o r $ ( keys(%ENV ) ) { p r i n t ”<br> p r i n t ” </p>\n ” ; $ = ” . $ENV{ $ } . ” \n ” ; } 22 23 p r i n t ” </body></html >\n ” ; Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 30 / 74 CGI Beispiele Beispiele – GET-Response (gekürzt) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 param : field , action header : Content−Type : t e x t / h t m l ; c h a r s e t =ISO−8859−1 s e l f u r l : h t t p : / / myhost . sw / t e s t . p l ? f i e l d = h e l l o%20w o r l d ; a c t i o n = n i x q u e r y s t r i n g : f i e l d = h e l l o%20w o r l d ; a c t i o n = n i x environment : QUERY STRING = f i e l d = h e l l o%20w o r l d&a c t i o n = n i x SERVER ADDR = 1 3 4 . 6 0 . . . SERVER PROTOCOL = HTTP / 1 . 1 REMOTE PORT = 33794 HTTP USER AGENT = Opera / 8 . 0 ( X11 ; L i n u x i 6 8 6 ; U ; en ) GATEWAY INTERFACE = CGI / 1 . 1 HTTP HOST = myhost . sw SCRIPT URI = h t t p : / / myhost . sw / t e s t . p l REMOTE USER = . . . REMOTE ADDR = 1 3 4 . 6 0 . . . SCRIPT URL = / t e s t . p l SERVER NAME = myhost . sw REQUEST URI = / t e s t . p l ? f i e l d = h e l l o%20w o r l d&a c t i o n = n i x UNIQUE ID = QmzSD4Y8TUsAACgz9eY HTTP COOKIE = phpbb2mysql data=a%3A0%3A%7B%7D REQUEST METHOD = GET AUTH TYPE = Basic SERVER PORT = 80 Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 32 / 74 Servlets Und nun. . . 4 Servlets Request, Response Modularisierung Sitzungsmanagement Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 33 / 74 Servlets Servlets – Ziele (Servlet Version 2.4) plattformunabhängig bzgl. JVM skalierbarer und performanter als CGI Implementierung vs. Deployment Deployment Descriptor (+J2EE-Tools) Modularisierung, Rollentrennung GUI Workflow, Storylines Geschäftsmethoden Objekt-relationale Abbildung Datenzugriff (z.B. abstrakte DB-API) Datenhaltung (z.B. konkrete Datenbank) Basisklasse javax.servlet.GenericServlet HTTP-Adapter javax.servlet.http.HttpServlet Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 34 / 74 Servlets Servlets – Einfaches Beispiel-Servlet 1 public class MyServlet extends H t t p S e r v l e t { 2 public void doGet ( H t t p S e r v l e t R e q u e s t request , HttpServletResponse throws S e r v l e t E x c e p t i o n , IOException { 3 4 5 response . setContentType ( ” t e x t / h t m l ” ) ; response . s e t B u f f e r S i z e ( 8 1 9 2 ) ; P r i n t W r i t e r o u t = response . g e t W r i t e r ( ) ; 6 7 8 9 o u t . p r i n t l n ( ”<html > . . . ” ) ; out . close ( ) ; 10 11 } 12 13 } Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 36 / 74 Servlets Servlets – Life Cycle Servlet Klasse laden, Instanz erzeugen init() bzw. UnavailableException service() bzw. doPost()/doGet() auf MT-Safety achten, Servlets sind reentrant Requests auslesen, Response Header + Body schreiben Langlaufende Requests gesondert behandeln destroy() diverse Listener zentrale Fehlerseiten, Filter Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 37 / 74 Servlets Request, Response Servlets – Request, Response Requests getReader(), getInputStream() HttpServletRequest-URI CGI-Format: http : // host:port /requestpath?querystring Parameter in GET-URL kodiert oder als POST-Datenstrom Zugriff: getParameter(name) Kontextdaten über Sitzungsmanagement Response getWriter(), getOutputStream() setContentType(’text/html’) oder anderen MIME-Type setBufferSize(int) verhindert Teildokument bei Fehler Status Code, Cookies, ... setzen ggf. Weiterleitung, Import der Ausgaben von Sub-Servlets close() für EndOfRequest Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 39 / 74 Servlets Modularisierung Modularisierung – Filter: Konzept javax.servlet.Filter, .FilterChain, .FilterConfig Manipulieren und Abfangen von Requests/Responses Erkennen neuer Sessions, Server/Application-Start/Shutdown, ... Nebeneffekte auslösen Logging, Authentication, Transformation, De/Encryption Filter-Impl. möglichst ohne Abhängigkeiten zu anderen Webdiensten im Deployment Descriptor eingereiht Filter benennen Wirkungstrigger festlegen REQUEST, FORWARD, INCLUDE, ERROR Wirkungsbereich festlegen: welche Servlets Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 40 / 74 Servlets Modularisierung Modularisierung – Filter: Implementierung Life Cycle init() ... doFilter(Request, Result) wird aufgerufen, ggf. Manipulationen Verkettung mit FilterChain.doFilter(...) destroy() ... Response manipulieren Stream-Double an Chain weiterleiten dessen close()-Effekt verhindern ServletRequest/ResponseWrapper(...) Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 41 / 74 Servlets Modularisierung Modularisierung – Dispatching, Forwarding, Inclusion Szenario: ein öffentlich sichtbares Servlet mit Parameter action=... Vorteil: zentrales URL-Management Weiterleitung pro Action an interne Worker-Servlets/JSPs Szenario: wiederverwendbare Fragmente der Ausgabe Titel, Fuß-/Kopfzeile, Navigation, ... Szenario: Weiterleitung, z.B. von intern agierendem Servlet an Ausgabe-JSP getRequestDispatcher(URL) include(Request, Response) ohne Manipulation am Header forward(Request, Response) nur vor erster Manipulation möglich Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 42 / 74 Servlets Sitzungsmanagement Sitzungsmanagement – Allgemeines HTTP zustandslos! Zustand z.B. Login, Einkaufskorb mehrere Varianten für Zustandssicherung Cookies, versteckte Formularfelder, URL-Decorating/Rewriting abstrahiert: Servlets suchen optimale von Browser/User unterstützte Variante aus Listener für beliebige Zustandsänderungen Begin/Ende, Modifikation von Attributen Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 43 / 74 Servlets Sitzungsmanagement Sitzungsmanagement – Scope/Context-Objekte Information Sharing zwischen Servlets Zustandsdaten für Applikation, Session, Request, ... ServletContext, HttpSession, ServletRequest, ... z.B. Einkaufskorb: HttpSession.setAttribute( ” cart ” , new ShoppingCart()) Koordinierung reentranter Servlet-Threads notwendig! Bootstrapping ServletContextListener global anmelden (Deployment Descriptor) bei Erzeugung eines Servlet vor dessen init() benachrichtigt Daten in ServletContext vor-initialisieren Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 45 / 74 Servlets Sitzungsmanagement Sitzungsmanagement – Logout, Linking Logout Timeout für Session konfigurieren Session.invalidate() Besonderheit: Links eigene Links ggf. mit Session-ID versehen sonst springen“ Links aus dem Session-Context ” Response.encodeURL() ” ; jsessionid=c0o7fszeb1” wird an alle Links angehängt, oder ID in Cookies Client-seitig gespeichert, falls zulässig Outgoing Links ohne Zustandsmarkierung Session bleibt hängen bis zum Timeout! Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 47 / 74 Exkurs Java Beans Und nun. . . 5 Exkurs Java Beans Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 48 / 74 Exkurs Java Beans Exkurs Java Beans nicht verwechseln mit Enterprise Java Beans Ziel: auf Objekt-Properties generisch zugreifen in JSP deklarativ ohne Java-Code, in graphischem Editor, ... strikte Regeln read-only Accessor: PropertyType getProperty(); optional Mutator: void setProperty(PropertyType value); Default Constructor: public void BeanType() aus getMyData() wird Property myData Erweiterungen: java.beans.PropertyEditor, ... Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 49 / 74 JSP Und nun. . . 6 JSP Life Cycle, Inhalt erzeugen Expression Language (EL) Beans Modularisierung, Wiederverwendung Klassische JSP vs. XML Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 50 / 74 JSP JSP – Ziele (JSP Version 2.0) Rollentrennung Doc-Author/Designer vs. Programmierer Inversion der Servlets Textdokument durch Kommandos und Servletfragmente angereichert Forwarding/Inclusion Zugriff auf Kontextdaten deklarativer Zugriff auf Beans Zusatzfunktionen (DB, ...) Kommandos klassisch: <%...%> XML-Variante <jsp:something>... File Extension .jsp, für Fragmenterzeuger .jspf Kurzreferenz Syntax-Card: http: //java.sun.com/products/jsp/docs.html#syntax Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 52 / 74 JSP JSP – Beispiel JSP-Seite (1) 1 2 3 4 <%@ page contentType= ” t e x t / h t m l ; c h a r s e t =UTF−8” %> <%@ t a g l i b u r i = ” h t t p : / / j a v a . sun . com / j s p / j s t l / core ” p r e f i x = ” c ” %> <%@ t a g l i b u r i = ” / f u n c t i o n s ” p r e f i x = ” f ” %> <% S t r i n g header= ” Caption ” ; %> 5 6 7 <h t m l> <head>< t i t l e>Example</ t i t l e></ head> <body> 8 9 <jsp:useBean i d = ” l o c a l e s ” scope= ” a p p l i c a t i o n ” c l a s s = ” mypkg . MyLocales ” / 10 11 <h1><%=header%></ h1> 12 13 14 <c : s e t v a r = ” l o c a l e S t r i n g ” v a l u e = ” ${param . l o c a l e } ” /> <c : s e t v a r = ” i s S e l e c t e d ” v a l u e = ” $ { ! empty s e l e c t e d L o c a l e S t r i n g } ” /> 15 16 <h2>L o c a l e :</ h2> 17 18 ... Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 54 / 74 JSP JSP – Beispiel JSP-Seite (2) 1 ... 2 3 4 5 6 7 <p> <c : f o r E a c h v a r = ” l o c a l e S t r i n g ” i t e m s = ” ${ l o c a l e s . localeNames } ” > l o c a l e ${ l o c a l e S t r i n g } , </ c : f o r E a c h> </ p> 8 9 10 11 12 <jsp:useBean i d = ” date ” c l a s s = ” mypkg . MyDate ” /> <j s p : s e t P r o p e r t y name= ” date ” p r o p e r t y = ” l o c a l e ” v a l u e = ” ${ l o c a l e s . s e l e c t e d L o c a l e } ” /> <p>D a t e : ${ date . date }</ p> 13 14 15 </ body> </ h t m l> Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 56 / 74 JSP Life Cycle, Inhalt erzeugen JSP – Life Cycle, Inhalt erzeugen Life Cycle Prüfung, ob Servlet im Cache älter als JSP ggf. Transformation in Servlet und Übersetzung Compilerfehler werden ggf. erst bei erster Nutzung erkannt! jspInit () ... jspService() ... jspDestroy() zentrale Fehlerseite <%@ page errorPage=”...”%> <%@ page isErrorPage=”true”%> automatisches Buffering, <%@ page buffer=”none|xxxkb”%> Inhalt erzeugen <%@ page contentType=”text/html; charset=UTF−8”%> auf Thread-safety achten! Zugriff auf implizite Objekte über Kommandos/EL (s.u.) Scriptlets eingebetteter Servlet-Code, durch Custom Tags ersetzbar (s. Ü2) Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 58 / 74 JSP Expression Language (EL) JSP – Expression Language (EL) vgl. XPath ${expr} in statischem Text und Tag-Attributwerten Escaping für Klammeranfang: ${’${’} Variablen-Traversierung mit . und [] , a.b = a[”b”] Map[String-Key], List[int-Offset], JavaBean[Property-Name] Implizite Objekte definiert div. Kontexte: pageContext.servletContext, .session, .request, .response Maps: param, header, param/headerValues, cookie, initParam Attribut-Maps: page-, request-, session-, applicationScope Literale: true,false,null , \” , \’, \\, floats , ints , Strings übliche arith./log. Operatoren inkl. conditional a?b:c und Präfix empty x eigene Funktionen wie Tags als function“ entwickeln (s. Ü2) ” Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 60 / 74 JSP Beans JSP – Beans Deklaration: 1 2 3 <jsp:useBean i d = ” beanName ” c l a s s = ” classname ” scope= ” scope ”> <j s p : s e t P r o p e r t y . . . / > <!−− o p t i o n a l −−> </ jsp:useBean> Scope: application, session, request, page Zugriff: <jsp:getProperty name=”beanName”property=”propName”/> Property-Traversierung mit EL: ${bean.prop1.prop2} Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 62 / 74 JSP Modularisierung, Wiederverwendung JSP – Modularisierung, Wiederverwendung Properties für JSP-Gruppen deklarierbar Tag Files: enthalten Dokumentfragmente (s. Ü2) Inclusion bei Übersetzung <%@ include file=”banner.jspf”%> bei Ausführung <jsp:include page=”response.jsp”/> Forwarding: <jsp:forward page=”/main.jsp” /> Preludes+Codas global deklarierte Fragmente vor/nach Ausgabe Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 64 / 74 JSP Klassische JSP vs. XML JSP – Klassische JSP vs. XML JSP Documents Wohlgeformte .jspx-Dokumente Entities statt <, >, ... ${EL−expr} weiterhin möglich <jsp:something>... statt <%...%> xmlns:x=”URI” statt <%@ taglib uri=”URI”prefix=”x” %> Deployment: Property is-xml“ setzen ” Anwendung Postprocessing mittels XSLT XML-Streaming zwischen Anwendungen automatische Anpassung zw. klassisch/XML bei Imports optional: <jsp:root version=”2.0” > als DocRoot Multi-Document Ausgaben Ziel-DTD angebbar <jsp:output doctype−root−element=”books”... doctype−system=”books.dtd”/> Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 66 / 74 Tomcat Und nun. . . 7 Tomcat Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 67 / 74 Tomcat Tomcat – Integration in Webserver-Umgebung http://www.apache.de/dist/jakarta/tomcat-5/v5.5. 9/bin/jakarta-tomcat-5.5.9.tar.gz Umfangreiche Beispielsammlung! Tomcat liefert kleinen HTTP-Server mit (Default Port 8080) inkl. Admin/Managemente-Konsole Anbindung an HTTP-Server Bsp.: Apache Proxy Modul greif ab best. Pfadpräfix http://www.sw/tomcat/MyApps/Intro?param1 tomcat“ ist Suchmuster für Proxy Modul ” MyApps“ ist Context Root der Web-Application ” Intro“ ist Servlet-Alias ” Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 68 / 74 Tomcat Tomcat – Deployment Web ARchive (.war) JAR-File mit striktem Aufbau / – Document Root (.html, .jsp, ...) /WEB-INF/web.xml – Deployment Descriptor /WEB-INF/classes – Java Class Files /WEB-INF/lib – JARs Servlets/Filter... werden logisch definiert und benamt Logische Namen an konkrete Pfade geknüpft WAR in ${TOMCAT}/webapps/... kopieren Auto-Deployment und Entpacken durch Tomcat Archivname ohne WAR wird Context Root Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 70 / 74 Tomcat Tomcat – Deployment-Descriptor (stark gekürzt) 1 2 <web−app> <d i s p l a y −name>My Web A p p l i c a t i o n</ d i s p l a y −name> 3 4 5 6 <c o n t e x t −param> <param−name>webmaster</ param−name> <param−v a l u e>myaddress@mycompany . com</ param−v a l u e> . . . 7 8 9 10 11 12 13 14 <s e r v l e t> <s e r v l e t −name> f i r s t</ s e r v l e t −name> <s e r v l e t −c l a s s>sw . myhost . F i r s t S e r v l e t</ s e r v l e t −c l a s s> < i n i t −param> <param−name> t e s t I n i t</ param−name> <param−v a l u e>b l a</ param−v a l u e> </ i n i t −param> . . . 15 16 17 18 <s e r v l e t −mapping> <s e r v l e t −name> f i r s t</ s e r v l e t −name> <u r l −p a t t e r n>∗ . do</ u r l −p a t t e r n> . . . 19 20 21 <session−c o n f i g> <session−t i m e o u t>30</ session−t i m e o u t> . . . 22 23 </ web−app> Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 72 / 74 Aufgabe Und nun. . . 8 Aufgabe Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 73 / 74 Aufgabe Aufgabe Tomcat installieren Doku/Beispiele studieren J2EE-Tutorial Google, ... einfacher Kalender mittels JSP/Servlets Login per Filter, falls noch kein User angegeben Logout-Button Kalendermodell auf zwei Objektklassen beschränken PersonName has EntriesTimestamp,Text einfache GUI zum Verwalten/Auflisten der Einträge Daten in XML-Datei gespeichert bei Serverstart laden, bei Shutdown speichern Schema spezifizieren validierendes Parsen der Daten Andreas I. Schmied (schmied@inf...) AVID Übung1 SS2005 74 / 74