HTML Request und Response - Institut für Informationssysteme

Werbung
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>Ü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) %>
Herunterladen