Accessi paralleli (one-shot) a servizio
SERVLET
…..
if (operazione.equals(“attori”) {
cerca nomi attori in DB}
else if (operazione.equals(“titoli”) {
cerca titoli film in DB}
else {genera saluto ad account }
…..
Web
server
stampa pagina di output su
PrintWriter
chiudi PrintWriter
Applicazione Web
browser2
browser1
Laboratorio di Servizi Web - servlet2
- Ardissono
1
Gestione interazione con utente
• Esempi di Servlet visti finora gestiscono
interazioni brevi (richiesta-risposta)
– Utente 2 chiede titoli film applicazione genera
pagina con lista di titoli film
– Utente 1 chiede nomi attori applicazione genera
pagina con lista nomi
– Utente 2 chiede nomi attori applicazione genera
pagina con lista nomi, senza tener conto che utente
aveva prima chiesto titoli di film. Le due richieste
considerate come interazioni separate (e in questo tipo
di applicazione non serve correlarle, ma ci sono casi
diversi)
Laboratorio di Servizi Web - servlet2
- Ardissono
2
Gestione interazione con utente - I
• Per navigazione in pagine statiche non serve
memorizzare dati utente
– continuazione dell’interazione è data da successione di
link seguiti da utente
– Es: piccolo libro ipertestuale implementato ad inizio
laboratorio come pagine HTML linkate
• Per interazioni brevi (richiesta-risposta) non
serve memorizzare dati utente (clickstream, dati
personali, …) durante interazione
– Utente fornisce dati utili mediante compilazione di
form e servizio immediatamente invocato passando dati
raccolti con form
Laboratorio di Servizi Web - servlet2
- Ardissono
3
Gestione interazione con utente - II
• Normali servizi accessibili da web prevedono interazioni
complesse e riconoscimento di sequenza di azioni eseguite
da utente durante interazione. Es:
– apri catalogo (automobili usate), visita pagina di prodotto (berline),
visualizza dettagli di auto X (FIAT marea, Alfa 156, Ford mondeo,
…)
– acquista automobile X (carrello spesa)
•
•
•
•
•
Scegli colore auto, cilindrata, …
Scegli optionals
Inserisci dati personali
Inserisci dati carta di credito
…
inserimento dati può
richiedere più passi
(compilazioni di form)
correlati
• serve meccanismo per tracciare sequenza di azioni
effettuate dallo stesso browser durante interazione
Laboratorio di Servizi Web - servlet2
- Ardissono
4
Protocolli di interazione stateless e stateful
• Protocollo stateless
– Ogni richiesta utente gestita in sessione diversa il
server non ha memoria delle precedenti richieste utente
– Es: HTTP 1.0
• Protocollo stateful
– permette di gestire risposte a richieste che dipendono da
contenuto di richiesta e da risultati di precedenti
richieste
– gestisce un canale (virtuale) di comunicazione che
permette di vedere richieste e risposte multiple come
parte della stessa connessione tra client e server
– Es: FTP, telnet
Laboratorio di Servizi Web - servlet2
- Ardissono
5
Sessione utente e stato di interazione
• Sessione utente
– Server riconosce richieste successive di stesso
browser come parte di una sola interazione
• Stato
– Server ricorda dati relativi a precedenti richieste
effettuate durante la sessione. Può rispondere a richieste
tenendo conto di quanto già fatto
– Es: mantenimento carrello spesa
NB: gestione sessioni utente è necessario per
gestire stato, ma non sufficiente
Es: HTTP 1.1 supporta sessioni utente ma non
stato di interazione
Laboratorio di Servizi Web - servlet2
- Ardissono
6
Tecniche di session tracking - I
Basate su scambio di token identificativo tra client
(C) e server (S):
• C invia richiesta HTTP a S
• S risponde associando token univoco T a risposta
• C invia ulteriori richieste associando token T, che
permette a S di riconoscere C
Client
C
Risposta con token
Richiesta con token
Laboratorio di Servizi Web - servlet2
- Ardissono
Server
S
7
Tecniche di session tracking - II
• URL Rewriting
– token inserito in URL di richieste eseguite da client
• Hidden form fields
– token inserito in campi nascosti delle form
• Cookies
– token inserito in header di HTTP request e response
• Sessioni che usano Secure Socket Layer (SSL)
– SSL usa protocollo di scambio di messaggi crittografati
HTTPS. Per stabilire connessioni, client e server
generano session keys (chiavi simmetriche per
crittografare e decrittare messaggi). Tali chiavi possono
essere usate per identificare client e sessione utente
Laboratorio di Servizi Web - servlet2
- Ardissono
8
URL rewriting
• Data HTTP request da client, server
– genera token identificativo di client, T
• Es: T= 2F392C7084114FADC082D9BA22D81957
– inserisce token come parametro di query in ciascun
link presente in pagina di risposta che invia a client:
sessionid=T
• Es: <a
href=“http://www.example.com/servlet/hello;sessionid=2F392
C7084114FADC082D9BA22D81957”> link </a>
• Così, per ogni link che utente può seguire,
HTTP request contiene anche parametro
supplementare sessionid, usato da server per
riconoscere client
Laboratorio di Servizi Web - servlet2
- Ardissono
9
• Cookie
Cookies
Browser può
disabilitare cookies
– informazione testuale inviata da server a client,
memorizzata su client e restituita da client a server ad
ogni richiesta HTTP
– contiene lista di coppie <nome, valore>, con attributi
addizionali (come campo commento, massimo tempo di
vita del cookie, …)
– scambiato tra client e server in header di ciascuna
HTTP request e response
• Web server invia cookie come segue (es)
– Set-cookie: uid=pippo; Domain=“.myserver.com”; Max-age=3600;
Path=“/”
nome del cookie: uid
valore del cookie: pippo
attributi: domain, ...
Laboratorio di Servizi Web - servlet2
- Ardissono
10
Session tracking con Servlets (JSP) - I
• Servlet utilizzano techniche di session tracking
(cookies, URL rewriting, vd dopo) per riconoscere
sequenza di azioni provenienti da stesso browser
• Servlet offrono infrastruttura per mantenere in
modo automatico dati relativi a sessione utente che
si vogliono ricordare durante sessione di
interazione
• permettono session tracking e mantenimento
stato di sessione utente
• NB: sessioni utente devono scadere secondo timeout per
non caricare troppo il server in caso utenti non chiudano
esplicitamente sessione
Laboratorio di Servizi Web - servlet2
- Ardissono
11
Session tracking con Servlets (JSP)
• Serve strumento per gestire dati relativi a sessione
utente (e.g., identificazione utente, stato
interazione, …)
Applicazione web
Web container
Web
server
Web
Web browser-1
browser-2
Servlet/JSP
Dati
U-session
1
Dati
U-session
2
Stato interazione:
Associato a HTTP requests
Laboratorio di Servizi Web - servlet2
- Ardissono
12
Accessi paralleli a servizio – interazione complessa
SERVLET
…..
if (operazione.equals(“passo1”) {
codice di passo 1 del servizio}
else if
(operazione.equals(“passo2”) {
codice di passo 2 del servizio}
else if …
else {codice conclusione servizio}
…..
stampa pagina di output su
PrintWriter
chiudi PrintWriter
Web
server
Applicazione Web
browser2
browser1
Per eseguire codice di passo x
potrebbero servire dati acquisiti in
passi precedenti di interazione
Laboratorio di Servizi Web - servlet2
- Ardissono
13
Session tracking con Servlet API
• Interfaccia javax.servlet.HttpSession incapsula
nozione di sessione utente
• Web container implementa HttpSession
• Interfaccia HttpServletRequest offre metodo
getSession() per accedere oggetto HttpSession
associato a richiesta utente (Http Request: GET,
POST, …)
HttpRequest
HttpSession
• getSession()
rappresenta sessione
utente individuale
Laboratorio di Servizi Web - servlet2
- Ardissono
14
getSession()
• se HTTP request non ha oggetto sessione associato
(prima richiesta, browser non accetta cookies, ...),
getSession() crea nuovo oggetto sessione e lo
restituisce al chiamante
• altrimenti restituisce oggetto sessione già associato a
richiesta in precedente interazione tra client e server
da metodi doGet e doPost di Servlet si può accedere
a sessione utente interrogando oggetto
HttpServletRequest passato come parametro
riconoscere utente!
Laboratorio di Servizi Web - servlet2
- Ardissono
15
Interfaccia HttpSession - session tracking
– String getId(): restituisce identificativo di sessione
(token, es: 2F392C7084114FADC082D9BA22D81957)
– long getLastAccessedTime(): restituisce numero di
millisecondi trascorsi da ultima richiesta del client
– int getMaxInactiveTime(): restituisce numero max di
secondi di attività della sessione tra due richieste utente
– boolean isNew(): true se sessione è stata creata da server
ma client non ha ancora inviato richiesta con session
token; false altrimenti
– void invalidate(): fa terminare sessione utente (es. per
logout)
– …..
Laboratorio di Servizi Web - servlet2
- Ardissono
16
Gestione di sessioni utente – esempio – Life0
• Sviluppiamo una Servlet che mantiene sessione
utente per ciascun utente (browser che si collega)
– Non salviamo ancora dati utente in oggetto sessione
– Imposto tempo massimo tra due richieste di utente pari
a 2 minuti
– La prima volta che utente invoca applicazione si crea
sessione nuova
– Se utente invoca di nuovo applicazione (da stesso
browser), prima di 2 minuti, si stampano dati di
sessione precedente
– Se passano più di 2 minuti, creazione di sessione nuova
(la precedente è scaduta)
Laboratorio di Servizi Web - servlet2
- Ardissono
17
Esempio - Life0 - I
package application.servlets;
http:130.192.241.1:10000/swebi/servlet/life0
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
Se attendo più di
2 minuti tra una
invocazione e
l’altra ottengo
sessione nuova
<servlet>
<servlet-name>life0</servlet-name>
<description> …. </description>
<servlet-class>application.servlets.Life0</servlet-class>
</servlet>
<session-config>
<!-- maxInactiveTime di servlets e JSP
dell’applicazione web, in minuti -->
<session-timeout>2</session-timeout>
</session-config>
web.xml
Laboratorio di Servizi Web - servlet2
- Ardissono
18
GET: invocazione
senza FORM
Esempio - Life0 - II
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.println("<html><head><title>Session” +
“Lifecycle 0 </title></head><body>");
HttpSession s = req.getSession();
Recupero oggetto
sessione da richiesta HTTP
out.print("<p>Stato della sessione: ");
Verifico se nuova
sessione o vecchia
if (s.isNew()) out.println(" nuova sessione</p>");
else out.println(" vecchia sessione</p>");
Laboratorio di Servizi Web - servlet2
- Ardissono
19
Esempio - Life0 - III
out.println("<p>ID di sessione: "+s.getId());
out.println("<br>Data di creazione: "
+ new Date(s.getCreationTime()));
out.println("<br>Max inactive time interval (in secondi): ”
+ s.getMaxInactiveInterval());
out.println("</p> </body></html>");
out.close();
}
}
Recupero e stampo informazioni
su sessione utente invocando
metodi di HttpSession
su oggetto sessione
Laboratorio di Servizi Web - servlet2
- Ardissono
20
Ancora session tracking
• Web container gestisce
– scambi di token tra client e server
– associazioni token-oggetti sessione utente
• Codice di Servlet accede a sessione utente come
oggetto associato a HttpServletRequest
• Normalmente session tracking effettuato usando
cookies che server invia a browser
• Se browser rifiuta cookies, web container può
passare a URL rewriting (bisogna invocare
metodi specifici)
Life0 non fa URL rewriting
provare a disabilitare cookies…
sessione sempre nuova...
Laboratorio di Servizi Web - servlet2
- Ardissono
21
Gestione di sessioni utente – Life
• Sviluppiamo Servlet che mantiene sessione utente
per ciascun utente (browser che si collega)
– Session tracking basato su URL rewriting
– invocazione Servlet come GET con specifica di
parametro “action” che indica azione da eseguire
• Se action = “invalida” invalido sessione utente
• Altrimenti ( “action”= null o action “newSession”) carico
pagina che visualizza stato della sessione
– Non salviamo ancora dati utente in oggetto sessione
– Imposto tempo massimo tra due richieste di utente pari a 2 minuti
Laboratorio di Servizi Web - servlet2
- Ardissono
22
Invalido
Laboratorio di Servizi Web - servlet2
- Ardissono
23
Nuova sessione
Laboratorio di Servizi Web - servlet2
- Ardissono
24
Laboratorio di Servizi Web - servlet2
- Ardissono
25
Life - session tracking con URL rewriting
… package e imports…
http:130.192.241.1:10000/swebi/servlet/life
public class Life extends HttpServlet {
String url;
public Life() {
url = "";
}
<servlet>
<servlet-name>life</servlet-name>
<description>
Descrizione della servlet di gestione sessioni utente
</description>
<servlet-class>application.servlets.Life</servlet-class>
</servlet>
<session-config>
<!-- maxInactiveTime di servlets e JSP
dell’applicazione web, in minuti -->
<session-timeout>2</session-timeout>
</session-config>
Laboratorio di Servizi Web - servlet2
- Ardissono
web.xml
26
Life - session tracking con URL rewriting - I
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
String azione = req.getParameter("action");
Leggo azione richiesta:
action = null (carica pagina)
invalida (termina sessione)
newSession (nuova sessione)
res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.println("<html><head><title>SessionLifecycle” +
“</title></head><body>");
HttpSession s = req.getSession();
Laboratorio di Servizi Web - servlet2
- Ardissono
27
Life - session tracking con URL rewriting - II
if (azione!=null && azione.equals("invalida")) {
Faccio terminare sessione
s.invalidate();
out.println("<p>Sessione invalidata!</p>");
url = res.encodeURL("life");
Abilito URL rewriting di indirizzo di Servlet (con alias):
130.192.241.1:1000/sweb40/servlet/life;sessionid=484A....?action=newSession
out.println("<p>Crea nuova <a href=\"" + url +
"?action=newSession\">sessione</a></p>");
}
Imposto GET con parametro
action=“newSession” per nuova
invocazione di Servlet
Laboratorio di Servizi Web - servlet2
- Ardissono
28
Life - session tracking con URL rewriting - III
else {
out.print("<p>Stato della sessione: ");
if (s.isNew())
out.println(" nuova sessione</p>");
else
out.println(" vecchia sessione</p>");
url = res.encodeURL("life");
out.println("<p>ID di sessione: "+s.getId() + “</p>”);
out.println("<p>Invalida <a href=\"" + url +
"?action=invalida\">sessione</a></p>");
out.println("<p>Ricarica <a href=\"" + url +
"\">pagina</a></p>");
}
altri link
out.println("</body></html>");
di chiamata della
out.close();
Servlet
}
}
Laboratorio di Servizi Web - servlet2
- Ardissono
29
Interazione con servlet Life
• Disabilitando cookies si vede che link di pagine
generate da Life includono token di sessione
• Riabilitandoli, non si vedono più i token… web
container gestisce session tracking via cookies o
URL rewriting, a seconda del browser utente
• Poichè le maxInactiveTime= 2 minuti, se si attende
prima di seguire i link da pagina generata da Servlet
si ottiene sessione nuova
• Se si segue link invalida, si ottiene sessione nuova
• Se si segue link ricarica, entro 2 minuti, si ottiene
sessione vecchia
Laboratorio di Servizi Web - servlet2
- Ardissono
30
Interfaccia HttpSession - stato sessione utente
Oggetto HttpRequest può contenere anche attributi
associati a sessione utente
Tali attributi sono usati per mantenere informazioni
su stato della particolare sessione utente
– void setAttribute(String attrName, Object attr):
salva attr, con nome attrName, in oggetto sessione
• Es: s.setAttribute(String “nome”, “pippo”)
• NB: potrei salvare oggetto complesso (e.g., Hashtable) con
molti dati utente
– Object getAttribute(String attrName): restituisce
oggetto associato a nome attrName in sessione utente
• Es: s.getAttribute(“nome”) Object che contiene stringa
“pippo”
Laboratorio di Servizi Web - servlet2
- Ardissono
31
Accesso ad attributi di sessione utente
• setAttribute() mantiene riferimento a oggetto java
se riferimento cambia bisogna rieseguire il
metodo (non se cambiano i campi dell’oggetto…)
• esiste anche removeAttribute() per rimuovere
attributo da sessione utente
• getAttribute(), setAttribute() e
removeAttribute() non sono synchronized se
più thread cercano di modificare una stessa
sessione utente si possono avere problemi
gestire mutua esclusione
Laboratorio di Servizi Web - servlet2
- Ardissono
32
Servlet stateful - esempio
• Stato di sessione utente può includere attributi che
contengono valori
• Attributi usati per salvare valori di dati acquisiti
durante interazione che si vogliono mantenere fino
a fine interazione (es. Nome utente, dati personali,
…)
• Sviluppiamo Servlet (life2) invocata da FORM
HTML con cui utente inserisce dati da usare
nell’applicazione
Laboratorio di Servizi Web - servlet2
- Ardissono
33
Laboratorio di Servizi Web - servlet2
- Ardissono
34
Interazione con Servlet stateful - life2
<HTML><HEAD> …. </HEAD>
http:130.192.241.1:10000/swebi/stato.html
<BODY>
<center>
<FORM ACTION="servlet/life2" METHOD="POST" >
<table align="center" width="100%" cellspacing="2" cellpadding="2">
<tr> <td align="right">Login:</td>
<td><input type="text" name="login" align="left" size="25"></td>
</tr>
<tr> <td align="right">Password:</td>
<td><input type="password" name="passwd" align="left" size="25"></td>
</tr>
</table>
<CENTER>
<INPUT TYPE="Submit" NAME="btnSubmit" VALUE="Submit request">
</CENTER>
</FORM>
</BODY></HTML>
Laboratorio di Servizi Web - servlet2
- Ardissono
35
Invalido
Laboratorio di Servizi Web - servlet2
- Ardissono
36
Nuova sessione
Laboratorio di Servizi Web - servlet2
- Ardissono
37
Ricarico pagina
Laboratorio di Servizi Web - servlet2
- Ardissono
38
Laboratorio di Servizi Web - servlet2
- Ardissono
39
Life2 - session tracking con stato
…package e imports…
public class Life2 extends HttpServlet {
String url = “”;
Metodo doPost serve
per gestire richiesta
da form stato.html
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
String loginName = req.getParameter("login");
HttpSession s = req.getSession();
// salvo login utente come attributo in stato di sessione
if (loginName!=null)
Salvo nome di
s.setAttribute("account", loginName);
login in stato
della sessione
….
Laboratorio di Servizi Web - servlet2
- Ardissono
40
Life2 - I
… prendo PrintWriter e stampo prima parte di pagina …
out.print("<p>Stato sessione: ");
if (s.isNew()) { stampo nuova sessione e loginName; }
else { out.println(" vecchia sessione:<br>");
Object l = s.getAttribute("account");
if (l!=null) out.println(" login utente: "+l.toString() + “</p>”);
else out.println(" utente sconosciuto </p>"); }
url = res.encodeURL("life2");
out.println("<p>ID di sessione: "+s.getId());
out.println("<br>Creazione: "+new Date(s.getCreationTime()) + “</p>”);
out.println("<p>Invalida <a href=\"" + url +
"?action=invalida\">sessione</a></p>");
out.println("<p>Ricarica <a href=\"" + url + "\">pagina</a></p>");
out.println("</body></html>");
out.close();
}
Laboratorio di Servizi Web - servlet2
- Ardissono
41
NB: doGet + doPost
• Servlet life2 deve poter gestire richieste:
– da form HTML (POST)
– da link in pagina HTML (GET): es. Ricarica pagina,
invalida sessione,…
• non basta implementare metodo doPost:
bisogna anche implementare metodo doGet
• A seconda del tipo di chiamata (da form, da click
su link ipertestuale) eseguito metodo opportuno
Laboratorio di Servizi Web - servlet2
- Ardissono
42
Life2 - II
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
… prendo PrintWriter e stampo prima parte di pagina …
String azione = req.getParameter("action");
HttpSession s = req.getSession();
Metodo doGet serve
per gestire richieste
GET da pagine
generate da Servlet
if (azione!=null && azione.equals("invalida")) {
s.invalidate();
out.println("<p>Sessione invalidata!</p>");
url = res.encodeURL("life2");
out.println("<p>Crea nuova <a href=\"" + url +
"?action=newSession\">sessione</a></p>");
}
Laboratorio di Servizi Web - servlet2
- Ardissono
43
Metodo doGet è
relativamente simile
a doPost perchè
bisogna generare
pagine simili tra
else { out.print("<p>Stato della sessione: ");
loro (utente non
if (s.isNew()) {
deve accorgersi di
out.println(" nuova sessione</p>");
differenze in UI)
Life2 - III
Object l = s.getAttribute("account");
if (l!=null) stampo login utente;
else stampo utente sconosciuto; }
else {
stampo vecchia sessione;
ricavo login utente da stato e lo stampo;
else stampo utente sconosciuto;
out.println("</p>");
}
Laboratorio di Servizi Web - servlet2
- Ardissono
44
Life2 - IV
url = res.encodeURL("life2");
out.println("<p>ID di sessione: "+s.getId());
out.println("<br>Data di creazione: "+new Date(s.getCreationTime()));
out.println("</p>");
out.println("<p>Invalida <a href=\"" + url +
"?action=invalida\">sessione</a></p>");
out.println("<p>Ricarica <a href=\"" + url + "\">pagina</a></p>");
}
out.println("</body></html>");
out.close();
} // chiusura metodo doGet
} // chiusura Servlet
Laboratorio di Servizi Web - servlet2
- Ardissono
45
Riassumendo - contesto di applicazione
• insieme di parametri di configurazione comuni
a tutte le Servlet e JSP che appartengono
all’applicazione
– Es: session-timeout che specifica maxInactiveTime
• include dichiarazioni di Servlet e JSP (es: alias
per invocazione, …)
• si possono anche salvare nel contesto attributi,
che rappresentano lo stato dell’applicazione
intera e possono essere usati da Servlet e JSP per
recuperare dati su stato dell’applicazione, ma non
lo vediamo
Laboratorio di Servizi Web - servlet2
- Ardissono
46
Riassumendo - sessione utente
• Associata a token identificativo di utente
• Oggetto complesso, può mantenere attributi che
rappresentano stato di sessione utente
• Accessibile da ogni oggetto di tipo HTTPRequest
Servlet può aggiornare stato man mano che
gestisce richieste utente
• Nel nostro esempio abbiamo gestito uno stato che
includeva solo l’account dell’utente; in generale,
lo stato può essere molto più complesso, es.,
shopping cart di negozio elettronico
Laboratorio di Servizi Web - servlet2
- Ardissono
47
Collaborazione tra Servlet - I
• Esempi visti: servizio implementato da una sola
Servlet (es, Life, Life2, Informazioni, ...). Servlet
– riceve richiesta (GET o POST)
– esegue metodo (doGet, doPost) per gestire richiesta e
preparare risposta (pagina html)
– restituisce risposta a web server
• MA, una Servlet può invocare altre Servlet (o
JSP) per svolgere parte del servizio. Per esempio:
– invocazione di altra servlet per creazione di porzione
fissa di pagina
– invocazione di JSP per generazione pagina risposta
– Invocazione di pagina statica HTML!!
– ...
Laboratorio di Servizi Web - servlet2
- Ardissono
48
Collaborazione tra servlet - II
Response
Utente
registrato
support.html
POST
include
BannerGen
TechSupport
Utente non registrato
register.html
POST
forward
Servlet
diverse
Register
Laboratorio di Servizi Web - servlet2
- Ardissono
49
Request dispatching - I
• Permette di redirigere (forward) una HTTP request
ad altra Servlet/JSP/pagina HTML
• Destinatario del forward si occupa di gestire
richiesta
• Per redirigere richiesta serve riferimento ad altra
entità (risorsa web)
• Interfaccia RequestDispatcher incapsula tale
riferimento e può essere usato per invocare altre
risorse (le rappresenta)
Laboratorio di Servizi Web - servlet2
- Ardissono
50
Request dispatching - II
• Per ottenere oggetto RequestDispatcher (riferimento a
specifica risorsa, e.g., Servlet, JSP o pagina html) Servlet
TS invoca contesto di applicazione
Servlet con alias possono
essere invocate per nome
– RequestDispatcher rd =
getServletContext().getNamedDispatcher(“response”)
Risorse statiche sono
invocate con path relativo
– RequestDispatcher rd1 =
getServletContext().getRequestDispatcher(“/register.html”)
Laboratorio di Servizi Web - servlet2
- Ardissono
51
Request dispatching - III
• Ottenuto oggetto RequestDispatcher, TS può delegare
esecuzione di operazioni
Risorse invocate gestiscono
– rd.forward(req, res);
– rd1.forward(req, res);
richiesta e rispondono a
utente. TS perde controllo
di interazione
• TS può anche includere nella propria risposta il
risultato dell’esecuzione della risorsa invocata
TS include in pagina html il
banner generato da Servlet invocata
– RequestDispatcher rd =
getServletContext().getNamedDispatcher(“banner”);
– rd3.include(req, res);
Laboratorio di Servizi Web - servlet2
- Ardissono
52
Request dispatching - IV
public void doGet(HttpRequest req,
HttpResponse res) …
out.println(“<html>”….);
out.println(“Thank you, your request has been” +
“recorded and will be responded to” +
“within 3 three business days.”);
RequestDispatcher rd3 =
getServletContext().getNamedDispatcher(“banner”);
rd3.include(req, res);
out.println(“</body></html>”); out.close();
Laboratorio di Servizi Web - servlet2
- Ardissono
53