Ciclo di vita di una Servlet

Documenti analoghi
Osservazioni. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2006/07-1

Servlet: approfondimenti

Osservazioni. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2005/06-1

Un contatore di accessi

Note pratiche sullo sviluppo di servlet (I)

I file WAR. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2006/07-1

Tito Flagella - Introduzione alla programmazione di Servlet

I file WAR. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-1

Tener traccia del client

Servlet e JDBC. Programmazione in Rete e Laboratorio

Servlet e JDBC. Servlet e Web Server. Servlet e Web Server. Servlet:

Introduzione alla programmazione Http lato server in Java

Tito Flagella - Introduzione alla programmazione di Servlet

Corso di Applicazioni Telematiche

Tomcat struttura delle directory

Tomcat. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2006/07-1

Servlet API. Programmazione in Ambienti Distribuiti A.A

Antonio d Acierno 13/01/2006

Laboratorio di Basi di Dati e Web

Laboratorio di Basi di Dati e Web

SERVLET & JSP DISPENSE

Basi di dati - Laboratorio

Servlet A L B E R T O B E L U S S I A N N O A C C A D E M I C O /

Laboratorio di Basi di dati

Programmazione server-side: Java Servlet

Tomcat & Servlet. Contenuti. Programmazione in Ambienti Distribuiti. Tomcat Applicazioni Web. Servlet JSP Uso delle sessioni

Alma Mater Studiorum Università di Bologna. Scuola di Ingegneria e Architettura. Tecnologie Web T. Esercitazione Riepilogo

Stateless Session Bean

Sviluppo di Applicazioni Web con Java 2 Enterprise Edition

Alma Mater Studiorum Università di Bologna. Scuola di Ingegneria e Architettura. Tecnologie Web T. Esercitazione 09 Riepilogo

Laboratorio di sistemi Prima Web Application JSP [Java]

Sviluppo di Applicazioni Web con Java 2 Enterprise Edition

Alma Mater Studiorum Università di Bologna. Scuola di Ingegneria e Architettura. Tecnologie Web T. Esercitazione Riepilogo

Un esempio complesso

modulo: siti web centrati sui dati

Corso di Basi di Dati e Sistemi Informativi: Sperimentazioni

Tecnologie di Sviluppo per il Web

Tomcat. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-1

Laboratorio di Programmazione di Rete

DIREZIONI CORRENTI di EVOLUZIONE Sicuramente il campo applicativo più ampio di dimensioni è il VLVWHPD:HE stesso EVOLUZIONI DEL CALCOLO WEB

La Tecnologia CGI-Servlet

Accesso Web a Data Base

Gestire le sessioni con le Servlet

Università degli Studi di Modena e Reggio Emilia. Facoltà di Ingegneria Reggio Emilia CORSO DI TECNOLOGIE E APPLICAZIONI WEB.

Applicazioni web. Sommario. Parte 6 Servlet Java. Applicazioni web - Servlet. Alberto Ferrari 1. Servlet Introduzione alle API ed esempi

1 Gestione dell utente connesso in sessione con Java Server Pages, Java Beans, Servlet

EVOLUZIONI DEL CALCOLO WEB. DIREZIONI CORRENTI di EVOLUZIONE Sicuramente il campo applicativo più ampio di dimensioni è il VLVWHPD:HE stesso

Prova scritta del 13 luglio 2010

Introduzione a Java Servlet Technology

Server-side Programming: Java servlets Parte I

Da Println a Spring. Rinaldo Bonazzo Sardinia Point Srl

Svantaggi delle servlet

Università degli Studi di Modena e Reggio Emilia. Facoltà di Ingegneria Reggio Emilia CORSO DI TECNOLOGIE E APPLICAZIONI WEB. Http con java, URL

Servlet e JDBC. Servlet e Web Server. Servlet e Web Server. Servlet e Web Server. Richieste. Servlet. Servlet:

Architetture Web: un ripasso

EVOLUZIONI DEL CALCOLO WEB. DIREZIONI CORRENTI di EVOLUZIONE Sicuramente il campo applicativo più ampio di dimensioni è il sistema Web stesso

Sviluppo di Applicazioni Web con Java 2 Enterprise Edition

MyShopDB = MyShop + MySQL

JAVA SERVLET: I filtri

Database & WWW. Basi di dati Architetture e linee di evoluzione P. Atzeni, S. Ceri, P. Fraternali, S. Paraboschi, R. Torlone

Tecnologie di Sviluppo per il Web

Trasformare una Java (Console) Application in una Web Application (con utilizzo di un database MySQL)

Java Servlet. Davide Taibi.

Server-side Programming: Java servlets Parte II

Corso di Telematica II

Capitolo 7. Soluzione: <P align= center > Form di invio nome e cognome </P> <FORM action= nomecognome.exe method= post >

