Java Servlet & Java Server Pages (una semplice introduzione) SAPIENZA – Università di Roma Corso di Progetto di Applicazioni Software Java Servlet Technology • Le Servlet – sono una tecnologia offerta da Java per l'estensione delle funzionalità di server che ospitino applicazioni accedute dai client tramite un modello di comunicazione request-response • HTTP – sono delegate a processare le request ed emettere le response – consistono in moduli di codice Java in esecuzione su un ambiente server • le API sono in un pacchetto incluso in J2EE – javax.servlet – javax.servlet.http – hanno un funzionamento che ricorda le CGI – sono dispiegate (deployed) ed eseguite (run) in un servlet container all'interno del Server – non sono thread-safe! 2 Servlet Container • Infrastruttura software in cui una Servlet… 1. … viene eseguita • simile al concetto di Sandbox; 2. … scorre il proprio ciclo di vita. 3 Servlet Container • Infrastruttura software in cui una Servlet… 1. … viene eseguita • simile al concetto di Sandbox; 2. … scorre il proprio ciclo di vita. • Nel resto del corso e nelle esercitazioni verrà adoperato Apache Tomcat 4 Gerarchia Servlet • Le Servlet sono in relazione con classi ed interfacce contenute nei package: – javax.servlet – javax.servlet.http • javax.servlet comprende classi ed interfacce… – … indipendenti dal protocollo di comunicazione; – … estese da classi ed interfacce in javax.servlet.http • specifiche per il protocollo HTTP. 5 Java Servlet Technology 6 Ciclo di vita delle Servlet • public void init() – – – – invocato dal Servlet Container precede qualunque ulteriore invocazione termina prima di qualsiasi ulteriore invocazione tipicamente si effettua overriding di questo metodo per creare le connessioni ad altri oggetti Container-managed, utili durante tutto il resto del ciclo di vita • public void destroy() – invocato dal Servlet Container – termina solo dopo che ogni altra invocazione ha terminato la propria esecuzione – tipicamente si effettua overriding di questo metodo per rilasciare le risorse occupate prima che la Servlet venga distrutta 7 Ciclo di vita delle Servlet • public void service( ServletRequest req, ServletResponse res ) – gestisce la richiesta del client (req) • il parametro req fornisce informazioni contestuali, ad esempio – String getRemoteAddr() // indirizzo IP del client – Enumeration getParameterNames() // parametri di invocazione – … – imposta la risposta del server (res) • la scrittura sull'output avviene tramite l'oggetto ServletOutputStream associato – ServletOutputStream getOutputStream() – eseguito dal server in modalità multithread 8 La specializzazione HTTP • Per ogni comando (METODO) HTTP 1.0 e 1.1… – – – – POST GET HEAD altri (PUT, DELETE, TRACE...) • … HttpServlet definisce metodi nel formato protected void do‹Metodo›( HttpServletRequest req, HttpServletResponse res ) – – – – doPost(…) doGet(…) doHead(…) doPut(…), doDelete(…), doTrace(…), … , service(…) 9 GET 10 POST Parametri URL-encoded 11 GET Parametri URL-encoded (query string) Servlet 12 HttpServletRequest HttpServletResponse • HttpServletRequest estende ServletRequest – metodi specifici • public String getMethod() – restituisce il metodo HTTP; ad esempio: » Se la HTTP request è… GET http://www.dis.uniroma1.it/index.jsp?question=answer » … il metodo restituisce: "GET" • public String getRequestURI() – restituisce la parte di URL dal nome di dominio alla query string, esclusi » Se la HTTP request è… GET http://www.dis.uniroma1.it/index.jsp?question=answer » … il metodo restituisce: "/index.jsp" • … 13 HttpServletRequest HttpServletResponse • HttpServletResponse estende ServletResponse – metodi specifici • public String sendRedirect(String location) – redireziona il browser del client verso la pagina indicata • public String sendError(int sc, String msg) – restituisce un codice di errore al client (sc sta per status code), con un messaggio HTML definito » si pensi per esempio ad un codice di errore tipico sc := HttpServletResponse.SC_FORBIDDEN // 403 • … Servlet 14 Mantenimento della Sessione • HTTP è un protocollo stateless • Al di sopra, è stato costruito un sistema di registrazione di variabili di stato relative alla navigazione del client • È la Sessione – Identifica univocamente il browser in uso sulla macchina client durante la navigazione su una o più pagine residenti sul server • Viene inizializzata dal server – Può scadere per • timeout – impostato opzionalmente dal server • disabilitazione esplicita • Si pensi al meccanismo di login / logout dei siti ad accesso protetto – Registrazione / cancellazione della sessione autenticata 15 Mantenimento della Sessione • Fisicamente, le variabili di stato vengono salvate su file temporanei del Server – L'identificativo della Sessione (e del file sotteso)… • … viene salvato dal client in un cookie, oppure • … riscritto come parametro di request in tutti i link e le action dei form nelle pagine scritte dal server – pratica, quest'ultima, sconsigliabile 16 HttpSession • HttpSession è la classe preposta a gestire la sessione – HttpServletRequest espone il metodo • HttpSession getSession([boolean create]) – il parametro create indica se forzare la creazione di una sessione laddove non fosse stata già inizializzata » per default è true – Metodi di HttpSession • Object getAttribute(String name) • void setAttribute(String name, Object value) – metodi getter e setter per ricevere (risp., impostare) valori in sessione • void invalidate() – annulla la sessione in corso • … 17 Packaging e deploying di un progetto Servlet • Per dispiegare l'applicazione web basata su Servlet occorre – creare un file WAR con • nella sub-directory WEB-INF/ – file bytecode (*.class) – descrittore web.xml • nella sub-directory META-INF/ – file MANIFES T.MF • eventuali altri file di utilità – spostare il file WAR all'interno della specifica directory del servlet container 18 WEB-INF/web.xml Servlet 19 Servlet Demo (1) 20 Servlet Demo (2) 21 Servlet Demo (3) 22 Servlet Demo (4) 23 JSP (Java Server Pages) È la tecnologia Java per lo sviluppo di applicazioni Web mediante l’utilizzo di “pagine dinamiche” Sono pagine Web (HTML o XHTML) che risiedono sul server Web possono contenere codice Java attraverso l’utilizzo di opportuni tag, e componenti JavaBean Le pagine JSP vengono interpretate e tradotte in Servlet al momento della prima chiamata da client remoti Java Servlet è la tecnologia sottostante ma JSP facilita la creazione di interfacce 24 Servlet vs. JSP Servlet: richiede una dettagliata conoscenza della programmazione Java per lo sviluppo ed il mantenimento di tutti gli aspetti dell’applicazione Web, dato che il codice di esecuzione della richiesta ed il codice HTML risiedono nello stesso punto Servlet: cambiare il comportamento dell’applicazione o aggiungere supporto a nuovi tipi di client richiede una modifica del codice della servlet ed una sua ri-compilazione Servlet: è difficile trovare vantaggio dai tool per lo sviluppo di pagine Web quando si progetta l’interaccia dell’applicazione. ll codice HTML associato alla servlet deve essere inserito manualmente nel codice delle Servlet: Time-consuming Error-prone Boring 25 Servlet vs. JSP Servlet: si prestano meglio alla realizzazione di applicazioni service-oriented (Web service endpoints sono implementati come servlet) JSP: separa il processamento delle richieste (codice di business logic) dalla presentazione dell’informazione JSP: separando la request processing e la business logic dalla presentazione è possibile dividere lo sviluppo di tasks tra le persone aventi differenti skills Web designer per l'interfaccia (presentazione) Programmatori per la logica dell'applicazione 26 Funzionamento di JSP prova.jsp Read GET prova.jsp Generate provaServlet.java Compile <html>prova</html> Execut e provaServlet.class 1. il client richiede la pagina “prova” 2. Il server legge la pagina prova.jsp 3. Il server genera la servlet provaServlet.java 4. Il server compila la servlet.java ottenendo una classe eseguibile 5. Il server esegue la servlet 6. La risposta viene inviata la client 27 Elementi JSP Template text Commenti JSP Elementi di scripting Codice java da inserire nella servlet risultante Direttive JSP Controllano la struttura della servlet risultante Azioni JSP Controllano il comportamento del motore JSP 28 Template text e commenti JSP Template text: tutte le parti di testo che non sono definite come elementi JSP sono copiate nella pagina di risposta Commenti JSP: • Sitassi: <%-- commento --%> • Vengono eliminati dal container in fase di compilazione/traduzione della pagina • i commenti HTML sono considerati come normale elemento di testo 29 Elementi JSP Porzioni di codice in uno scripting language specificato nelle direttive (di default Java) Scriptlet: con sintassi <% code %>; possono contenere variabili locali valide solo per una singola esecuzione della Servlet (prodotta in seguito alla compilazione della JSP) Declaration: con sintassi <%! declaration [declaration] ...%>; sono metodi o variabili la cui durata è quella della Servlet (conservano il loro valore per tutte le esecuzioni della servlet) Expression: con sintassi <%= expression %>; l’espressione viene valutata e scritta nella pagina di risposta della JSP 30 Direttive JSP: page Definisce attributi e parametri dipendenti dalla pagina, come ad esempio il linguaggio di scripting usato, la pagine di errore, requisiti di buffering. Attributi: language: indica il linguaggio di script usato negli script elements. Il valore di default è Java (se siano supportati altri linguaggi o meno dipende dal container) import: serve ad importare package all’interno della JSP, equivalente alla import del linguaggio Java (ma si possono specificare più package contemporaneamente, separati da virgole) buffer: indica se l’output stream debba essere bufferizzato e, contestualmente, la dimensione minima del buffer (il default è 8KB). Utile nel caso di redirezione richiesta a runtime quando dei dati sono stati già inviati in output (come nel caso di error pages) errorpage: Indica la pagina a cui si viene reindirizzati in caso di eccezioni. Ha un valore espresso da un URL. 31