Universität zu Lübeck Institut für Informationssysteme Einführung Servlets/JSPs HTML HyperText Markup Language • Sprache, in der Webseiten geschrieben sind <html> <head> <title>Eine Beispielseite</title> </head> <body> <h1>&Uuml;berschrift</h1> <p>Ein ziemlich sinnfreier Text, der nur demonstrieren soll, was HTML ist</p> </body> </html> HTML Request und Response • • HTTP Request (Client: Browser, Programme) – URL http://server:port/pfad/seite?param1=wert1&param2=wert2 http://localhost:8080/demo/add?x=12&y=13 – Methode (GET/POST/…) – Body (z. B: Parameter bei POST, Datei-Uploads…) – Diverse andere Informationen (Header) HTTP Response (Web-Server) – Angeforderte Datei (HTML, GIF, …) – Diverse andere Informationen (Header) Servlet API • Anwendungsprogrammierschnittstelle für server-seitige Java-Programme • Servlet: gewöhnliche Java-Klasse, mit der sich der Webserver beliebig erweitern läßt • Servlets stellen Dienste für den Client bereit, die dieser anfragen kann • Anfrage und Antwort über Datenströme • Servlet API bietet Unterstützung für Cookies und ein Session-Management Servlet Implementierung • Typisch: Unterklasse von HttpServlet oder GenericServlet • doGet() oder/und doPost() überschreiben • Alternativ: service() überschreiben HelloWorld Servlet 1:import java.io.*; 2:import java.util.Date; 3:import javax.servlet.*; 4: 5:public class HelloWorld extends javax.servlet.GenericServlet { 6: public void service(ServletRequest req, ServletResponse res){ 7: res.setContentType("text/html"); 8: PrintWriter out = res.getWriter(); 9: Date d = new Date(); 10: out.println("<html><head></head><body>" + 11: "Hello World am " + d.toString() + 12: "</body></html>"); 13: } 14:} Aufruf eines Servlets • Anfrage: HTTP Request – URL in Browser eingeben (GET) – HTML Link klicken (GET) – HTML Formular abschicken (GET/POST) • Verarbeitung: Parameter holen, Datenbank abfragen, Berechnungen durchführen etc. • Ergebnis: HTTP Response – Wird vom Browser angezeigt – Evtl. automatisch weitere Requests, etwa Bilder Input und Output • Request-Objekt enthält Anfrageparameter request.getParameter(String paraName) • Response-Objekt stellt Ausgabekanal zur Verfügung response.getWriter() für Textausgabe response.getOutputStream() für Binärdaten GET-Methode mit Hyperlink <html> <head> <title>Calculator</title> </head> <body> <a href="servlet/sep.CalculatorServlet?x=12&y=13"> Berechnung starten </a> </body> </html> GET-Methode mit Formular <html> <head> <title>Calculator</title> </head> <body> <form action="servlet/sep.CalculatorServlet"> X: <input type="text" name="x"> Y: <input type="text" name="y"> <input type="submit"> </form> </body> </html> POST-Method (nur Formular) <html> <head> <title>Calculator</title> </head> <body> <form action="servlet/sep.CalculatorServlet" method="post"> X: <input type="text" name="x"> Y: <input type="text" name="y"> <input type="submit"> </form> </body> </html> Vergleich GET/POST • GET Methode – Parameter sind Bestandteil des URLs ->Bei Bookmarks werden Parameter mitgespeichert ->Ungeeignet für Passwörter – Links benutzen automatisch GET Methode • POST Methode – Parameter werden im Body des Requests übertragen – Notwendig z.B. bei Datei-Upload • • • • • • • • • • • • • • • • • • • • • • import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class CalculatorServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int x = Integer.parseInt(request.getParameter("x")); int y = Integer.parseInt(request.getParameter("y")); PrintWriter out = response.getWriter(); out.println("<html><head><title>MyCalc</title></head>"); out.println("<body>"); out.println("Berechnung: "+x+" + "+y+" = " + (x+y)); out.println("</body>"); out.println("</html>"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } Web-Applikation • $TOMCAT_HOME/webapps/myapp • Struktur des Verz. myapp: – WEB-INF • web.xml • classes (eigene Klassen, Package-Struktur beachten!) • lib (Hilfsbibliotheken, z.B. db2java.zip, upload.jar) – index.html (index.jsp) & mgl. andere Dateien/Verz. • http://host:port/myapp/servlet/mypackage.MyServlet • Servlet-Mapping: in Datei web.xml. Zugriff dann über • http://host:port/myapp/myservlet Servlet: Vor- u. Nachteile • Vorteil: sehr flexibel • Nachteil: HTML ist in Java-Quellcode eingebettet – Unübersichtlich – HTML-Editoren können nicht benutzt werden – Kein Syntax-Highlighting von HTMLQuellcode • Alternative: Java Server Pages (JSP) Java Server Pages • JSP-Seiten als normale HTML-Seite geschrieben ("Template", statischer Teil), vermischt mit ein wenig Java (dynamischer Teil) • Java in speziellen "tags", z.B. <%...%> • JSP-Dateien müssen die Endung .jsp haben • JSP wird in ein Java-Servlet übersetzt, welches dann kompiliert wird. • Das Servlet arbeitet in der gewohnten Art und Weise. Browser sieht nur HTML Beispiel <HTML> <BODY> Hello! The time is now <%= new java.util.Date() %> </BODY> </HTML> • Äquivalent: Hello! The time is now <% out.print(new java.util.Date()) %> JSP-Syntax • Verschiedene JSP “tags” für versch. Zwecke • <%= expression %> – expression ist evaluiert. Das Ergebnis in die HTML Seite eingefügt • <% code %> – code wird in service-Methode des Servlets eingefügt – Diese Konstruktion: scriptlet • <%! declarations %> – Die declarations werden in die Servlet-Klasse, nicht in eine Methode eingefügt • <%-- JSP Kommentar --%> (<!-- HTML -->) JSP: Vordefinierte Variablen • request: das HttpServletRequest-Objekt • response: das HttpServletResponse-Objekt • session: die HttpSession assoziiert mit dem Request oder null wenn es keine Session gibt • out: JspWriter (ähnlich PrintWriter) zum Senden von Daten an den Client • Beispiel: Your hostname: <%=request.getRemoteHost() %> • Äquivalent: Your hostname: <%out.print(request.getRemoteHost()) %> Deklaration und Direktive • Global, beeinflußen das ganze Servlet • <%@ Direktive %> • Am wichtigsten: page-Direktive • <%@ page import="java.util.*" %> • Deklarationen: Definitionen von Variablen und Methoden <%! static final int PI = 3.1415926536; double u(double radius) { return 2*PI*r; } %> • Benutzung in der Seite: Umfang des Einheitskreises: <%= u(1.0) %>