Servlet API Programmazione in Ambienti Distribuiti A.A. 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 2 1
Servlet API (1) 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 Servlet API (2) ServletContext Servlet GenericServlet HttpServlet ServletRequest ServletRespone javax.servlet HttpSession HttpServletRequest HttpServletResponse javax.servlet.http MyServlet 4 2
Interfaccia javax.servlet.servlet 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, ) 5 ServletRequest, ServletResponse 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, 6 3
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() 7 Ciclo di vita di un servlet 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! 8 4
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( ) 9 HTTPServletRequest, HTTPServletResponse 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, 10 5
Esempio 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>"); } 11 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)> 12 6
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)> 13 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> 14 7
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) 15 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 16 8
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 Filtri (3) Contenitore init( ) MyServlet richiesta init( ) dofilter( ) MyFilter chain.dofilter( ) service( ) risposta 18 9
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) 19 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) 20 10
Inserire un filtro 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 21 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); } } } } 22 11
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> 23 Servlet: analisi critica Vantaggi Veloci ed efficienti Scalabili Persistenti Flessibili Il contenitore garantisce la separazione fisica tra applicazioni (vengono usati ThreadGroup differenti) 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 12