1 Überblick ■ Besprechung der Aufgaben 1. Übung ■ Servlets Architekturen für verteilte Internetdienste ◆ Request, Response ◆ Filter ◆ Sitzungsmanagement ◆ Modularisierung ◆ Scope/Context ■ Java Server Pages (JSP) Übung 2: Servlets + Java Server Pages ◆ Life Cycle, Inhaltserzeugung ◆ Expression Language ◆ Beans ◆ Modularisierung/ Wiederverwendung [email protected] ◆ Klassische JSP vs. XML ◆ Tag Libraries ■ Apache Tomcat © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2 Besprechung der Aufgaben 2.1 SAX Parser ■ SAX Parser ■ Implementierung des Handlers public class Handler extends DefaultHandler { ■ DOM Parser public void characters(char[] ch, int start, int length) throws SAXException { out.println("characters:'"+str+"'\t,"+start+":"+length); } ■ Einfacher Zeitserver mit Java RMI public void endDocument() throws SAXException { out.println("end document"); } public void endElement(String uri, String localName, String qName) throws SAXException { out.println("end element: '"+qName+"'\t, uri='"+uri+"'"); } ... } 2.1 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.2 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.1 SAX Parser 2.2 DOM Parser ■ Main-Methode ■ Main Methode DefaultHandler hr = new Handler(); XMLReader xr = XMLReaderFactory.createXMLReader(); factory = DocumentBuilderFactory.newInstance(); builder = factory.newDocumentBuilder(); document = builder.parse( new File( argv[0] ) ); // ggf. Validierung xr.setFeature("http://xml.org/sax/features/validation", true); xr.setContentHandler(hr); xr.setErrorHandler(hr); NodeList ndList = document.getChildNodes(); printNodesFromList( ndList, 0 ); ■ Methode printNodesFromList FileReader r = new FileReader(filepath); xr.parse(new InputSource(r)); void printNodesFromList( NodeList ndList, int dim ) { for( int i=0; i<ndList.getLength(); i++ ) printNodeInfos("ndList.item("+i+")", ndList.item(i), dim); } } 2.3 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.4 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.2 DOM Parser 2.3 Einfacher RMI Zeitserver ■ Methode printNodeInfos ■ Server: Schnittstelle definieren printObj("getNodeType() = ", " + node.getNodeType(), dim); printObj("getNodeName() = ", " + node.getNodeName(), dim); printObj("getLocalName() = ", " + node.getLocalName(), dim); printObj("getNodeValue() = ", " + node.getNodeValue(), dim); if( node.hasAttributes() ) for (int i=0;i<node.getAttributes().getLength();i++){ printObj( ...node.getAttributes().item(i), dim); } if( node.hasChildNodes() ) printNodesFromList(node.getChildNodes(), dimension+1); public interface Time extends java.rmi.Remote { public String getTime()throws java.rmi.RemoteException; } ■ Server: Implementierung pub class TimeImpl extends UnicastRemoteObject implements Time { public TimeImpl() throws java.rmi.RemoteException { super(); } public String getTime() throws java.rmi.RemoteException { return new java.util.Date().toString(); } public static void main(String[] args) { TimeImpl time = new TimeImpl(); java.rmi.Naming.rebind("//localhost:9999/Time", time); } } 2.5 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.6 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.3 Einfacher RMI Zeitserver 3 Servlets ■ Client ■ Ziele ◆ Plattformunabhängigkeit (JVM) time = (Time)java.rmi.Naming.lookup("//localhost:9999/Time"); System.out.println(time.getTime()); ◆ Im Vergleich zu CGI bessere Skalierbarkeit und Performanz ◆ Trennung Implementierung vs. Deployment ■ Wichtig • Deployment Descriptor (+J2EE-Tools) ◆ Stubs mit rmic erzeugen ◆ Modularisierung, Rollentrennung ◆ RMI registry starten auf Port 9999 • GUI ◆ Klassen nicht im Klassenpfad der Registry, sonst wird Codebase entfernt • Workflows • Geschäftsmethoden ■ Java 1.5 • Objekt-relationale Abbildung ◆ Keine Stub-Erzeugung nötig • Datenzugriff (z.B. abstrakte DB-API) ◆ VM-Parameter -Djava.rmi.server.ignoreStubClasses=true • Datenhaltung (konkrete Datenbank) ◆ Basisklasse: javax.servlet.GenericServlet ◆ HTTP-Adapter: javax.servlet.http.HttpServlet 2.7 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.8 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 3 Servlets 3.1 Life Cycle ■ Einfaches Beispiel-Servlet ■ Servlet Klasse laden ■ Instanz erzeugen: init() (ggf. UnavailableException) public class MyServlet extends HttpServlet { ■ Aufruf: service() bzw. doPost()/doGet() public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ◆ Auf Multi-Threading-Safety achten ◆ Requests auslesen, Response Header + Body schreiben ◆ Gesonderte Behandlung von langlaufenden Requests (BufferSize) response.setContentType("text/html"); response.setBufferSize(8192); PrintWriter out = response.getWriter(); ■ Instanz beenden: destroy() ◆ Z.B. Synchronisation persistenter Speicher out.println("<html>..."); out.close(); ■ Diverse Listener, u.a. } public void doPost(...) throws ServletException, IOException { this.doGet(request, response); } ◆ ServletContextListener, ServletContextAttributesListener, HttpSessionListener, HttpSessionAttributesListener } 2.9 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ ■ Zentrale Fehlerseiten, Filter © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.10 3.2 Requests 3.3 Response ■ Manuelles Auslesen der Eingabe: getReader(), getInputStream() ◆ Sinnvoll z.B. für Uploads (POST-Data) ■ Ausgabe: getWriter(), getOutputStream() ◆ setContentType(’text/html’) oder anderen MIME-Type ◆ setBufferSize(int) kann Teildokument bei Fehler verhindern ■ HttpServletRequest-URI ◆ Status Code, Cookies, ... setzen ◆ CGI-Format: http://host:port/requestpath?querystring ◆ Ggf. Weiterleitung, Import der Ausgaben von Sub-Servlets ■ Zugriff auf Parameter ◆ close() für EndOfRequest ◆ Parameter in GET-URL kodiert oder als POST-Datenstrom ◆ Transparenter Zugriff: getParameter(name) ■ Zum Beispiel Ausgabe der Kontextdaten ■ Kontextdaten über Sitzungsmanagement Enumeration e = request.getParameterNames(); PrintWriter out = res.getWriter(); while (e.hasMoreElements()) { String name = (String)e.nextElement(); String value = request.getParameter(name); out.println(name + " = " + value); } Enumeration e = request.getParameterNames(); while (e.hasMoreElements()) { String name = (String)e.nextElement(); String value = request.getParameter(name); ... } 2.11 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.12 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 3.4 Filter 3.4 Filter ■ Konzept ■ Implementierung ◆ IFCs: javax.servlet.Filter, .FilterChain, .FilterConfig public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { ◆ Manipulieren und Abfangen von Requests/Responses ◆ Erkennen neuer Sessions ◆ Nebeneffekte auslösen long starttime = System.currentTimeMillis(); • Logging, Authentication, Transformation, De/Encryption // weiter in Kette chain.doFilter(request, response); • Ressourcen-Verwaltung • Filter-Implementierung möglichst ohne Abhängigkeiten zu anderen Webdiensten long duration = System.currentTimeMillis() - starttime; logger.debug("Dauer: " + duration); ◆ Einreihung im Deployment Descriptor } • Benennung Filter • Festlegen Wirkungstrigger: REQUEST, FORWARD, INCLUDE, ERROR • Festlegen Wirkungsbereich: Welche Servlets? 2.13 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.14 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 3.4 Filter 3.4 Filter ■ Deployment-Deskriptor ■ Life Cycle ◆ init() ... <filter> <filter-name>AvIDFilter</filter-name> <filter-class>avid.u2.AvIDFilter</filter-class> <init-param> <param-name>name</param-name> <param-value>value</param-value> </init-param> </filter> ◆ Aufruf doFilter(Request, Response, Chain) ◆ Ggf. Manipulationen ◆ Verkettung mit FilterChain.doFilter(...) ◆ destroy() ... ■ Response manipulieren <filter-mapping> <filter-name>AvIDFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ◆ Stream-Double an Chain weiterleiten ◆ close()-Effekt verhindern ◆ ServletRequestWrapper(...), ServletResponseWrapper(...) • Daten nicht direkt in OutputStream der HTTP Verbindung geschrieben => Filter kann Daten nachträglich manipulieren 2.15 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.16 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 3.5 Sitzungsmanagement 3.5 Sitzungsmanagement ■ Allgemeines ■ Implementierung ◆ HTTP ist zustandslos! HttpSession session = request.getSession(true); • Zustand: Login, Einkaufskorb, ... ◆ Mehrere Varianten für Zustandssicherung Date created = new Date(session.getCreationTime()); Date accessed = new Date(session.getLastAccessedTime()); • Cookies, versteckte Formularfelder, URL-Decorating/Rewriting ◆ Servlets abstrahieren => Verwenden optimale von Browser/User unterstützte Variante session.setAttribute(dataName, dataValue); ◆ Listener für beliebige Zustandsänderungen String value = session.getAttribute(dataName).toString(); ◆ Z.B. Einkaufskorb: • Begin/Ende, Modifikation von Attributen • HttpSessionBindingListener, HttpSessionActivationListener HttpSession.setAttribute( “cart“ , new ShoppingCart()) 2.17 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.18 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 3.5 Sitzungsmanagement 3.6 Modularisierung ■ Logout ■ ◆ Timeout für Session konfigurieren Dispatching ◆ Szenario: ein öffentlich sichtbares Servlet mit Parameter action=... ◆ Session.invalidate() • Vorteil: zentrales URL-Management (Workflow-Management) • Weiterleitung pro Action an interne Worker-Servlets/JSPs ■ Besonderheit: Links ■ Inclusion ◆ Eigene Links ggf. mit Session-ID versehen ◆ Szenario: wiederverwendbare Fragmente der Ausgabe ◆ Sonst ”springen“ Links aus dem Session-Context • Titel, Fuß-/Kopfzeile, Navigation, ... ◆ Response.encodeURL() getRequestDispatcher(URL).include(Request, Response) • ” ; jsessionid=c0o7fszeb1” wird an alle Links angehängt oder: ID wird in Cookies Client-seitig gespeichert (falls zulässig) ◆ Outgoing Links ohne Zustandsmarkierung ■ Forwarding • Session bleibt hängen bis zum Timeout! ◆ Szenario: Weiterleitung, z.B. von intern agierendem Servlet an Ausgabe-JSP getRequestDispatcher(URL).forward(Request, Response) 2.19 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.20 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 3.7 Scope-/Context-Objekte 4 Java Server Pages (JSP) ■ Idee ■ Grundlegende Ideen ◆ Informationsaustausch zwischen Servlets ◆ Ziel: Rollentrennung Dokument-Autor/Designer vs. Programmierer ◆ Zustandsdaten für Applikation, Session, Request, ... ◆ Inversion der Servlets ◆ Textdokument durch Kommandos und Servletfragmente angereichert • ServletContext, HttpSession, ServletRequest, ... • Forwarding/Inclusion Object o = this.getServletContext().getAttribute(attributeName); • Zugriff auf Kontextdaten • Zugriff auf JavaBeans ◆ Koordinierung der Servlet-Threads notwendig! • Zusatzfunktionen (DB, ...) ◆ Bootstrapping • ServletContextListener global anmelden (Deployment Descriptor) ◆ Kommandos klassisch: <%...%> • XML-Variante <jsp:something> (JSP Version 2.0) • Bei Erzeugung eines Servlet vor dessen init() benachrichtigt ◆ Dateiendung .jsp • Daten in ServletContext vor-initialisieren • Für Fragmente .jspf ■ Kurzreferenz Syntax-Card: http://java.sun.com/products/jsp/docs.html#syntax 2.21 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.22 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 4.1 Syntax 4.1 Syntax ■ Kommentare (JSP/HTML) ■ Beispiel <%-- ...--%> <!-- ... --> <%@ <%@ <%@ <%! ■ Direktiven <%@ page import=“java.util.Hashtable“ %> page contentType="text/html; charset=UTF-8" %> taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> taglib uri="/functions" prefix="f" %> String header="Header"; %> <html> <head><title>Example</title></head> <body> ■ Java Ausdrücke <h1><%=header%></h1> <%= 5 + 7 %> <c:set var="fooString" value="${param.foo}" /> <c:set var="isFoo" value="${!empty fooString}" /> ■ Java Deklarationen ... <%! int i = 1; %> ■ Scriptlets (Java Anweisungen) <% time.getTime(); %> 2.23 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.24 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 4.1 Syntax 4.2 Life Cycle ■ Beispiel ■ Prüfung, ob Servlet im Cache älter als JSP ◆ Ggf. Transformation in Servlet und Übersetzung ... ◆ Compilerfehler werden ggf. erst bei erster Nutzung erkannt <h2>Locale:</h2> <!-- Gebietsschema --> <jsp:useBean id="locales" scope="application" class="a.Loc"/> <p> <c:forEach var="localeString" items="${locales.localeNames}" > locale ${localeString}, </c:forEach> </p> <jsp:useBean id="date" class="mypkg.MyDate"/> <jsp:setProperty name="date" property="locale" value="${locales.selectedLocale}"/> <p>Date: ${date.date}</p> • Einstiegspunkte zur Initialisierung oder vor dem Entfernen <jsp:declaration> public void jspInit() {...} public void jspDestroy() {...} </jsp:declaration> ■ Zentrale Fehlerseite <%@ page errorPage=”...”%> <%@ page isErrorPage=”true”%> </body> </html> 2.25 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ ■ jspInit() ... _jspService() ... jspDestroy() ■ Automatisches Buffering: <%@ page buffer=”none|xxxkb”%> © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.26 4.3 Inhaltserzeugung 4.4 Expression Language (EL) ■ Setzen des Content-Types, Encoding ■ Vgl. XPath ■ ${expr} in statischem Text und Tag-Attributwerten <%@ page contentType=”text/html; charset=UTF-8”%> <c:set var="a" value="${!empty selectedLocaleString}"/> ■ Auf Thread-safety achten oder... ■ Escaping für Klammeranfang (EL) <%@page isThreadSafe=”false” %> ${’${’} Ergebnis: ${ ■ Variablen-Traversierung mit . und []: a.b = a[”b”] ■ Scriptlets Map[String-Key] List[int-Offset] JavaBean[Property-Name] ◆ eingebetteter Servlet-Code (durch Custom Tags ersetzbar) <% System.out.println("Aktuelles Datum:"); java.util.Date date = new java.util.Date(); ■ Literale: true, false, null, \” , \’, \\, floats, ints, Strings %> ... <%= date %> ■ Übliche arith./log. Operatoren 2.27 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.28 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 4.4 Expression Language (EL) 4.5 Beans ■ Implizite Objekte definiert ■ Deklaration: ◆ Kontexte: pageContext.servletContext, .session, .request, .response <jsp:useBean id =”beanName” class=”classname” scope=”scope”> <jsp: setProperty .../> <!-- optional --> ... ◆ Maps: param, header, param/headerValues, cookie, initParam ◆ Attribut-Maps: page-, request-, session-, applicationScope ■ Scope: ■ empty x <c:set var="isSelected" value="${!empty selectedLocaleString}" /> ■ Eigene Funktionen wie Tags als ”function“ entwickeln <%@ taglib prefix=”z” uri=”/zak”%> ... <z:when test=”${f:equals(...)}”> ◆ page Bean wird zerstört, wenn Seite fertig generiert ◆ request Bean wird zerstört, wenn Response gesendet ◆ session Bean wird zerstört, wenn Session beendet ◆ application Bean wird zerstört, wenn Web-Applikation entfernt ■ Zugriff: <jsp:getProperty name=”beanName” property=”propName”/> <jsp:setProperty name=”beanName” property=”propName” value=”.”/> ■ Aktivierung / Deaktivierung <%@ page isELIgnored ="true|false" %> © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.29 ■ Property-Traversierung mit EL: ${bean.propName} © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.30 4.6 Modularisierung / Wiederverwendung 4.7 Klassische JSP vs. XML ■ Tag Files: enthalten Dokumentfragmente ■ Wohlgeformte .jspx-Dokumente ◆ Entities statt <, >, ... ■ Inklusion ◆ ${EL-expr} weiterhin möglich ◆ Bei Übersetzung ◆ <jsp:something>... statt <%...%> <%@ include file=”banner.jspf”%> ◆ xmlns:x=”URI” statt <%@ taglib uri=”URI”prefix=”x” %> ◆ Bei Ausführung ■ Deployment: Property is-xml setzen <jsp:include page=”response.jsp”/> ■ Mögliche Anwendung ■ Forwarding ◆ Postprocessing mittels XSLT, XML-Streaming zwischen Anwendungen <jsp:forward page=”/main.jsp” /> ■ Automatische Anpassung (klassisch/XML) durch den Container bei Imports ■ Optional: <jsp:root version=”2.0” > als DocRoot ■ Preludes und Codas ◆ Multi-Dokument Ausgaben (Sequenz von Dokumenten) ◆ Global deklarierte Fragmente vor/nach Ausgabe ◆ Deployment-Deskriptor ■ Ziel-DTD angebbar 2.31 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ <jsp:output doctype-root-element=”books” ... doctype-system=”books.dtd”/> 2.32 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 4.7 Klassische JSP vs. XML 4.8 Java Server Pages Standard Tag Library (JSTL) ■ Beispiel (angelehnt an Tomcat JSP example) ■ Standardisierte Tags ◆ Interoperabilität <tags:xhtmlbasic xmlns:tags="urn:jsptagdir:/WEB-INF/tags" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:fmt="http://java.sun.com/jsp/jstl/fmt" xmlns="http://www.w3.org/1999/xhtml"> <jsp:directive.page contentType="text/html" /> <head> <title>...</title> </head> <body> <h1>...</h1> ◆ Rollentrennung ◆ Programmierung “ohne Java” ■ XML-Manipulation, DB, I18N, Conditionals, Flusskontrolle ■ Komponenten ◆ Core <jsp:useBean id="now" class="java.util.Date" /> <fmt:formatDate value="${now}" pattern="MMMM d, yyyy, HH:mm:ss"/> </body> </tags:xhtmlbasic> http://java.sun.com/jsp/jstl/core ◆ XML http://java.sun.com/jsp/jstl/xml ◆ I18N http://java.sun.com/jsp/jstl/fmt ◆ SQL http://java.sun.com/jsp/jstl/sql ◆ Functionshttp://java.sun.com/jsp/jstl/functions 2.33 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.34 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 4.8 Java Server Pages Standard Tag Library (JSTL) 4.8 Java Server Pages Standard Tag Library (JSTL) ■ Deklaration als xmlns:prefix oder: ■ Beispiel: Core ◆ Variablen setzen/löschen <%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c” %> ■ Interaktion mit Tag-Daten ◆ Flusskontrolle <c:if test=”...”>... <c:set var=”bookId” value=”${param.Add}”/> <jsp:useBean id=”bookId” type=”java.lang.String” /> <c:choose> <c:when test=”...”>... <c:otherwise> ... <% cart.add(bookId); %> <sql:query var=”books” dataSource=”${applicationScope.DB}”> select * from PUBLIC.books where id = ? <sql:param value=”${bookId}” /> </sql:query> <c:forEach var=”item” items=”${sessionScope.cart.items}”>... ◆ Import, Redirect 2.35 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.36 5 Apache Tomcat ■ Implementierung, z.B.: ■ Servlet Container ◆ http://tomcat.apache.org/ (Aktuelle Version: 5.5.23 bzw. 6.0.10) public ATagImpl extends SimpleTagSupport { ... public void doTag() throws JspException, IOException { getJspContext().getOut().write(”AVID-SS07”); } } ■ Umfangreiche Beispielsammlung! ■ Tomcat liefert kleinen HTTP-Server mit (Default Port 8080) ◆ Inkl. Admin/Managemente-Konsole ■ Zusätzlich Parameter, Variablen, Nested-Tags, ... ■ Anbindung an HTTP-Server möglich ■ Tag Library Descriptor (TLD) ◆ Bsp.: Apache Proxy Modul greif ab best. Pfadpräfix ... <tag> <name>atag</name> <tag-class>infvs.avid.tags.ATagImpl</tag-class> <body-content>scriptless</body-content> ... <attribute> <name>test</name> ... </attribute> ... </tag> © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ <c:import url=”/books.xml” var=”xml”> <c:param ...> <c:redirect url=”...”> <c:param ...> © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 4.9 Custom Tags ■ Weitaus komplexere Konstrukte möglich...! <c:set var=”pass” scope=”session” value=”${param.PwdField}”/> <c:remove var=”pass” scope=”session”/> ◆ 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 • “param1“ ist Parameter 2.37 2.38 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 5.1 Deployment 5.1 Deployment ■ Web ARchive (.war) ■ Beispiel: Deployment-Descriptor (stark gekürzt) ◆ JAR-File mit striktem Aufbau <web-app 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" version="2.4"> / – 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 <display-name>My Web Application</display-name> <context-param> <param-name>webmaster</param-name> <param-value>[email protected]</param-value> ... ■ WAR in ${TOMCAT}/webapps/... kopieren ◆ Auto-Deployment und Entpacken durch Tomcat [...] ■ Archivname ohne WAR wird Context Root 2.39 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.40 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 5.1 Deployment 6 Aufgaben ■ Beispiel: Deployment-Descriptor (stark gekürzt) ■ Tomcat ◆ Installieren [...] ◆ Doku/Beispiele studieren ◆ J2EE-Tutorial <servlet> <servlet-name>first</servlet-name> <servlet-class>sw.myhost.FirstServlet</servlet-class> <init-param> <param-name>testInit</param-name> <param-value>bla</param-value> </init-param> ... ◆ Google, ... ■ Servlets ◆ Implementierung einer einfachen Taskliste • Vector von TaskData-Objekten im Servlet Context <servlet-mapping> <servlet-name>first</servlet-name> <url-pattern>*.do</url-pattern> ... • Anzeige u. Hinzufügen von Tasks (einfaches Formular: Eingabefeld + Submit) • Ggf. Löschen von Tasks <session-config> <session-timeout>30</session-timeout> ... ■ Java Server Pages ◆ Implementierung Taskliste (Funktionalität: TaskBean, Context: Application) </web-app> 2.41 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ ◆ Gleiche Funktionalität/ Erscheinungsbild wie Servlet-Anwendung © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2.42 6 Aufgaben ■ Screenshot (Servlets / JSP Aufgabe) 2.43 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/