Servlets Servlets Definition, Servlet vs. CGI, Design, API Lebenszyklus, Beispiel JSP JSP vs. Servlet, Beispiel, Syntax, Beans, TagLibs, Implizite Objekte Konfiguration JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 1 Definition SERVLET = Eine auf Java-Technologie basierte Web-Komponente, die von einem Container verwaltet wird und dynamisch Inhalt generiert. SERVLET-ENGINE (Container) = Teil eines Web-Servers, der die Netzwerkdienste zum Empfangen von Anfragen und Senden von Antworten bereitstellt und die Servlets über ihren gesamten Lebenszyklus enthält und verwaltet. JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 2 Servlet vs. CGI CGI • • Servlet Schnittstelle um externe Programme auszuführen Pro Aufruf gestartet • • • • Zustandslos • • • • Sprach-/System-unabhängig • • Gleicher Prozess dadurch Weniger Overhead Bleibt im Speicher zwischen den Anfragen Eine Instanz für alle Anfragen Zustandsbehaftet Fehlerbehandlung (Exceptions) Sicherer durch Sandbox Systemunabhängig (soweit JavaVM verfügbar) Große Klassenbibliothek JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 3 Design Client IE, Mozilla, … Request Response WebServer & Servlet-Engine Tomcat, … Servlet 1 Servlet 2 Servlet … Ressourcen Dateien, DB, ... JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 4 API Generische Klassen: javax.servlet • • • • • Servlet GenericServlet ServletRequest ServletResponse ServletContext ... Servlet Spezialisierungen für HTTP: javax.servlet.http • • • • • HttpServlet HttpServletRequest HttpServletResponse HttpSession ... GenericServlet HttpServlet Benutzer Servlet JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 5 Servlet Interface void init(ServletConfig config) throws ServletException • Initialisierung des Servlets mit Konfigurationsparameter ServletConfig getServletConfig() Zugriff auf die Konfigurationsparameter • void service(ServletRequest req, ServletResponse res) throws ServletException, IOException • • • • Führt einen einzelnen Request von einem Client aus und erzeugt die Response. Für jeden Request wird die Methode in eigenem Thread ausgeführt Parameter req hält alle Informationen über Request; in Parameter res wird die Antwort geschrieben String getServletInfo() • Information über Servlet in Form eines Strings void destroy() • soll Aufräumarbeiten durchführen und zerstört das Servlet JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 6 ServletRequest String getParameter(String name) • • Wert (URL-decoded) des ersten Parameters mit dem gegebenen Namen null, falls nicht vorhanden String[] getParameterValues(String name) • • Array mit Werten (URL-decoded) für jedes Vorkommen des angegebenen Parameternamens null, falls nicht vorhanden Enumeration request.getParameterNames() • • eine Aufzählung (Enumeration) aller Parameternamen falls keine Parameter übergeben wurden ist die Enumeration leer String getRemoteAddress() • IP-Adresse des Clients boolean isSecure() • true wenn der Aufruf über HTTPS erfolgt ist ... JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 7 ServletResponse ServletOutputStream getOutputStream() • Binäre Daten exklusiv PrintWriter getWriter() • Text void reset() • Löschen des Puffers, der Header und des Statuscodes void flushBuffer() • Schreiben des Puffers (den Header und Statuscode) an den Client String getContentType() • Liefert den aktuell gesetzen MIME Typen (z.B.: text/html, image/jpeg, ...) void setContentType(String type) ... JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 8 HTTP Protokoll HTTP methods GET HEAD POST PUT DELETE TRACE CONNECT OPTIONS Beispiel GET GET /servlet/MyServlet?name=Scott& company=MageLang%20Institute HTTP/1.1 Connection: Keep-Alive Parameter als Name/WertUser-Agent: Mozilla/4.0 ( Paare in URL compatible; MSIE 4.01; Windows NT) Host: www.magelang.com Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg Beispiel POST POST /servlet/MyServlet HTTP/1.1 User-Agent: Mozilla/4.0 ( compatible; MSIE 4.01; Windows NT) Host: www.magelang.com Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */ Content-type: application/x-www-form-urlencoded Content-length: 39 name=Scott&company=MageLang%20Institute Parameter in eigenem Datenbereich JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 9 HTML Formulare Ermöglichen Benutzereingaben Benutzen POST oder GET <html><head><title>HTML Forms</title></head> <body> <form action="result.html" method="get"> <input type="hidden" name="id" value="123"/> User Name: <input type="text" name="user"/><br> User Password: <input type="password" name="pass"/><br> Flash: <input type="checkbox" name="flash" checked>Enabled</input><br> Age: <input type="radio" name="age" value="child">&lt; 18</input> <input type="radio" name="age" value="adult" checked>&ge; 18</input><br> Role: <select name="role"> <option value="A">Administrator</option> <option value="S" selected>Student</option> </select><br> <input type="submit" value="Submit"/> </form> </body></html> Aufruf: result.html?id=123&user=John+Doe&pass=mypass&flash=on&age=adult&role=S JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 10 HTML Formulare Fortsetzung id=123&user=John+Doe&pass=mypass&flash=on&age=adult&role=S Textfelder: text: Text-Eingabefeld • hidden: Unsichtbares Textfeld, Information für den Server (z.B.: AppointmentId) • password: Text-Einfabefeld bei dem die Eingabe versteckt wird Sonderzeichen werden codiert übertragen (%HexHex; z.B.: ä=%E4), Leerzeichen als "+" (z.B.: John+Dow). • Auswahlfelder: • • • checkbox: Wert wird nur übertragen wenn er gesetzt ist (als name=on, z.B.: flash=on), mit checked kann eine Checkbox vorselektiert werden. radio: Wert wird nur übertragen wenn er gesetzt ist (value wenn angegeben sonst "on"), es kann nur ein Wert aus einer Gruppe (gleicher Name) ausgesucht werden, mit checked kann eine Vorselektion erfolgen. select: Dropdown-Element, als Wert wird der ausgewählte (value der Option wenn angegeben sonst der Text) übertragen wobei mit selected eine Vorauswahl getroffen werden kann (sonst erstes Element). Absenden: • submit: Erzeugt einen Button, Text kann mit value gesetzt werden, wird auch ein name gegeben so wird das Name/Wert-Paar mitübertragen (sinnvoll wenn mehrere Buttons in eine Formular). JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 11 HttpServlet protected Methoden: • • • • • • • • void void void void void void void void - doDelete(HttpServletRequest, HttpServletResponse) doGet(HttpServletRequest, HttpServletResponse) doHead(HttpServletRequest, HttpServletResponse) doOptions(HttpServletRequest, HttpServletResponse) doPost(HttpServletRequest, HttpServletResponse) doPut(HttpServletRequest, HttpServletResponse) doTrace(HttpServletRequest, HttpServletResponse) service(HttpServletRequest, HttpServletResponse) Leitet HTTP-Anfragen auf die entsprechenden Methoden um. public Methoden: • void service(ServletRequest, ServletResponse) - Ruft die protected service Methode auf JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 12 Beispiel package TestPack; import java.io.*; import javax.servlet.ServletException; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println( "<HTML><HEAD><TITLE>Hello World</TITLE></HEAD><BODY>" + "<H2>Hello World!</H2>" + + "</BODY></HTML>" "</BODY></HTML>" ); out.close(); } } JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 13 Lebenszyklus Engine lädt Servlet-Klasse und erzeugt ein Exemplar • • alle Variablen werden genau einmal initialisiert alle Variablen bleiben aktiv, solange das Servlet-Exemplar existiert Mehrere Web-Browser (=Clients) fordern das Servlet an • Request wird vom Web-Server an Servlet-Engine und von dieser weiter zum entsprechenden Servlet gesandt Engine erzeugt pro Request einen Thread • • jeder Thread behandelt Request+Response des jeweiligen Clients jeder Thread hat Zugriff auf die Instanzvariablen des Servlets Servlet-Engine bestimmt, wann Servlets entladen werden • Servlet gibt Ressourcen frei und speichert persistenten Zustand Client 1 Servlet Thread 1 Servlet Thread 2 Client 2 Servlet Instance WebServer & Servlet-Engine Servlet JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 14 Lebenszyklus init(ServletConfig) • Variablen initialisieren, Ressourcen anfordern service(HttpRequest, HttpResponse) • • • • doGet(HttpRequest, HttpResponse) doPost(HttpRequest, HttpResponse) doPut(HttpRequest, HttpResponse) ... destroy() • • Ressourcen freigeben Eventuell Zustand speichern JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 15 Sitzungen (Sessions) Probleme • • • HTTP ist ein nicht sitzungsorientiertes Protokoll Wenn der eBusiness-Kunde einen Artikel in den Einkaufskorb legt, woher weiß der Server, was schon im Einkaufskorb ist? Wenn der Kunde seine Online-Einkaufstour beendet, woher weiß der Server, welcher Einkaufskorb zu welchem Kunden gehört? Lösungen • • • Cookies URL mit Parameter Versteckte HTML-Formular-Felder Unterstützung • • Servlets bieten ein „Higher Level API“ HttpSession JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 16 Sitzungen (Sessions) API HttpSession • HttpSession <HttpServletRequest>.getSession() - • HttpSession <HttpServletRequest>.getSession(bool c) - • c = true: neues Session-Objekt anlegen wenn noch keines existiert. c = false: null liefern wenn noch kein Session-Objekt existiert. Object getAttribute(String name) - • Liefert das aktuelle Session-Objekt, oder erzeugt ein neues wenn noch keines existiert. Liefert das Objekt mit dem angegebenen Namen oder null falls es nicht existiert. void setAttribute(String name, object o) - Speichert das gegebene Objekt unter dem gegebenen Namen. Existiert ein Name bereits, wird das Objekt überschrieben Existiert ein Name bereits und o==null, so wird das Objekt entfernt JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 17 Beispiel Interaktion 1/2 package at.jku.ssw.swe2; import java.io.*; import javax.servlet.ServletException; import javax.servlet.http.*; public class Interact extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException { PrintWriter out = res.getWriter(); HttpSession ses = req.getSession(); String last = (String)ses.getAttribute("opinion"); String cur = (String)req.getParameter("opinion"); ses.setAttribute("opinion", cur); res.setContentType("text/html"); out.println("<HTML>"); out.println("<HEAD><TITLE>Interaction</TITLE></HEAD>"); out.println("<BODY>"); JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 18 Beispiel Interaktion 2/2 if (last == null && cur == null) { out.println("Please enter your opinion:"); } else if (last == null || last.equals(cur)) { out.println("Your opinion is: " + cur); out.println("<BR> do you have a new one?"); } else { out.println("Your opinon was: " + last); out.println("<BR>and is now: " + cur); out.println("<BR>do you want to change it again?"); } out.println("<FORM ACTION="/Interact" METHOD=\"GET\">"); out.println("Your opinion: <INPUT TYPE=\"TEXT\" NAME=\"opinion\">"); out.println("<INPUT TYPE=\"SUBMIT\" VALUE=\"Send\">"); out.println("</FORM></BODY></HTML>"); out.close(); } } JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 19 Installieren eines Servlets (Anlegen der Verzeichnisse) ServerKonfiguration Document Base web.xml Alle benötigeten Klassen mit korrekter Verzeichnisstruktur JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 20 Installieren eines Servlets (server.xml) <Server port="8005" shutdown="SHUTDOWN" debug="0"> … <Context <!- Allgemeine Context-Attribute --> <!- Pflicht --> path="URL-Pfad zur Anwendung" docBase="Pfad zur Anwendung (serverseitig)"> <!- Optional --> className="Klassenname eines alternativen Contexts" cookies="true | false" crossContext="true | false" override="true | false" privileged="true | false" reloadable="true | false" wrapperClass="Klassenname einer alternativen Wrapperklasse" <!- Von org.apache.catalina.core.StandardContext werden noch weitere Context-Attribute unterstützt (cachingAllowed, debug, …) --> </Context> … </Server> JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 21 Installieren eines Servlets (web.xml 1/3) <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <!– Allgemeine Beschreibung --> <display-name>Name der Anwendung</display-name> <description>Beschreibung der Anwendung</description> <!– Kontext Parameter die man aus dem Servlet (oder der JSP Seite) über String name="…", param; param = getServletContext().getInitParameter(name); abfragen kann. --> <context-param> <param-name>Name des Parameters</param-name> <param-value>Wert des Parameters</param-value> <description>The Beschreibung des Parameters</description> </context-param> JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 22 Installieren eines Servlets (web.xml 2/3) <!– Beschreibung der Servlets dieser Web Anwendung. Jedem Servlet können Parameter mitgegeben werden die über String name="…", value; value = getServletConfig().getInitParameter(name); abgefragt werden können. --> <servlet> <servlet-name>Interner Name des Servlets</servlet-name> <description>Beschreibung des Servlets</description> <servlet-class>Voll qualifizierter Klassenname</servlet-class> <init-param> <param-name>Name des Parameters</param-name> <param-value>Wert des Parameters</param-value> </init-param> <!–Servlet automatisch mit Tomcat starten, die Zahl gibt die Reihenfolge an in der die Servlets gestartet werden. Wenn keine spezielle Reihenfolge benötigt wird genügt auch "<load-on-startup/>" --> <load-on-startup>Zahl</load-on-startup> </servlet> JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 23 Installieren eines Servlets (web.xml 3/3) <!– Festlegen unter welchem Namen das Servlet erreichbar sein soll. --> <servlet-mapping> <servlet-name>Interner Name des Servlets</servlet-name> <url-pattern>Offizieller Name des Servlets</url-pattern> </servlet-mapping> <!– Festlegen des standard-Timeouts einer Sitzung in Minuten. Kann vom Servlet über HttpSession ses=…; int ses.getMaxInactiveInterval(); abgefragt und über void setMaxInactiveInterval(int); verändert werden verändert werden. --> <session-config> <session-timeout>Minuten</session-timeout> </session-config> </web-app> JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 24 Installieren eines Servlets (server.xml Beispiel) <Server port="8005" shutdown="SHUTDOWN" debug="0"> … <Context path="/Interact" docBase="HelloWorld"> </Context> … </Server> JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 25 Installieren eines Servlets (web.xml Beispiel) <web-app> <display-name>SWE2</display-name> <description>Lecture SWE2, Institute SSW</description> <servlet> <servlet-name>InteractService</servlet-name> <description>Simple user interaction sample.</description> <servlet-class>at.jku.ssw.swe2.Interact</servlet-class> <load-on-startup/> </servlet> <servlet-mapping> <servlet-name>InteractService</servlet-name> <url-pattern>/Interact</url-pattern> </servlet-mapping> <session-config> <session-timeout>30</session-timeout> <!-- 30 minutes --> </session-config> </web-app> JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 26 Beispiel Ausführung 1 2 3 JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 27 JSP vs. Servlet JSP • • • • • Servlets Strikte Trennung zwischen Erscheinungsbild (HTML) und Logik (Java Komponenten) HTML-Code wie gewohnt verwenden. Veränderung des Aussehens ohne Veränderung des dynamischen Inhalts Änderung der JSP Seite hat automatische Übersetzung zur Folge ASP ähnlich • HTML Code wird im Servlet generiert. JSP = JavaServer Pages JSP Datei wird vom WebServer einmal in ein Servlet übersetzt Servlets aber auf einer abstrakteren Ebene programmieren JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 28 Model 1 Architecture Request werden direkt von der JSP-Seite behandelt JSP-Seite übernimmt Steuerung und Generierung der Antwort Datenzugriff sollte in Komponenten (JavaBeans) ausgelagert werden JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 29 Model 2 Architecture Serverseitige Realisierung des Model/View/Controller Pattern Steuerung wird durch ein Servlet übernommen Generierung des Outputs wird an JSP-Seiten delegiert Modelkomponenten werden von Servlet an JSP-Seiten weitergegeben JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 30 JSP Beispiel <html> <head><title>JSP 1</title></head> <body> TemplateText <%@ page import="java.util.*, java.text.*" %> JSPElement <% int max = 100; // pure Java code! %> <P> JSP Test - Zähler bis <%= max %> </P> <% for (int i = 0; i < max; i++) { %> <%= i %> <% } String dateString = DateFormat.getDateInstance(DateFormat.SHORT, Locale.GERMAN).format(new Date()); %> <P> Heutiges Datum: <%= dateString %> </P> </body> </html> JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 31 Installieren des JSP Beispiels JSP Datei in einen Kontext kopieren und ausführen. JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 32 JSP Syntax 1/3 Direktiven • <%@ ... %>: Eigenschaften & Includes - Erlaubt die Einstellung seitenbezogener Optionen. Kann mehrmals vorkommen. Inkludiert eine externe Datei. <%@ page language="java" import="java.util.*, java.text.*" contextType="text/html" ... %> <%@ include file="eineDatei.inc" %> <%@ taglib uri="/tagliburi" prefix="kurzname" %> JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 33 JSP Syntax 2/3 Skriptelemente: • <% ... %>: Skriptlet - • <%! ... %>: Deklarationen - • Beliebiger Quelltext (Anweisungen, Variablendeklaration). Variablen- und Methodendeklarationen <%= ... %>: Ausdrücke - Ausdruck wird in einen String konvertiert und in den Seitentext eingefügt. Beispiele: <%=i%>, <%=new Date()%>, <%=methode()%> Achtung, kein abschließendes Semikolon. Kommentare: • <%-- ... --%>: Kommentar - • Nur in der JSP Datei enthalten, nicht aber im Ergebnis. In Skriptelementen normale Java Kommentare (/* */ und //) JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 34 JSP Syntax 3/3 Aktionselemente: • <jsp:useBean> - JavaBean-Komponente verfügbar machen. <jsp:useBean id="Instanzname" scope="Geltungsbereich" class="Klassenname"/> • <jsp:getProperty> - • Wert einer JavaBean-Eigenschaft abfragen. <jsp:setProperty> - Wert von JavaBean-Eigenschaften festlegen. <jsp:setProperty name="Instanzname" property="*" /> • <jsp:include> - • <jsp:forward> - • Einfügen einer anderen JSP-Seite. Kontrolle an eine andere JSP-Seite weitergeben. <jsp:param> - Parameterwerte an durch <jsp:include> oder <jsp:forward> verwendete Seiten weitergeben. JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 35 JSP XML-Syntax <jsp:declaration> ... <jsp:declaration> <%! ... %> <jsp:expression> ... <jsp:expression> <%= ... %> <jsp:scriptlet> ... <jsp:scriptlet> <% ... %> ... Regeln: • • • • Einfache Anführungszeichen entsprechen doppelten. Leerzeichen bei Zuweisungen von Attributwerten sind nicht erlaubt. JSP und XML Syntax darf in einer Seite nicht gemischt werden. Alle Tags sind case sensitive. Gesamte Syntax: • • JSP_Syntax_card12.pdf http://java.sun.com/products/jsp/docs.html JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 36 Trennung Logik / Aussehen über Beans <jsp:useBean id="Bean-Instanzname" scope="page | request | session | application" { class="Qualifizierter Klassenname" [type="Qualifizierter Klassenname"] | beanName="Qualifizierter Klassenname | <%! … %>" type="Qualifizierter Klassenname" | type="Qualifizierter Klassenname" } {</> | > weitere Elemente </jsp:useBean> } <jsp:getProperty name="Bean-Instanzname" property="Property-Name"/> <jsp:setProperty name="Bean-Instanzname" ( property="*" | property="Property-Name" [param="Parameter-Name"] | property="Property-Name" value="String | <%! … %>" ) {} … Gruppierung /> | … Alternative [] … Option JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 37 Beispiel: Bean <%@ page language="java" contentType="text/html" %> <html><head><title>JSP 1</title></head><body> <jsp:useBean id="textBean" scope="page" class="Beans.Text" /> <jsp:setProperty name="textBean" property="*" /> Letzte Eingabe: <jsp:getProperty name="textBean" property="text" /> <form name="text" action="bean.jsp" method="get"> <input type="text" name="text"/> <input type="submit" name="action" value="Senden"/> </form></body></html> package Beans; public class Text { private String text; public void setText(String text) { this.text = text; } public String getText() { return text; } } JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 38 Beispiel: Bean JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 39 Trennung Logik / Aussehen durch forward und redirect Anwendung zum Abfragen eines gültigen Passwortes (Anforderung Länge >= 8 Zeichen) pass.jsp: <%@ page language="java" contentType="text/html" %> <html><head><title>Password</title></head><body> <jsp:useBean id="pass" scope="request" class="Beans.Password" /> <% if (pass.isInitialized() && !pass.isValid()) { %> Passwort nicht g&uuml;tig (zu kurz).<br> <% } %> Bitte Passwort eingeben (min. 8 Zeichen): <form name="text" action="validate.jsp" method="post"> <input type="text" name="text" value="<%= (pass.isInitialized())?pass.getPassword():"" %>"/> <input type="submit" name="action" value="Senden"/> </form></body></html> JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 40 Trennung Logik / Aussehen durch forward und redirect validate.jsp: <%@ page language="java" %> <jsp:useBean id="pass" scope="request" class="Beans.Password"> <jsp:setProperty name="pass" property="password" param="text" /> </jsp:useBean> <% if (pass.isValid()) { response.sendRedirect("ready.jsp"); } else { %> <jsp:forward page="pass.jsp"/> <% } %> JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 41 Trennung Logik / Aussehen durch forward und redirect ready.jsp: <%@ page language="java" contentType="text/html" %> <html> <head><title>Password</title></head> <body> Danke f&uuml;r das g&uuml;tige Passwort. </body> </html> JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 42 JSPs in Servlets nutzen Warum? • • • Logik in Servlets. HTML in JSPs. Unterstützung durch entsprechende Werkzeuge. Wie? • javax.servlet.RequestDispatcher - • void include(ServletRequest req, ServletResponse res) - • <ServletContext>.getRequestDispatcher(String absolutPath) <ServletContext>.getNamedDispatcher(String name) <ServletRequest>.getRequestDispatcher(String path) Kontrolle behalten void forward(ServletRequest req, ServletResponse res) - Kontrolle weitergeben get/post Servlet response Browser include JSP 1 JSP 2 JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 43 Beispiel RequestDispatcher public class Test extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) { Object o = "Nur ein einfacher Test."; res.setContentType("text/html"); req.setAttribute("test", o); try { getServletContext() .getRequestDispatcher("/JSP/test.jsp") .include(req, res); } catch (Exception exc) { log(exc.getMessage()); } } } <html> <head><title>RequestDispatcher Test</title></head> <body> Value of "test": <%= request.getAttribute("test") %> </body> </html> JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 44 JSP Implizite Objekte Objekt ServletRequest: request ServletResponse: response • Wird normalerweise nicht benutzt. PageContext: pageContext HttpSession: session ServletContext: application JspWriter: out ServletConfig: config Object: page • Scope Request Page Page Session Application Page Page Page Wird normalerweise nicht benutzt. Throwable: exception Page JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 45 Zusammenfassung Dynamische Webseiten Sitzungen JSP ~ ASP/ASP.NET JSP: Trennung von Aussehen und Implementierung JSP/Servlet vs. Applet • • Ausführung am Server, Ergebnis: HTML Seite Applets: Ausführung am Client, Ergebnis: interaktives Programm JSP ist abstraktes Servlet JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 46 Konfiguration Download • Tomcat (Version 5) - • http://jakarta.apache.org/tomcat/ jetty (Version 5) - http://jetty.mortbay.org/jetty/ Konfiguration • server.xml - • Einrichten der Kontexte web.xml - Für alle Webanwendungen Keine speziellen Konfigurationen! JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 47 web.xml (Schemadefinitionen, Versionen 2.3, 2.4 und 2.5) <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <!-- ... --> </web-app> <?xml version="1.0" encoding="ISO-8859-1"?> <web-app 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"> <!-- ... --> </web-app> <?xml version="1.0" encoding="ISO-8859-1"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- ... --> </web-app> JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 48