server-side programming: java servlets parte iiunina.stidue.net/applicazioni...
TRANSCRIPT
Corso di Laurea Specialistica in Ingegneria Informa ticaCorso di Laurea Specialistica in Ingegneria delle
Telecomunicazioni
Corso di Reti di Applicazioni Telematichea.a. 2009-2010
Server-side Programming: Java servlets
Parte II
Simon Pietro Romano
AgendaAgenda
• Servlet:• Concetti introduttivi
• Ciclo di vita delle servlet;• servlet request, servlet response, servlet config, servlet context
• Learn by Example• Esempi di servlet generiche• Configurazione delle web application• Configurazione delle web application• Introspezione della richiesta
• HttpServlet:• HttpServletRequest, HttpServletResponse• Learn by Example
• Un esempio di servlet HTTP• Introspezione della richiesta HTTP
Parte II
Applicazione Web (Applicazione Web ( web appweb app))
• Una raccolta di:• servlet• Java Server Page (JSP)• documenti HTML• immagini• template• altre risorse web
• Concepita per permettere un deployment portabile su qualunque server web che supporti le servlet
Web apps: motivazioniWeb apps: motivazioni
• Garantire la portabilità delle applicazioni basate sul web, grazie a specifici accordi su:• Localizzazione dei file dell’applicazione sul server• Formato dei file di configurazione del server
• Archivi ‘war’ – Web Application Archive:• Un archivio contenente tutti i file di un’applicazione web• Costruito mediante l’utility di compressione ‘jar’ (Java
ARchive)• Memorizzato in una specifica cartella del web server
Archivi Archivi warwar in in TomcatTomcat
Tutti i file .war sono contenuti nella directory webapps del server
Tomcat
Contenuto di un archivio Contenuto di un archivio warwar
L’archivio evidenziato evidenziato nella slide
precedente(visualizzato
mediante Winrar…)
La directory La directory WEBWEB--INFINF
• Una directory speciale:• I file al suo interno non vengono inviati direttamente al client,
dato che contengono:• Classi java• Informazioni di configurazione per la web app
• La cartella WEB-INF/classes contiene:• i file di classe per le servlet della web app• i file di classe per le servlet della web app• Le classi di supporto
• La cartella WEB-INF/lib contiene le classi memorizzate, per comodità, in archivi jar
• I caricatori di classi del server cercano automaticamente nelle suddette directory per caricare le classi invocate
Il descrittore di deploymentIl descrittore di deployment
• Il file web.xml nella directory WEB-INF contiene informazioni di configurazione relative alla web app nella quale risiede:• Registrazione delle servlet• Mapping delle URL• Mapping delle URL• Tipi MIME• Caratteristiche avanzate:
• Vincoli di protezione a livello di pagina• Comportamento delle servlet in ambiente distribuito
Il file Il file web.xmlweb.xml
Nome simbolico dato alla servletNome simbolico dato alla servlet
Classe della servlet
Invocazione della servlet ‘pippozzo’Invocazione della servlet ‘pippozzo’
La servlet è stata invocata tramite il nome simbolico prescelto!
Mapping di servletMapping di servlet
• Consente di impostare pattern di URL che richiamano una determinata servlet registrata nel container
• Utile per:• Nascondere l’uso di servlet da parte di un sito web• Nascondere l’uso di servlet da parte di un sito web• Sostituire in maniera ‘indolore’ una pagina
preesistente, corrispondente ad una determinata URL
Un esempio di mappingUn esempio di mapping
Qualsiasi richiesta della risorsa http://localhost:8080/AT-ServletSamples/ciao.htmlsarà gestita dalla servlet il cui nome simbolico è
‘pippozzo’
Invocazione della pagina Invocazione della pagina ciao.htmlciao.html
L’invocazione della servlet è mascherata dalla pagina ‘statica’ ciao.html
Regole di mappingRegole di mapping
• Mapping esplicito:• Tipo esempio precedente:
• Utile per sostituire una singola pagina esistente
• Mapping con prefisso di percorso:• Es: ‘/prefisso/*’:
• Gestisce tutte le richieste che iniziano con il prefisso specificato
• Mapping di estensione:• Es: ‘*.jsp, *.do’:• Es: ‘*.jsp, *.do’:
• Gestisce tutte le richieste che terminano con una particolare estensione
• Mapping predefinito:• ‘/’:
• Specifica la servlet predefinita per la web app:– Da utilizzare nel caso non si verifichi nessun’altra corrispondenza– Identico al mapping con prefisso: ‘/*’
Esempi di mappingEsempi di mapping
Tutte le richieste aventi AT-Samples come
prefisso devono essere gestite dalla servlet
avente nome simbolico pippozzo
Tutte le richieste aventi comeStai come
estensione devono essere gestite dalla servlet avente nome simbolico pippozzo
Effetti del mapping (1/2)Effetti del mapping (1/2)
Qualsiasi richiesta avente AT-Samples come prefisso viene servita
Modulo
Qualsiasi richiesta avente AT-Samples come prefisso viene servita dalla servlet avente nome simbolico pippozzo
Effetti del mapping (2/2)Effetti del mapping (2/2)
Qualsiasi richiesta avente comeStai come estensione viene Qualsiasi richiesta avente comeStai come estensione viene servita dalla servlet avente nome simbolico pippozzo
La comunicazione tra servlet e containerLa comunicazione tra servlet e container
• All’attivazione di una servlet, il container:• Passa alla servlet un oggetto, chiamato
ServletConfig ,contenente informazioni necessarie per una corretta inizializzazione
• ServletConfig consente di accedere ad un ulteriore oggetto, chiamato ServletContext , che viene utilizzato dalla servlet per gestire eventuali successive comunicazioni con il container:per gestire eventuali successive comunicazioni con il container:
• Determinare il tipo MIME di un file;• Inoltrare le richieste (dispatching);• Scrivere informazioni in un file di logging;• Ecc…
• NB: Esiste un context per ogni web application e per ogni Java Virtual Machine!
L’interfaccia L’interfaccia ServletConfigServletConfig
• E’ implementata dalla classe GenericServlet:• In tal modo, è possibile gestire le informazioni di configurazione in
maniera semplice ed immediata
Un occhio alla documentazione…Un occhio alla documentazione…
Inizializzazione: l’oggetto Inizializzazione: l’oggetto ServletConfigServletConfig
• Quando la servlet viene attivata dal container:• Viene invocato il metodo init(), il quale ha, come
parametro, l’oggetto ServletConfig
• E’ compito della servlet ‘salvare’ tale oggetto come propria variabile di istanzapropria variabile di istanza
• La classe GenericServlet effettua tale operazione nell’implementazione del metodo init()
Esempio di inizializzazioneEsempio di inizializzazione
La servlet è dotata di una variabile di istanza, di tipo
ServletConfig
Nel metodo init(), tale variabile è ‘settata’ al valore passato dal
container
Informazioni di contesto: un esempioInformazioni di contesto: un esempio
Esecuzione della servletEsecuzione della servlet
NB: Non compare alcun parametro di inizializzazione, né per la servlet, né per il contesto…
Passaggio dei parametri di inizializzazione in Tomc atPassaggio dei parametri di inizializzazione in Tomc at
Si può utilizzare il descrittore di deployment web.xml:
Per il context:
<context-param><param-name>
nome_del_parametro</param-name><param-value>
valore_del_parametro</param-value><description>
descrizione_del_parametro</description>
</context-param>
Per le servlet:
<init-param><param-name>
nome_del_parametro</param-name><param-value>
valore_del_parametro
<description>descrizione_del_parametro
</description></param-value>
</init-param>
Un esempioUn esempio
Esecuzione della servletEsecuzione della servlet
NB: In tal caso, i parametri di inizializzazione del contesto e della servlet vengono stampati nella
risposta…
Introspezione della requestIntrospezione della request
• L’oggetto ServletRequest mette a disposizione tutta una serie di metodi per reperire informazioni sulla richiesta effettuata dal client:• Protocollo;• Nome del server;• Porto del server;• Indirizzo dell’host client;• Nome dell’host client;• …
Un esempioUn esempio
Un frammento di codice che effettua introspezione della richiesta…
NB: Si provi ad aggiungere tale frammento al codice della precedente servlet ☺
Esecuzione della servletEsecuzione della servlet
Modulo
Risultato dell’introspezione…
HttpServletHttpServlet
• Molto spesso, le servlet utilizzano il protocollo HTTP:• Il package javax.servlet.http è stato concepito
proprio per fornire un ulteriore supporto agli sviluppatori di questo tipo di servlet
• Tale package semplifica la gestione dei principali • Tale package semplifica la gestione dei principali messaggi HTTP:
• GET• POST• HEAD• TRACE• …
Il metodo HTTP GETIl metodo HTTP GET
• Il metodo HTTP GET è utilizzato per ricevere informazioni da un web server, sotto forma di:• File:
• Testo, html, ecc.
• Output proveniente da un particolare dispositivo • Output proveniente da un particolare dispositivo presente sul server:
• Es: telecamera, ecc.
• Output proveniente da un particolare programma in esecuzione sul server:
• Una servlet, uno script CGI, ecc.
HTTP GET: passaggio dei parametriHTTP GET: passaggio dei parametri
• Un esempio:• http://localhost:8080/servlet/MiaServlet?parametro1=valore1¶metro2=valore2
• L’URL in questa richiesta GET invoca la servlet MiaServlet e contiene due parametri, chiamati, rispettivamente, parametro1 e parametro2:
• Ogni parametro è costituito da una coppia nome/valore, secondo il formato:
– Nome=valore
• I parametri seguono il nome della servlet e sono preceduti da un punto interrogativo ('?')
• Ogni parametro è separato dai precedenti tramite un ampersand ('&').
HTTP GET: limitazioniHTTP GET: limitazioni
• La maggior parte dei server Web limita la quantità massima di dati che possono essere scambiati all’interno di una URL (solitamente il limite è pari a qualche centinaio di byte…)
• Nel caso in cui si presenti la necessità di • Nel caso in cui si presenti la necessità di passare molti dati al server all’interno della richiesta, bisogna ricorrere al metodo HTTP POST
HTTP GET: particolaritàHTTP GET: particolarità
• E’ importante notare che ci si aspetta che l’implementazione del metodo GET da parte di qualsiasi server sia:• Sicura (safe):
• Vale a dire, priva di effetti collaterali (side effects)• Vale a dire, priva di effetti collaterali (side effects)
• Idempotente:• Cioè, capace di produrre il medesimo output in seguito ad
invocazioni successive
Il metodo HTTP POSTIl metodo HTTP POST
• Con il metodo POST, tutti i parametri di input per il server web sono passati all’interno di un input stream:• Non esiste più, dunque, la limitazione sulla dimensione
massima delle informazioni scambiate tra client e server• I parametri si trovano all’interno della richiesta, subito dopo
l’headerl’header
• A differenza del metodo GET, il metodo POST non è concepito per essere né sicuro, né idempotente:• Sono ammesse modifiche ai dati• Non è richiesto il requisito di ‘ripetibilità’ delle transazioni tra
client e server
Il metodo HTTP HEADIl metodo HTTP HEAD
• E’ molto simile al metodo GET• La richiesta è identica, eccezion fatta per la parola chiave
HEAD al posto di GET• Nella risposta, il server restituisce solo le informazioni relative
all’header• HEAD è spesso utilizzato per controllare:
• La data di ultima modifica di un documento presente sul server:• La data di ultima modifica di un documento presente sul server:• utile per gestire il caching
• La dimensione di un documento prima di scaricarlo dal server:• Per consentire al browser di mostrare, successivamente, una barra relativa
allo stato di avanzamento della procedura• Il tipo di server:
• Per consentire al client di ‘customizzare’ le richieste inviate ad un particolare server Web
• Il tipo di documento richiesto:• Per consentire al client di verificare se per esso sia disponibile il necessario
supporto
Le classi di supporto per HTTPLe classi di supporto per HTTP
• Il package javax.servlet.http semplifica notevolmente la scrittura di servlet HTTP:• La classe astratta HttpServlet eredita tutte le
caratteristiche della classe GenericServlet ed include funzionalità specifiche del protocollo HTTP:include funzionalità specifiche del protocollo HTTP:
• L’implementazione del metodo service() si occupa di gestire in maniera opportuna il “dispatching” (cioè la consegna) dei messaggi HTTP ad uno dei metodi speciali disponibili per tale protocollo
– Per tale motivo, non è necessario (anzi, è sconsigliato!) reimplementare il metodo service()
I metodi speciali per HTTPI metodi speciali per HTTP
• doGet()• Per gestire richieste di tipo GET
• doHead()• Per gestire richieste di tipo HEAD
• doDelete()• Permette ad un client di eliminare un documento da un Web server
• doOptions()• doOptions()• Restituisce informazioni relative ai metodi supportati dal server
• doPost()• Per gestire richieste di tipo POST
• doPut()• Permette ad un client di salvare un documento su un Web server (simile
al trasferimento di file mediante FTP…)• doTrace()
• Utilizzato per il debugging
HttpServlet: gestione delle richiesteHttpServlet: gestione delle richieste
doGet()
Sottoclasse HttpServlet
richiesta GETrisposta
Web server
service()doPost()
doTrace()
.
.
richiesta POSTrisposta
richiesta TRACErisposta
Utilizzo delle classi di supportoUtilizzo delle classi di supporto
• Quando si usano le classi di supporto per HTTP, generalmente occorre creare una nuova servlet che estende HttpServlet e ‘sovrascrivere’:• o il metodo doGet()…• …o il metodo doPost()…• …o entrambi.• …o entrambi.
• I metodi di elaborazione dei messaggi HTTP ricevono in ingresso due parametri:• Un oggetto HttpServletRequest:
• Contenente numerosi metodi di ausilio nell’analisi della richiesta
• Un oggetto HttpServletResponse:• Contenente numerosi metodi di ausilio nella preparazione della
risposta
Introspezione della richiesta HTTPIntrospezione della richiesta HTTP
• Utilizzando l’oggetto HttpServletRequestè possibile accedere in maniera semplice maniera semplice ed efficace ai campi dell’header HTTP:
Esecuzione della servletEsecuzione della servlet