Servlet API - Corsi di Laurea a Distanza

© M. Badella G. Malnati, 2003-04
Servlet API
Programmazione in
Ambienti Distribuiti
A.A. 2003-04
© M. Badella G. Malnati, 2003-04
Servlet
‰Interfaccia Java che modella il paradigma
richiesta/elaborazione/risposta tipico delle
applicazioni lato server
‰Presuppone l’esistenza di
¾ un contenitore che cattura gli invarianti di sistema
(gestione degli accessi via rete, gestione delle
sessioni, meccanismi di configurazione e di
gestione, …)
¾ un insieme di classi che implementano
l’interfaccia e forniscono la logica applicativa
concreta da applicarsi ad una data richiesta
Programmazione in Ambienti Distribuiti
2
w1
Servlet API (1)
© M. Badella G. Malnati, 2003-04
‰Package relativi ai servlet
¾ javax.servlet: contiene le classi e le interfacce
che definiscono il comportamento generico di un
servlet (paradigma
richiesta/elaborazione/risposta)
¾ javax.servlet.http: – contiene le classi e le
interfacce che modellano il comportamento di
richieste/risposte trasportate attraverso il
protocollo http
3
Programmazione in Ambienti Distribuiti
Servlet API (2)
© M. Badella G. Malnati, 2003-04
ServletContext
Servlet
ServletRequest
ServletRespone
javax.servlet
GenericServlet
HttpSession
HttpServlet
HttpServletRequest
HttpServletResponse
javax.servlet.http
MyServlet
Programmazione in Ambienti Distribuiti
4
w2
Interfaccia
javax.servlet.Servlet
© M. Badella G. Malnati, 2003-04
‰ void init(ServletConfig config)
¾ Inizializzazione del servlet: eventuale acquisizione di risorse
globali
‰ void service(ServletRequest req, ServletResponse res)
¾ Codice di elaborazione di una richiesta
‰ void destroy()
¾ Distruzione del servlet: rilascio delle risorse acquisite
‰ ServletConfig getServletConfig()
¾ Metodo che permette di accedere ai parametri di
inizializzazione comunicati dal contenitore al servlet tramite il
metodo init()
‰ java.lang.String getServletInfo()
¾ Ritorna una stringa informativa relativa al servlet (autore,
funzione, copyright, …)
Programmazione in Ambienti Distribuiti
5
ServletRequest,
ServletResponse
© M. Badella G. Malnati, 2003-04
‰ Interfacce appartenenti al package javax.servlet
¾ Riassumono le caratteristiche, indipendenti dal protocollo di
trasporto, di richiesta e risposta
‰ ServletRequest rappresenta la richiesta del client:
¾ Nome e valore dei parametri, InputStream, attributi,
indirizzo del client,…
‰ ServletResponse rappresenta la risposta del servlet
al client
¾ OutputStream, Writer, ContentType, Locale, codifica
adottata, …
Programmazione in Ambienti Distribuiti
6
w3
© M. Badella G. Malnati, 2003-04
Classe
javax.servlet.GenericServlet
‰Classe astratta che implementa le
funzionalità di un servlet generico
‰Offre un insieme di metodi utili per
automatizzare compiti frequenti:
¾ String getInitParameter(String name)
¾ void log(msg)
¾ ServletContext getServletContext()
¾…
Programmazione in Ambienti Distribuiti
7
Ciclo di vita di un servlet
© M. Badella G. Malnati, 2003-04
‰ Il contenitore crea un’unica istanza del servlet e ne
invoca il metodo init()
¾ Finché init() non ritorna, il contenitore non invoca nessun
altro metodo del servlet
‰ Ad ogni richiesta, il contenitore invoca il metodo
service() utilizzando un thread differente
¾ Attenzione agli accessi concorrenti a risorse condivise
(attributi della classe, oggetto sessione,…)
‰ A proprio piacimento, il contenitore decide di
invocare il metodo destroy() per rimuovere il servlet
¾ L’invocazione di destroy() può essere contemporanea
all’esecuzione del metodo service() da parte di uno o più
worker thread!
Programmazione in Ambienti Distribuiti
8
w4
© M. Badella G. Malnati, 2003-04
Classe
javax.servlet.http.HttpServlet
‰Specializzazione del concetto di servlet
rispetto al trasporto HTTP
¾ Costituisce la classe base da cui le
implementazioni concrete di servlet derivano
‰Il metodo service(…) re-indirizza le richieste
ricevute sui metodi:
¾
¾
¾
¾
void doGet(HttpServletRequest,HttpServletResponse)
void doPost(…)
void doPut(…)
void doDelete(…)
Programmazione in Ambienti Distribuiti
9
HTTPServletRequest,
HTTPServletResponse
© M. Badella G. Malnati, 2003-04
‰HTTPServletRequest
¾ Estensione di ServletRequest
¾ Utilizzato per passare i dati della richiesta
attraverso il protocollo HTTP
o Parametri, cookie, header, tipo di richiesta, …
‰HTTPServletResponse
¾ Estensione di ServletResponse
¾ Utilizzato per inviare i risultati dell’elaborazione al
client attraverso il protocollo HTTP
o Header, cookie, stream di uscita, eventuali errori, …
Programmazione in Ambienti Distribuiti
10
w5
Esempio
© M. Badella G. Malnati, 2003-04
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Enumeration;
public class MyServlet extends HttpServlet {
String strGlobal=“this is a global variable”;
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, java.io.IOException {
String strLocal=“this is a local variable”;
response.setContentType("text/html");
java.io.PrintWriter out = response.getWriter();
/* output your page here
*/
out.print("<html><title>MyServlet</title><body>");
out.print("<p><center><b><FONT SIZE=+2>MyServlet
</FONT></b></center>");
out.print("<P>This is the servlet response</html>");
}
}
Programmazione in Ambienti Distribuiti
11
© M. Badella G. Malnati, 2003-04
Accedere ad un servlet (1)
‰I servlet presenti all’interno di un contenitore
sono descritti nel file web.xml secondo il
seguente frammento (semplificato) di DTD:
<!ELEMENT servlet (servlet-name, display-name?,
description?, servlet-class, init-param*)>
<!ELEMENT servlet-name (#PCDATA)>
<!ELEMENT display-name (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT servlet-class (#PCDATA)>
<!ELEMENT init-param (param-name, param-value, description?)>
<!ELEMENT param-name (#PCDATA)>
<!ELEMENT param-value (#PCDATA)>
Programmazione in Ambienti Distribuiti
12
w6
© M. Badella G. Malnati, 2003-04
Accedere ad un servlet (2)
‰La corrispondenza tra URL e servlet è anche
descritta all’interno del file web.xml
‰La descrizione complessiva del DTD relativo
al file web.xml è disponibile all’URL
¾ http://java.sun.com/dtd/web-app_2_3.dtd
<!ELEMENT servlet-mapping (servlet-name, url-pattern)>
<!ELEMENT servlet-name (#PCDATA)>
<!ELEMENT url-pattern (#PCDATA)>
Programmazione in Ambienti Distribuiti
13
© M. Badella G. Malnati, 2003-04
Esempio
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>MyPackage.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myservlet</servlet-name>
<url-pattern>/servlet/myservlet</url-pattern>
</servlet-mapping>
</web-app>
Programmazione in Ambienti Distribuiti
14
w7
© M. Badella G. Malnati, 2003-04
Differenze tra Servlet e JSP
‰ Le pagine JSP sono compilate in un servlet e sono
pertanto funzionalmente equivalenti
‰ Le pagine JSP sono più convenienti quando
¾ La risposta contiene principalmente testo (la cui struttura è
più esplicita rispetto al caso dei servlet, in cui è affogata nel
codice)
‰ I servlet convengono quando
¾ La risposta non è testuale (ad es., immagini dinamiche)
¾ La logica di elaborazione domina rispetto alla risposta
generata (ad es., il controllore nel pattern MVC)
Programmazione in Ambienti Distribuiti
15
© M. Badella G. Malnati, 2003-04
Filtri (1)
‰ Per semplificare la logica di gestione di un
controllore, nel paradigma MVC è possibile
utilizzare un insieme di moduli (filtri) con il compito
di filtrare richieste e risposte
‰ Ciascun filtro riceve le richieste destinate ad un
(insieme di) URL e decide, in base alla propria
logica se
¾ Inoltrare la richiesta al destinatario
¾ Modificare uno o più parametri
¾ Reindirizzare la richiesta verso un indirizzo differente
Programmazione in Ambienti Distribuiti
16
w8
© M. Badella G. Malnati, 2003-04
Filtri (2)
‰Nel caso in cui la richiesta (modificata o
meno) sia inoltrata al destinatario, la risposta
che esso ritorna viene passata al filtro che
può ulteriormente modificarla
‰Più filtri possono essere collegati in cascata
dinamicamente
‰L’applicazione dei filtri è completamente
guidata dal file web.xml che descrive la
corrispondenza tra URL e classi filtro
17
Programmazione in Ambienti Distribuiti
Filtri (3)
Contenitore
MyServlet
© M. Badella G. Malnati, 2003-04
init(…)
init(…)
doFilter(…)
richiesta
MyFilter
chain.doFilter(…) service(…)
risposta
Programmazione in Ambienti Distribuiti
18
w9
© M. Badella G. Malnati, 2003-04
Implementazione di Filtri
‰ Un filtro implementa l’interfaccia
javax.servlet.Filter:
¾ void init(FilterConfig filterConfig)
¾ void destroy()
¾ void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
‰ javax.servlet.FilterChain è un’interfaccia con un solo
metodo:
¾ void doFilter(ServletRequest request,
ServletResponse response)
Programmazione in Ambienti Distribuiti
19
© M. Badella G. Malnati, 2003-04
Uso di filtri
‰Campi in cui i filtri trovano naturale
collocazione:
¾ Autenticazione
¾ Log automatico delle richieste e delle risposte
¾ Conversione di formato per immagini
¾ Compressione dei dati
¾ Crittografia
¾ Generazione di eventi relativi all’accesso a
risorse
¾ Conversione di formato (XSL/T)
Programmazione in Ambienti Distribuiti
20
w10
Inserire un filtro
© M. Badella G. Malnati, 2003-04
‰Due sezioni del file web.xml
¾ “filter” descrive un fitro, specificandone classe
Java, nome, eventuali parametri
¾ “filter-mapping” esprime la corrispondenza tra
URL e filtri da utilizzare
‰Nel caso in cui ad una data URL
corrispondano due o più filtri, questi sono
applicati nell’ordine in cui le rispettive sezioni
filter-mapping compaiono nel file web.xml
Programmazione in Ambienti Distribuiti
21
© M. Badella G. Malnati, 2003-04
Esempio (1)
public class MyFilter implements Filter {
public init(FilterConfig) {}
public destroy() {}
public doFilter( ServletRequest req,
ServletResponse res,
FilterChain chain) {
if (req instanceof HttpServletRequest) {
HttpSession session=
((HttpServletRequest)req).getSession();
if (session.getAttribute(“User”)==null) {
res.sendRedirect(“login.jsp”);
} else {
chain.doFilter(req,res);
}
}
}
}
Programmazione in Ambienti Distribuiti
22
w11
© M. Badella G. Malnati, 2003-04
Esempio (2)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<filter>
<filter-name>myfilter</filter-name>
<filter-class>MyPackage.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myfilter</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>
…
</web-app>
Programmazione in Ambienti Distribuiti
23
Servlet: analisi critica
© M. Badella G. Malnati, 2003-04
‰ Vantaggi
¾
¾
¾
¾
¾
Veloci ed efficienti
Scalabili
Persistenti
Flessibili
Il contenitore garantisce
la separazione fisica tra
applicazioni (vengono
usati ThreadGroup
differenti)
Programmazione in Ambienti Distribuiti
‰ Svantaggi
¾ Complicato modificare il
codice HTML di risposta
¾ La presentazione e la
logica sono fortemente
accoppiate
¾ L’architettura può
diventare complessa se
si prendono in
considerazione le
caratteristiche più
avanzate
24
w12