java servlets - johannes kepler university linz · praktikum aus softwareentwicklung 2 java...
TRANSCRIPT
Praktikum aus Softwareentwicklung 2
1Java Praktikum – SS 2010 – [email protected]
Java Servlets
Praktikum aus Softwareentwicklung 2
Praktikum aus Softwareentwicklung 2
2Java Praktikum – SS 2010 – [email protected]
Java Servlets
• Architektur– Merkmale, Servlet-Methoden, Lebenszyklus, …
• Sessions– Session Tracking API, Cookies, …
Praktikum aus Softwareentwicklung 2
3Java Praktikum – SS 2010 – [email protected]
ServletsMotivation
● Web-Browser als Benutzerschnittstelle für Anwendungen
● Standardisiert
● Keine Installation der Anwendung notwendig
● Web-Server implementiert Anwendungslogik
● Dynamische Generierung der Benutzerschnittstelle (CGI, SSI, Servlets, JSP, PHP etc.)
– Darstellung: HTML für GUI - http://de.selfhtml.org/index.htm
● HTTP als Kommunikationsprotokoll zwischen Server und Benutzerschnittstelle (Browser)
Praktikum aus Softwareentwicklung 2
4Java Praktikum – SS 2010 – [email protected]
ServletsArchitektur
Client
HTTP Response
Snoopy.html:
<HTML><BODY><P>Some text</P>
<FORM METHOD="GET“
ACTION="http://somehost.com:80/servlets/SnoopServlet">
<INPUT TYPE="submit" NAME="sendFile"
VALUE="Run the servlet">
</FORM>
...
Servlet 1
Server
Servlet 2
Servlet n
ServletRequest
ServletResponse
Dynamische Generierung
HTTP Request
Praktikum aus Softwareentwicklung 2
5Java Praktikum – SS 2010 – [email protected]
ServletsMerkmale
• Standardisiertes HTTP Server Interface● Servlets implementieren dieses Interface
• Servlets werden in einem "Container" ausgeführt● Die Servlet-Engine, ist zugleich HTTP-Server
• Zur Implementierung einer Client/Server Anwendung basierend auf HTTP
• Session Tracking API zur Simulation von Sessions in HTTP
Praktikum aus Softwareentwicklung 2
6Java Praktikum – SS 2010 – [email protected]
ServletsEntstehung
• ~1995 CGI (Common Gateway Interface)● Mechanismus zur Erweiterung der Funktionalität des Web● Schleche Performanz > FastCGI● Keine Interaktion mit Webserver, weil eigener Prozess (z.B. kann ein CGI-Prozess nicht in die Logdatei des Servers schreiben)
• 1996 stellt Netscape sogenannte "Server-side Applets" vor• 1996 präsentiert W3C "resources"
● server-seitige Java Module• 1997 Servlet - standardisierte Technologie• ~1999 Erweiterungen:
● SSI - Server Side Includes (Netscape, heute AOL)● ASP - Active Server Pages (Microsoft)● JSP - Java Server Pages (Sun Microsystems)
Praktikum aus Softwareentwicklung 2
7Java Praktikum – SS 2010 – [email protected]
ServletsHTTP Request/Response Interface
• HTTP ist definiert in RFC-2068 (www.ietf.org/rfc.html)• Browser (User-Agent) sendet Request
1. Zeile mit Requestmethode, z.B. GET oder POST, und URL-Pfad GET: Download von einer URL; ohne Body; Request-Parameter als Teil des URL sind möglich, z.B. /login?user=xxx
POST: wie GET, aber Parameter sind im Request-Body kodiert
Weiters PUT, DELETE, HEAD, OPTIONS, TRACE
Es folgen Header-Zeilen optional einen Request-Body (enthält z.B. Formulardaten)
• Server antwortet mit Response Statuszeile Header-Zeilen, z.B.: Content-Type, Cookies, etc. optional ein Response-Body, z.B. HTML, GIF, etc.
Praktikum aus Softwareentwicklung 2
9Java Praktikum – SS 2010 – [email protected]
ServletsWebapplication - <name>.war
• Web Archive (WAR) als Standard– Das Executable einer Web Applikationen als ZIP– Installation und Ausführung auf Servlet Containern beliebiger Hersteller.– Definiert die Verzeichnisstruktur und das Verhalten einer Webapplikation
• Deployment Descriptor: web.xml
• Verzeichnisstruktur– /> *.html...– /META-INF/> Manifest– /WEB-INF/> web.xml
– .../classes/> class Files– .../lib/> Libraries (JARs)
Praktikum aus Softwareentwicklung 2
10Java Praktikum – SS 2010 – [email protected]
ServletsHTTP Servlet Methoden
import javax.servlet.*;
import javax.servlet.http.*;
public class SnoopServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {}
public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {}
public void doPut(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {}
public void doDelete(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {}
public void init(ServletConfig config) throws ServletException {}
public void destroy() {}
}
Praktikum aus Softwareentwicklung 2
11Java Praktikum – SS 2010 – [email protected]
ServletsLebenszyklus
• Methoden, die zur Steuerung überschrieben werden können, werden ausschließlich vom Servlet Container aufgerufen: void init(…); ...
void doXXX(…);
...
void destroy();
• Lebenszyklus:– Aufruf von init() nach dem Laden des Servlets– doXXX() bei Anfragen von Clients– Beim Beenden wird destroy() aufgerufen
Praktikum aus Softwareentwicklung 2
12Java Praktikum – SS 2010 – [email protected]
ServletsDeployment Deskriptor: web.xml
• Spezifikation der Servlets, Initialisierungsparameter und URLs (optional)<web-app>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>LoginServlet</servlet-class>
<init-param>
<param-name>foo</param-name>
<param-value>bar</param-value>
</init-param>
</servlet> ... <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/login</url-pattern>
</servlet-mapping> ... <session-config> <session-timeout>30</session-timeout> </session-config> </web-app>
Servlet-URL:http://localhost:8080/test/login
Praktikum aus Softwareentwicklung 2
13Java Praktikum – SS 2010 – [email protected]
ServletsInitialisierung
• Methode init()– Wird vor dem ersten doXXX()-Aufruf ausgeführt– throws UnavailableException, falls das Servlet nicht benutzbar ist
• Parameter für bestimmtes Servlet:getInitParameter("forwardURL");
<servlet> …
<init-param>
<param-name>forwardURL</param-name>
<param-value>/main</param-value>
</init-param> …
• Parameter für Applikation, also für alle Servlets: getServletContext().getInitParameter("name");
<web-app> …
<context-param>
<param-name>name</param-name>
<param-value>a_val</param-value>
</context-param> …
Praktikum aus Softwareentwicklung 2
14Java Praktikum – SS 2010 – [email protected]
ServletsHttpServletRequest
• Zugriff auf Header- bzw. Body-Daten des HTTP Request• HTTP-Parameter (Transparent GET oder POST)
– String param = request.getParameter(name);
– String[] params = request.getParameterValues(name);
– Enumeration p = request.getParameterNames();
– String q = request.getQueryString(); (für HTTP GET)• Session ID: getRequestedSessionId() - Session Tracking• Weitere Header-Daten
– z.B.: getRemoteHost(), getRemoteUser(), getLocale(),...• Body-Daten (POST)
– Parameter mit getParameter()– Header-Daten getContentType() und getContentLength()– getReader() für Textdaten bzw. getInputStream() für Binärdaten
Praktikum aus Softwareentwicklung 2
15Java Praktikum – SS 2010 – [email protected]
ServletsHttpServletResponse
• Header– response.setContentType(
"text/html; charset=ISO-8859-1");
– Weitere Methoden: setContentLength(len), addCookie(cookie), ...
– Auch request.getSession() kann implizit Header-Daten (Cookie) erzeugen
• Body erst nach den Header-Daten schreiben– PrintStream out=response.getWriter() für Textdaten
• Zeichencodierung entsprechend dem bei setContentTypeangegebenen charset
– response.getOutputStream() für Binärdaten
Praktikum aus Softwareentwicklung 2
16Java Praktikum – SS 2010 – [email protected]
ServletsGenerieren von HTML
• Das Generieren von HTML kann durch einfache println Anweisungen erfolgen. Z.B.
out=response.getWriter();
out.println("<HTML><HEAD><TITLE>Hello World</TITLE>");...
– Online HTML-Tutorial: http://selfhtml.teamone.de/html/
• Einen Weg zur Trennung von HTML und Java-Code stellt die Verwendung von Templates bzw. Server Side Include-Mechanismen dar, z.B. JSP (Java Server Pages)<HTML><HEAD><TITLE>Hello World</TITLE></HEAD>
<BODY><TABLE>
<% Iterator i=all.iterator();
while(i.hasNext()) { %><TR><TD> ...
Praktikum aus Softwareentwicklung 2
17Java Praktikum – SS 2010 – [email protected]
ServletsBeispiel „doGet()“
public void doGetPostRequest (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
PrintWriter out;
res.setContentType("text/html"); out = res.getWriter();
out.println("<html><head><title>Snoop Servlet</title></head>");
out.println("<body bgcolor=\"#FFFFFF\">");
out.println("<h1>Requested URL:</h1>");
out.println (getRequestURL ().toString ());
log(req.getRequestURL().toString ());
Enumeration e = req.getHeaderNames(); while (e.hasMoreElements()) {
String name = (String)e.nextElement();
out.println(" " + name + ": " + req.getHeader(name));
}
…
e = req.getParameterNames(); …
out.close();
}
Praktikum aus Softwareentwicklung 2
18Java Praktikum – SS 2010 – [email protected]
ServletsFehler, Logging
• Rückgabe von Fehlermeldungen an den Client durch die Methode sendError, z.B.public void doGet (HttpServletRequest req,
HttpServletResponse res) throws … … res.sendError(HttpServletResponse.SC_FORBIDDEN);
• Logging– Andwendungs-Logs mit Log4J oder Java Logging API…– Eintrag im Logfile des Servlet Containers… catch(Exception e) { log("oops", e);
Praktikum aus Softwareentwicklung 2
19Java Praktikum – SS 2010 – [email protected]
ServletsInteraktion via Browser
• Kontrollfluss: Links– HTML-Output eines Servlet enthält Links auf andere Servlets:
out.println("<A HREF=/MoreServlet>Weiter</A>");
• Datenfluss: Request-Parameter– HTTP-Request enthält Daten, die als Request-Parameter an das Ziel-Servlet übermittelt werden
– Als Teil der URL, z.B.: out.printf(
"<A HREF=\"/UserDetailServlet?userId=%s\">%s</A>%n",
user.getId(), user.getName());
– Felder in einem Formular, z.B.: out.printf(
"<FORM ACTION=\"/DeleteUserServlet\" METHOD=GET>"+
"<INPUT TYPE=HIDDEN NAME=userId VALUE=%s>"+
"<INPUT TYPE=SUBMIT VALUE=\"Delete!\"></FORM>%n",
user.getId());
Praktikum aus Softwareentwicklung 2
20Java Praktikum – SS 2010 – [email protected]
ServletsInteraktion am Server
• Kontrollfluss: Weitergabe eines Requests mittels RequestDispatcher, z.B.:RequestDispatcher d = req.getRequestDispatcher("ServletZwei");
– Delegation eines Request von ServletEins and ServletZweid.forward(request, response); es dürfen noch keine Response-Daten gesendet worden sein.
– Einbindung von ServletZwei in ServletEinsd.include(request, response); die Ausgabe der URL wird in den Response eingefügt.
• Datenafluss:– request.setAttribute(name, object) und
object = request.getAttribute(name)
– Servlet.getServletContext().setAttribute(name, object)object = Servlet.getServletContext().getAttribute(name)
Praktikum aus Softwareentwicklung 2
21Java Praktikum – SS 2010 – [email protected]
ServletsBeispiel: forward() und include()
public class PresentationServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
String item = req.getParameter("item");
if(item == null) {
req.setAttibute("exception", new Exception("Item not found"));
getServletContext()
.getRequestDispatcher("/servlet/ErrorServlet")
.forward(req, res);
} else {
res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.print("<HTML><HEAD><TITLE>Item " + item + "</TITLE>"+
"</HEAD><BODY>Item " + item + ":<P>");
getServletContext()
.getRequestDispatcher("/servlet/ItemServlet?item="+item)
.include(req, res);
out.print("</BODY></HTML>"); } } }
Praktikum aus Softwareentwicklung 2
22Java Praktikum – SS 2010 – [email protected]
Java Servlets
• Architektur– Merkmale, Servlet-Methoden, Lebenszyklus, …
• Sessions– Session Tracking API, Cookies, …
Praktikum aus Softwareentwicklung 2
23Java Praktikum – SS 2010 – [email protected]
ServletsMultithreading / Kontext
• Zugriffe auf den Server von mehreren Clients gleichzeitig – Ein Thread pro Client– Synchronisierung beim Zugriff auf gemeinsam verwendete
Objekte, z.B. static-Variablen
• Servlet Variablen sind nicht im Client Kontext– Nur ein Servlet Objekt für alle Clients in der Servlet-Engine– Aber: jeder Client hat sein 'eigenes' Request, Response,
Session Objekt– Daher: Instanzvariablen im Servlet vermeiden, sondern Objekte zu Session oder Request Speichern:
session.setAttribute("com.uni.MyParamBean",paramBean);session.getAttribute("com.uni.MyParamBean");
Praktikum aus Softwareentwicklung 2
24Java Praktikum – SS 2010 – [email protected]
ServletsSession Tracking
• Problem: Zustandslosigkeit von HTTP (state-less)– es gibt keine "Sessions", d.h., jeder Request wird individuell und unabhängig von den anderen betrachtet
– Client Kontext in Anwendungen notwendig ● Verschiedene Varianten um Zustandsinformation einem Request (Client) zuzuordnen:– (1) Versteckte Felder in Formularen– (3) Zustandsinformation in Link kodieren– (4) HTTP Cookies
– (5) Java Servlet Session Tracking API
Praktikum aus Softwareentwicklung 2
25Java Praktikum – SS 2010 – [email protected]
ServletsSession Tracking API (1/2)
• Ab Java Servlets 2.0• Unterstützung hängt vom verwendeten Server , z.B.
– werden Cookies verwendet, oder– URL Kodierung (falls Cookies nicht verfügbar sind)– URL-Kodierung mittels response.encodeURL(url);
• Jeder Benutzer eines Servers hat genau ein Session Objekt:HttpSession session = request.getSession();
• if (session.isNew())…– false: ein neues Session-Objekt mit Session ID wird erzeugt und im Servlet Container gespeichert, Session ID wird im Response mitgeschickt
– true: falls mit dem Request eine gültige Session ID mitgeschickt wurde• Session IDs als Cookies
– Alternativ kann die Session ID in URLs als Parameter kodiert werden
Praktikum aus Softwareentwicklung 2
26Java Praktikum – SS 2010 – [email protected]
ServletsSession Tracking API (2/2)
• Im Session-Objekt können sessionspezifische Daten gespeichert werden, z.B. Benutzername, temporäre Daten, etc.
– session.setAttribute(String name, Object value);– Object session.getAttribute(String name);– session.removeAttribute(String name);– Enumeration session.getAttributeNames();
• Eine Session hat eine begrenzte Gültigkeitsdauer– Explizite Invalidierung, z.B. beim Logout, mit
session.invalidate()
– Automatisch nach einer bestimmten Zeit, Default ist 30 min.: session.setMaxInactiveInterval(int seconds)
– Benachrichtigung über das Ende einer Session durch Implementierung von HttpSessionBindingListener
Praktikum aus Softwareentwicklung 2
27Java Praktikum – SS 2010 – [email protected]
Servlets Session Beispiel
• Verwenden von Sessions
…
HttpSession session = req.getSession(true);
…
out.println(
"<LI>Creation time <b>"+new Date(session.getCreationTime())+"</B>");
out.println("<LI>Session ID <b>"+session.getId()+"</B>");
out.println("<LI>Session is new <b>"+session.isNew()+"</B>");…
session.setAttribute("aKey", "aValue");
…
Enumeration attrs = session.getAttributeNames();
…
an=attrs.nextElement().toString();
out.println(
"<LI>Name <b>"+an+"</b>, value <b>"+session.getAttribute(an)+"</B>");
…
Praktikum aus Softwareentwicklung 2
28Java Praktikum – SS 2010 – [email protected]
ServletsArten von "Servlet-Variablen"
Sichtbarkeit LebensdauerArt der Variable
Attribute eines ServletContext
Attribute einer Session
Attribute eines ServletRequest
Instanzvariablen eines Servlet
Alle Servlets im ServletContext Bis zum Ende der Web-Applikation
Servlets im ServletContext, die Requests der Session behandeln
Methoden des Servlet
Servlets, die den Request behandeln
Bis zum Ablauf der Session
Servlet.init() bis Servlet.destroy()
Bis zum Ende der Request-Behandlung
Praktikum aus Softwareentwicklung 2
29Java Praktikum – SS 2010 – [email protected]
• Sun Spezifikationen mit Apache Tomcat– Java Servlets 2.2 + Tomcat 3.3– Java Servlets 2.3 + Tomcat 4 und 5.5– Java Servlets 2.4,2.5 + Tomcat 6– Java Servlets 3.0 (Draft – April 2010)
• Doku – Servlet API
– http://java.sun.com/products/servlet/
– Tomcat 6 – http://tomcat.apache.org/tomcat-6.0-doc/index.html
ServletsVersionen, Doku
Praktikum aus Softwareentwicklung 2
30Java Praktikum – SS 2010 – [email protected]
Ende der 4. Übung