java servlets - johannes kepler university linz · praktikum aus softwareentwicklung 2 java...

30
Praktikum aus Softwareentwicklung 2 1 Java Praktikum – SS 2010 – [email protected] Java Servlets Praktikum aus Softwareentwicklung 2

Upload: others

Post on 08-Jul-2020

3 views

Category:

Documents


0 download

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

8Java Praktikum – SS 2010 – [email protected]

ServletsKlassen

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