Sie sind auf Seite 1von 31

Servlets Vertiefung

Statuscodes, Request Dispatcher, Session Tracking,


Prof.DIDr.ErichGams
htlwels.e.gams@eduhi.at

Verteilte Systeme und Datenbanken HTL-Wels 2010

bersicht Was lernen wir?

LebenszykluseinesServlets
Statuscodes
Redirect
SessionTracking
Request Dispatcher

2010Prof.DIDr.ErichGams

Seite2

WH Kommunikation

2010Prof.DIDr.ErichGams

Seite3

Lebenszyklus eines Servlets

2010Prof.DIDr.ErichGams

Seite4

Lebenszyklus eines Servlets


(2)
DerLebenszykluseinesServlets imDetail:
Ladenundinstanziieren
EntwederbeimStartdesServletContainers oderbeider
erstenAnfrage

Initialisieren
DieinitMethode desServlets wirdaufgerufen
HierkanndasServlet Initialisierungsaufgabenerledigen,
z.B.eineDatenbankverbindungherstellenoder
KonfigurationsdatenauseinerDateieinlesen
2010Prof.DIDr.ErichGams

Seite5

Lebenszyklus eines Servlets


(3)
ClientAnfragenbearbeiten
DieserviceMethode desServlets wirdaufgerufen
DieseMethodeberprftdenHTTPAnfragetyp undleitetdieAnfrageandie
richtigeMethodeweiter,z.B.doGet,doPost
DieMethodenknnenaufeinObjektvonTypServletRequest zugreifen,das
ZugriffaufalleDatenderAnfrageermglicht
AnaloghabendieMethodenZugriffaufeinObjektvomTypServletResponse,
mitdessenHilfedieAntwortandenClientgeschicktwird
BeieinemHTTPServlet sinddieObjektevomTypHttpServletRequest bzw.
HttpServletResponse

ServletKlasse wiederentladen
DerServlet Containerentscheidet,wanndieServletInstanz wiederausdem
Speicherentferntwird
VorherwirddieMethodedestroy aufgerufen
2010Prof.DIDr.ErichGams

Seite6

HTTP Statuscodes

2010Prof.DIDr.ErichGams

Seite7

Statuscode setzen
response.setStatus(int statusCode)
VerwendeKonstantenausHttpServletResponse (Keineints)
Z.B.:SC_OK,SC_NOT_FOUND,etc.

response.sendError(int code,Stringmessage)
EineNachrichtwirdinHTMLverpackt

response.sendRedirect(String url)
StatusCode302
Location imResponseHaeder sollgesetztwerden
2010Prof.DIDr.ErichGams

Seite8

Hufige Statuscodes
200(OK)
Everything is fine;document follows.
Defaultfor servlets.

204(NoContent)
Browsershould keep displaying previous document.

301(Moved Permanently)
Requested document permanently moved elsewhere (indicated inLocation
header).
Browsersgo tonew location automatically.
Browsersare technically supposed tofollow 301and302(next page)requests
only when the incoming request is
GET,but doit for POSTwith 303.Either way,the Location URLis retrieved with
GET.

2010Prof.DIDr.ErichGams

Seite9

Hufige Statuscodes
302(Found)
Requested document temporarily moved elsewhere(indicated inLocation
header).
Browsersgo tonew location automatically.
Servlets should use sendRedirect,not setStatus,when
setting this
header.Seeexample.

401(Unauthorized)
Browsertried toaccess passwordprotected page without
Authorization header.

proper

404(NotFound)
Nosuchpage.Servlets should use sendError toset this.
Problem:InternetExplorerandsmall (<512bytes)error pages.IEignores small
error page by default.
Fun andgames:http://www.plinko.net/404/

2010Prof.DIDr.ErichGams

Seite10

Redirect
@WebServlet("/wrongdestination")
public class WrongDestination extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
StringuserAgent =request.getHeader("UserAgent");
if ((userAgent !=null)&&(userAgent.contains("MSIE")){
response.sendRedirect("http://home.mozilla.com");
}else {
response.sendRedirect("http://www.microsoft.com");
}
}
}

2010Prof.DIDr.ErichGams

Seite11

Redirect
CLIENT

SERVER

http://..formular1

Get Request

Response
Status 302
Location ant2.html
http://..ant2.html

Get Request
Response

