© 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