Servlet. Nicola Gessa

MyShopDB = MyShop + MySQL

Tecnologie di Sviluppo per il Web

Le tecnologie software Internet

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Verso l architettura MVC-2 Java Server Pages (JSP)

Verso l architettura MVC-2 Java Server Pages (JSP)

Laboratorio di Basi di Dati e Web

EVOLUZIONI DEL CALCOLO WEB. DIREZIONI CORRENTI di EVOLUZIONE Sicuramente il campo applicativo più ampio di dimensioni è il sistema Web stesso

EVOLUZIONI DEL CALCOLO WEB. DIREZIONI CORRENTI di EVOLUZIONE Sicuramente il campo applicativo più ampio di dimensioni è il sistema Web stesso

Laboratorio di reti II: Servlet

Le tecnologie software Internet

Basi di dati e Web (Moduli: Laboratorio e Siti Web centrati sui Dati) Prova scritta del 14 luglio 2008

Java Servlet & Java Server Pages (una semplice introduzione) SAPIENZA Università di Roma Corso di Progetto di Applicazioni Software

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

Siti web centrati sui dati Architettura MVC-2: JSP

Programmazione modulare

Web Application model. Servlet. Servlet e Servlet Container. Introduzione alle Servlet

Programmazione Java Avanzata. MVC Model, View,, Controller. Ing. Gianluca Caminiti

Le command line di Java. Esercitazioni di Sistemi Operativi III Lezione n. 2

Fondamenti di informatica T-1 (A K) Esercitazione 2 Basi del linguaggio Java

Transcript:

Ciclo di vita di una Servlet Non caricata. Prima richiesta: Caricata: il file.class viene caricato in memoria centrale. Inizializzata: viene eseguito il metodo init(). In servizio: risponde alle richieste con il metodo opportuno (per le servlet http vengono richiamati i metodi do<tipo richiesta>, e.g., doget() e dopost()). In attesa: rimane presente in memoria centrale, ma inattiva. In distruzione: viene eseguito il metodo destroy() e la servlet viene rimossa dalla memoria centrale. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-1

Errori comuni Tomcat manager: FAIL - Application at context path /test could not be started Causa: errore di parsing - controllare il file web.xml. HTTP Status 404 Causa: servlet non trovata controllare l URL della servlet ed i link ad essa relativi controllare che il tag <urlpattern> abbia un / iniziale (a differenza degli URL nelle pagine HTML). HTTP Status 500 Errore interno (eccezione) della servlet. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-2

HttpServletRequest E un interfaccia, definita in javax.servlet.http, che aggiunge alla soprainterfaccia ServletRequest (per servlet generiche), definita in javax.servlet, metodi specifici per le richieste HTTP. Rappresenta la richiesta di un client verso una servlet. L oggetto corrispondente viene creato dal container (e.g., Tomcat) al momento della richiesta e passato al metodo opportuno della servlet. Metodi fondamentali: getinputstream: per leggere informazioni inviate dal client; getparameter: per estrarre i parametri della richiesta. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-3

HttpServletResponse E un interfaccia, definita in javax.servlet.http, che aggiunge alla soprainterfaccia ServletResponse (per servlet generiche), definita in javax.servlet, metodi specifici per le richieste HTTP. Rappresenta la risposta al client da parte di una servlet. L oggetto corrispondente viene creato dal container (e.g., Tomcat) al momento della richiesta e passato al metodo opportuno della servlet. Metodi fondamentali: setcontenttype: per specificare il tipo MIME del contenuto che verrà spedito al client; getwriter: restituisce il flusso di dati verso il client. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-4

Un contatore di accessi persistente Modifichiamo la servlet che conta il numero di accessi in modo che conservi tale valore anche quando l applicazione web viene riavviata. Sfruttiamo i metodi init() e destroy(): in init() leggiamo dal file il valore iniziale del contatore i; in destroy() (al momento della rimozione dalla memoria della servlet) scriviamo sul file il valore corrente del contatore i. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-5