2010Prof.DIDr.ErichGams

Servlet: formular1

res.sendRedirect(ant2.html);

ant2.html
<HTML>

</HTML>
Seite12

Interaktion zwischen Servlets

2010Prof.DIDr.ErichGams

Seite13

Sessionverwaltung
Problem:
VieleBenutzerkommunizierengleichzeitig
mitdemServer
WelcheRequests gehrenzuwelchem
Benutzer?

Glcklicherweise:Servlet Engine macht


diemeisteArbeit
2010Prof.DIDr.ErichGams

Seite14

Session Tracking mit Cookies


Idea: associate cookie with data on server
String sessionID = makeUniqueString();
HashMap sessionInfo = new HashMap();
HashMap globalTable = findTableStoringSessions();
globalTable.put(sessionID, sessionInfo);
Cookie sessionCookie =
new Cookie("JSESSIONID", sessionID);
sessionCookie.setPath("/");
response.addCookie(sessionCookie);

Cookies knnendeaktiviert sein


Cookie,dasdieSessionspeichert,extrahieren
VerwaltenineigenerStruktur
GenerierungUniqueID

2010Prof.DIDr.ErichGams

Seite15

Session Tracking mit URL Rewriting


ClienthngtdieSessionDatenandieURLan.
SerververwalteteineSessionID
simpelundfunktioniertbeiallenBrowsern(ohne
Cookies)
unschn,dadieKennungenzusehensind,(werdenin
Bookmarksbernommen,Verlinkungvonanaderen
Seiten)
Mssendynamischgeneriertwerden
http://host/path/file.html;jsessionid=1234
2010Prof.DIDr.ErichGams

Seite16

Session Tracking mit Hidden Form Fields


Idee:
<INPUTTYPE="HIDDEN"NAME="session"
VALUE="...">

Funktioniert ohne Cookies


Informationmssenimmerdynamischmit
eingebautwerden.
AlleSeitenmssenForms beinhalten
2010Prof.DIDr.ErichGams

Seite17

Servlet API und Session Tracking


ServletAPI undbietetdieKlasseHttpSession >
eineBibliothekfrdieVerwaltungeiner
Sitzung.
basiertaufCookies oderURLRewriting
EinSitzungsobjektverwaltetauchselbststndig
ineinerDatenstrukturdiegesichertenDaten.

2010Prof.DIDr.ErichGams

Seite18

Session Tracking

public void doPost (HttpServletRequest req,HttpServletResponse res)


throws ServletException,IOException {
...
HttpSession session =req.getSession(true);
...
//schreibenderZugriffaufdasSessionObjekt
session.setAttribute("warenkorb",myWarenkorb);
...
//lesenderZugriffaufdasSessionObjekt
myWarenkorb =(Vector)session.getAttribute("warenkorb");
...
//Eintragentfernen
session.removeAttribute("warenkorb");
}
2010Prof.DIDr.ErichGams

Seite19

Session Tracking: hinter den Kulissen


Servlet Container
Http Request

Http Session 1

HTML
Client 1
Cookie
Web
Server
Http Request

Servlet
Http Session 2

HTML
Client 2
Cookie

2010Prof.DIDr.ErichGams

Seite20

Beenden der Session

Explizit:
session.invalidate();
Timeout:
Programmatisch:
session.setMaxInactiveInterval(120);
ImDD:
<sessionconfig>
<sessiontimeout>120</sessiontimeout>
</sessionconfig>
2010Prof.DIDr.ErichGams

Seite21

Sichtbarkeitsobjekte
WebAnwendung
javax.servlet.ServletContext
ClientSitzung
javax.servlet.http.HttpSession
Request
javax.servlet.ServletRequest
Methoden:

java.util.Enumeration getAttributeNames()
void setAttribute(String name,Object object)
Object getAttribute(String name)
void removeAttribute(String name)

2010Prof.DIDr.ErichGams

Seite22

Servlets
Arten von "Servlet-Variablen"
Art der Variable
Attribute eines
ServletContext

Sichtbarkeit

Lebensdauer

Alle Servlets im ServletContext

Bis zum Ende der WebApplikation

Servlets im ServletContext, die


Requests der Session behandeln

Bis zum Ablauf der Session

Instanzvariablen
eines Servlet

Methoden des Servlet

Servlet.init() bis
Servlet.destroy()