Codice Java (I) import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ContatorePersistente extends HttpServlet { final static String NOME_FILE="contatore.txt"; private int i; private String path; // memorizzerà il percorso di NOME_FILE. public void init() { try { path=getservletcontext().getrealpath("")+"/"; DataInputStream f=new DataInputStream(new FileInputStream(path+NOME_FILE)); i=f.readint(); f.close(); } catch (IOException e) { i=0; } } // continua nel lucido successivo... Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-6

Codice Java (II) //... continua dal lucido precedente public void doget(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException { res.setcontenttype("text/html"); PrintWriter out = res.getwriter(); out.println("<html>"); out.println("<head><title>contatore di "+ "accessi</title></head>"); out.println("<body>"); out.println("<strong>accessi registrati "+ "finora: "+(++i)+"</strong>"); out.println("</body></html>"); } // continua nel lucido successivo... Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-7

Codice Java (III) //... continua dal lucido precedente public void destroy() { try { DataOutputStream f= new DataOutputStream (new FileOutputStream(path+NOME_FILE)); f.writeint(i); f.close(); } catch (IOException e) { } } } Il metodo destroy() viene invocato al momento della rimozione della servlet dalla memoria centrale. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-8

Modifiche al file web.xml <?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>contatore2</servlet-name> <servlet-class>contatorepersistente</servlet-class> </servlet> <servlet-mapping> <servlet-name>contatore2</servlet-name> <url-pattern>/servlet/conpers</url-pattern> </servlet-mapping> </web-app> Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-9

Modifiche al file index.html <HTML> <HEAD> <TITLE>Servlet di prova</title> </HEAD> <BODY> <TABLE>... <TR> <TD> <A HREF="servlet/ConPers">Un contatore di accessi persistente</a> </TD> </TR> </TABLE> </BODY> </HTML> Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-10

Note Nell ultimo esempio del contatore di accessi persistente il nome file in cui memorizzare il numero di hit è codificato direttamente nel codice della servlet. Se vogliamo cambiare il nome del file o il valore iniziale del contatore, dobbiamo modificare il sorgente, ricompilare e riavviare l applicazione web. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-11

Variante Per evitare la ricompilazione della servlet, si può memorizzare il nome del file e/o il valore iniziale del contatore nel file di configurazione web.xml. Tale parametro può poi essere recuperato dalla servlet. Infatti il server (Tomcat) passa automaticamente al metodo init() un oggetto di tipo ServletConfig che include i parametri di inizializzazione accessibili tramite i metodi getinitparameter() e getinitparameternames(). Sia GenericServlet che HttpServlet implementano l interfaccia ServletConfig: è sufficiente quindi richiamare super.init() per avere a disposizione tali metodi. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-12

Specificare i parametri in web.xml... <servlet> <servlet-name>contatore3</servlet-name> <servlet-class>contatorepersistente2</servlet-class> <init-param> <param-name>nomefile</param-name> <param-value>contatore.txt</param-value> </init-param> <init-param> <param-name>valorecontatore</param-name> <param-value>0</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>contatore3</servlet-name> <url-pattern>/servlet/conpersparam</url-pattern> </servlet-mapping> Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-13

Accedere ai parametri memorizzati in web.xml public class ContatorePersistente2 extends HttpServlet { private int i; private String path; public void init(servletconfig conf) throws ServletException { super.init(conf); try { path=getservletcontext().getrealpath("")+"/"+ getinitparameter("nomefile"); DataInputStream f=new DataInputStream (new FileInputStream(path)); i=f.readint(); f.close(); } catch (IOException e) { i=integer.parseint(getinitparameter("valorecontatore")); } } Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-14

Il resto del codice (I) public void doget(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException { res.setcontenttype("text/html"); PrintWriter out = res.getwriter(); out.println("<html>"); out.println("<head><title>contatore di "+ "accessi</title></head>"); out.println("<body>"); out.println("<strong>accessi registrati "+ "finora: "+(++i)+"</strong>"); out.println("</body></html>"); } Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-15

Il resto del codice (II) public void destroy() { try { DataOutputStream f=new DataOutputStream (new FileOutputStream(path)); f.writeint(i); f.close(); } catch (IOException e) { } } } Il resto del codice rimane pressoché invariato. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-16

Modifiche al file index.html <HTML> <HEAD> <TITLE>Servlet di prova</title> </HEAD> <BODY> <TABLE>... <TR> <TD> <A HREF="servlet/ConPersParam">Un contatore di accessi persistente con parametri memorizzati in web.xml</a> </TD> </TR> </TABLE> </BODY> </HTML> Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-17

Note Memorizzando i parametri fondamentali di una servlet nel file che descrive il dispiegamento (web.xml), si evita di ricompilare il codice in caso di cambiamenti. Tuttavia è sempre necessario riavviare (Stop + Start) l applicazione web tramite il Tomcat Manager. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-18

Thread safety Tipicamente ad ogni dato istante soltanto una copia di ogni servlet è presente in memoria centrale. Tuttavia ogni servlet può trovarsi a dover soddisfare più richieste concorrenti. Siccome ogni richiesta genera un thread distinto, le servlet dovrebbero essere thread-safe. Se i metodi di una servlet invocati da Tomcat per soddisfare una richiesta non accedono a variabili visibili al di fuori dei metodi stessi, la servlet è automaticamente thread-safe. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-19

Thread safety Tuttavia una servlet che mantiene delle risorse persistenti, deve assicurare che queste ultime siano aggiornate in modo consistente. Un tipico esempio è costituito dall utilizzo di una servlet per gestire un conto bancario (una membro di tipo int della classe mantiene l ammontare corrente del conto). Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-20

Un tipico scenario Un primo utente accede alla servlet per prelevare 100 Euro. La servlet controlla l ammontare del conto, verificando la presenza di 120 Euro e consentendo l operazione. Un secondo utente accede alla servlet per prelevare 50 Euro. La servlet controlla l ammontare del conto, verificando la presenza di 120 Euro e consentendo l operazione. La servlet addebita 100 Euro per la richiesta del primo utente e immediatamente dopo 50 Euro per la richiesta del secondo utente. Risultato: il bilancio complessivo del conto è in rosso di 30 Euro. Il programmatore viene licenziato in tronco. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-21

Come evitare il licenziamento E necessario fare in modo che la servlet soddisfi una richiesta per volta, utilizzando una delle due soluzioni seguenti: inglobando il codice critico in blocchi synchronized; implementando l interfaccia SingleThreadModel (viene creato un insieme di istanze di servlet, invece di una sola; ogni copia può servire una singola richiesta per volta). La seconda soluzione è più onerosa dal punto di vista della gestione delle risorse del server. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-22

Il codice Java (I) import javax.servlet.*; import javax.servlet.http.*; import java.util.*; import java.io.*; public class Bilancio extends HttpServlet { private String path; class ContoCorrente { public int bilancio; } ContoCorrente conto; Oggetto su cui useremo il blocco synchronized. public void init(servletconfig conf) throws ServletException { super.init(conf); conto = new ContoCorrente(); try { path=getservletcontext().getrealpath("")+"/"+ getinitparameter("nomefile"); DataInputStream f=new DataInputStream(new FileInputStream(path)); conto.bilancio=f.readint(); f.close(); } catch (IOException e) { conto.bilancio = Integer.parseInt(getInitParameter("valoreConto")); } } Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-23

Il codice Java (II) public void doget(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException { res.setcontenttype("text/html"); Come la servlet rimanda il post a se stessa (notare PrintWriter out = res.getwriter(); l assenza di servlet/ ) out.println("<html><body>"); out.println("<h2>java Bank</H2>"); out.println("bilancio corrente: <B>" + conto.bilancio + "</B><BR>"); out.println("<form METHOD=\"post\" ACTION=\"Bilancio\">"); out.println("ammontare: <INPUT TYPE=\"text\" NAME=\ Ammontare\""+ " SIZE=\"3\"><BR>"); out.println("<input TYPE=\"submit\" NAME=\"Deposito\""+ " VALUE=\"Deposito\">"); out.println("<input TYPE=\"submit\" NAME=\"Prelievo\""+ " VALUE=\"Prelievo\">"); out.println("</form>"); out.println("</body></html>"); } Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-24

Il codice Java (III) public void dopost(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException { int ammontare=0; try { ammontare = Integer.parseInt(req.getParameter("Ammontare")); } catch (NullPointerException e) { // Ammontare dell'operazione non specificato } catch (NumberFormatException e) { // Ammontare dell'operazione non valido } synchronized(conto) { // inizio del blocco sincronizzato if(req.getparameter("prelievo")!= null && (ammontare <= conto.bilancio)) conto.bilancio = conto.bilancio - ammontare; if(req.getparameter("deposito")!= null && (ammontare > 0)) conto.bilancio = conto.bilancio + ammontare; } // fine del blocco sincronizzato doget(req, res); // ripresenta il form } Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-25

Il codice Java (IV) public void destroy() { try { DataOutputStream f=new DataOutputStream (new FileOutputStream(path)); f.writeint(conto.bilancio); f.close(); } catch (IOException e) { } } } Il metodo destroy() permette di salvare il bilancio del conto corrente nel file specificato in web.xml (bilancio.txt). Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-26

Modifiche al file web.xml... <servlet> <servlet-name>bilancio</servlet-name> <servlet-class>bilancio</servlet-class> <init-param> <param-name>nomefile</param-name> <param-value>bilancio.txt</param-value> </init-param> <init-param> <param-name>valoreconto</param-name> <param-value>0</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>bilancio</servlet-name> <url-pattern>/servlet/bilancio</url-pattern> </servlet-mapping> Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-27

Modifiche al file index.html <HTML> <HEAD> <TITLE>Servlet di prova</title> </HEAD> <BODY> <TABLE>... <TR> <TD> <A HREF="servlet/Bilancio">Bilancio di un conto corrente</a> </TD> </TR> </TABLE> </BODY> </HTML> Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-28

Esercizi Modificare la servlet Bilancio in modo che visualizzi un messaggio di avvertimento nel caso in cui l utente tenti di prelevare una somma maggiore di quella depositata. Aggiungere la funzionalità di autenticazione alla servlet Bilancio in modo che l utente debba inserire un nome utente ed una password prima di effettuare il prelievo. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-29