Attribute eines
ServletRequest

Servlets, die den Request


behandeln

Bis zum Ende der


Request-Behandlung

Attribute einer
Session

2010Prof.DIDr.ErichGams

Seite23

Interaktion zwischen Servlets


(via Client)

Kontrollflu:URLs
DerHTMLOutputeinesServlet kannLinksaufandereServlets enthalten,
out.println("<A HREF=/MoreServlet>Weiter</A>");
DieEntscheidung,obbzw.welchesServlet aufgerufenwird,liegtbeimClient

Datenflu:RequestParameter
HTTPOutputenthltDaten,diealsRequestParameter andasZielServlet bermittelt
werden
AlsTeilderURL,z.B.:out.println("<A HREF=\"
/UserDetailServlet?userId=" +user.getId()+ "\">" +
user.getName() + "</A>");
FelderineinemFormular,z.B.:
out.println("<FORM ACTION=\"/DeleteUserServlet\" METHOD=GET>"+
"<INPUT TYPE=HIDDEN NAME=userId VALUE=" +user.getId()+ ">"+
"<INPUT TYPE=SUBMIT VALUE=\"Delete!\"></FORM>");
NurStringDatensindmglich;Alternative:SessionAttribute
2010Prof.DIDr.ErichGams

Seite24

Kommunikation zwischen Servlets

IndoGet oderdoPost:
ServletContext context =getServletContext();
...
RequestDispatcher dispatcher =
context.getRequestDispatcher("/myServlets.Servlet1");
...
//evtl.
req.setAttribute(name,value);
...
dispatcher.include(req,res);
//oder
dispatcher.forward(req,res);

2010Prof.DIDr.ErichGams

Seite25

Request Dispatcher
forward DieKontrollewirdvollstndiganein
anderesServlet abgegeben(Esdrfennoch
keineDatengesendetwordensein)
include LediglichdasResultateinesweiteren
Servlets wirdeingebettet("wrapping")

2010Prof.DIDr.ErichGams

Seite26

Request Dispatcher
CLIENT
http://..formular1

SERVER
Get Request

Response
2010Prof.DIDr.ErichGams

Servlet: formular1

res.sendRedirect(ant2.html);

ant2.html
<HTML>

</HTML>
Seite27

Beispiel: 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>"); } } }

2010Prof.DIDr.ErichGams

Seite28

Any requests?

2010Prof.DIDr.ErichGams

Seite29

Aufgabe 1

ImplementiereeinServlet,welchesdiverseInformationen
berdenRequest unddenContaineranzeigensoll.

RequestInformation:Req.URL,HttpHeader,Req.Parameter,Client
IPundHost,DatumundZeit desRequest,RequestMethode (POST
oder GET),QueryString bei Methode GET,RequestSchemaund
Protokoll
ServerundServlet Informationen:Servername,Serverport,Servlet
Pfad,EchterPfadmitContext,Servlet Context Name,Container
Name,Servlet Version.

DasServlet solleineStartseitemit2Linksbeinhalten,welche
diebeidenobenbeschriebenenInformationabrufen.
Rcklinks aufdieStartseite sollen auch gesetzt werden!

2010Prof.DIDr.ErichGams

Seite30

Aufgabe 2 : Werbe-Banner

EntwickelnSieeinServlet,dasbeijedemAufrufeinneuesBildauseinemVerzeichnisdes
WebServerszurckliefert.ImplementierenSieaufdieseArtundWeiseeineneinfachen
WerbebannerMechanismus.
ZumBsp.:AmWebServerliegenimVerzeichnisc:\temp\images folgendeBilder:

img01.gif
img02.jpg
img03.gif

BeispielHTMLSeite:
<html><head><title>Banner Test</title></head>
<body><img src="/myWebapp/imgbanner?basedir=c:\temp\images"></body>
</html>

BeimerstenAufrufdieserHTMLSeitesolldasBild"img01.gif"angezeigtwerden,danach
"img02.gif",dann"img03.gif"unddannwieder"img01.gif"usw.DasVerzeichnisderBilder
wirdbereinenRequest Parameterangegeben.VerwendedieSessionAPIumden
Zustand desClientszuspeichern,sodassfrjedenClientdieReihenfolgeeingehalten
wird.

2010Prof.DIDr.ErichGams

Seite31