1 Java Servlet 2 Introduzione Java è linguaggio orientato alla programmazione di tipo client/server, distribuita e delle reti □ Esempi: Gestione delle comunicazioni via socket Gestione di oggetti remoti attraverso l’invocazione remota di metodi (RMI) Programmazione Web Oriented: □ Il client è costituito da un web browser che interegisce con la parte server tramite protocollo HTTP 3 Programmazione Web Oriented Modello Common Gateway Interface (CGI) consente ad un client web di interfacciarsi con risorse/servizi residenti su un server Sequenza operazioni: □ □ □ Client effettua una chiamata al server tramite browser Il web server esegue l'applicazione L'applicazione produce un output passato al Web Server che lo invia al client 4 La Servlet API API introdotta da SUN a partire dalla JDK 1.2 per la realizzazione di applicazioni CGI in Java E' una libreria opzionale di Java che permette di realizzare classi Java caricate dinamicamente, per espandere le funzionalità di un Web Server Una Servlet è un programma Java in esecuzione sul server in grado di colloquiare con un client per mezzo del protocollo HTTP 5 Servlet vs CGI CGI utilizza un processo per ciascun programma e/o richiesta Le Servlet possono essere gestite da thread separati in esecuzione all'interno dello stesso processo, oppure da più thread all'interno di diversi processi sparsi su più Web Server di backend Le Servlet sono: □ □ Più efficienti e scalabili Più portabili rispetto al sistema operativo (grazie alla tecnologia Java in cui sono implementate) 6 Supporto per le Servlet Java Servlet sono un pacchetto opzionale (Standard Extension) presente nel pacchetto J2EE Le API (l'ultima versione è la 2.5) sono: □ javax.servlet □ javax.servlet.http □ Scaricabili dal sito della SUN http://java.sun.com/products/servlet Le servlet sono eseguite e dispiegate (deploy) in un servlet container o servlet engine 7 Servlet Container Oggetto in cui la Servlet vive ed in cui trova un contesto di esecuzione personalizzato In questo corso sarà utilizzato il JBOSS Application Server (vers. 4.0.3) scaricabile dal sito del corso □ JBOSS utilizza il container Apache Tomcat (vers. 5.5) 8 La Servlet API (2) Le servlet usano le classi e le interfacce contenute nei due package: javax.servlet e javax.servlet.http Il package javax.servlet contiene le classi e le interfacce per realizzare una generica servlet (indipendentemente dal protocollo http) Sono estese dalle classi presenti nel package javax.servlet.http per aggiungere le funzionalità del protocollo http 9 La Servlet API (3) Ogni servlet deve implementare l'interfaccia javax.servlet.Servlet Si estende una delle due classi speciali □ □ javax.servlet.GenericServlet (per servlet indipendenti dal protocollo) javax.servlet.http.HttpServlet (per HTTP servlet) 10 Gerarchia delle classi - servlet Interface javax.servlet.Servlet ● init(Servlet Config c) ● service(Request req, Response res) ● destroy() altri metodi… Interface javax.servlet.ServletConfig Mantiene i dati di configurazione della servlet abstract class javax.servlet.GenericServlet Implements Servlet, ServletConfig, Serializable Offre un’implementazione dell’interfaccia servlet indipendente dal protocollo abstract class javax.servlet.http.HttpServlet extends GenericServlet implements Serializable Offre un’implementazione dell’interfaccia servlet specifica per HTTP 11 Esempio Servlet import javax.servlet.*; import javax.servlet.http.*; import java.io.*; //import java.util.*; public class PrimaProva extends HttpServlet { public void service(HttpServletRequest req, HttpServletResponse res) throws IOException,ServletException { String param1=req.getParameter("da"); String param2=req.getParameter("a"); int da=Integer.parseInt(param1); int a=Integer.parseInt(param2); OutputStream os=res.getOutputStream(); PrintWriter out=new PrintWriter(os); out.println("<HTML><HEAD><TITLE>Prima Prova</TITLE></HEAD>"); out.println("<BODY><TABLE BORDER=\"1\">"); for(int i=da;i<=a;i++) { out.println("<TR><TD>"); out.println(i); out.println("</TD></TR>"); } out.println("</TABLE></BODY></HTML>"); out.close(); } } 12 Ciclo di vita: inizializzazione Metodo init(): □ □ Effettua le operazioni necessarie per l'inizializzazione della nuova servlet e per il suo corretto funzionamento Derivato dalla classe GenericServlet public void init(ServletConfig config) throws ServletException { { Viene invocato quando la servlet viene caricata per la prima volta nel container Termina prima di qualsiasi altra chiamata fatta alla servlet 13 Ciclo di vita: esecuzione Metodi: □ service () □ doPost () □ doGet () Dopo l'inizializzazione, la servlet attende una richiesta da parte del client che può essere indistintamente una Post o una Get HTTP L'interfaccia Servlet mette a disposizione il metodo public void service(HttpServletRequest Req, HttpServletResponse Res) throws ServletException, IOException 14 Ciclo di vita: esecuzione(2) Metodo service(): E' eseguito dal server in modalità multithread (uno per ogni richiesta) Viene invocato indifferentemente sia nel caso di un'invocazione di tipo Get che di tipo Post Viene utilizzato al posto di doGet e doPost Realizza la comunicazione bidirezionale con i client per mezzo dei suoi due parametri: □ □ L'oggetto HttpServletRequest che contentente i dati inviati dal client. L'oggetto HttpServletResponse che rappresenta la risposta della servlet al client. 15 HTTP: Concetti Base 16 HTTP Request La servlet può comunicare con il client in modo bidirezionale tramite le interfacce: { HTTPServletRequest che rappresenta la richiesta e contiene i dati provenienti dal client. Questi dati sono un insieme di parametri nome/valore ed un flusso di dati di input { HTTPServletResponse che rappresenta la risposta della servlet e consente di incapsulare tutte le informazioni da inviare indietro al client 17 HTTP Request (2) Una richiesta HTTP è composta da: { Un metodo di richiesta { Una URL di richiesta { Degli HEADER Fields (da cui dipende la codifica dei pacchetti http scambiati) { Il Body della richiesta cioè i dati di input inviati dal client che possono essere: Dati di input non strutturati (espressi in forma testuale) inviati tramite il metodo getReader() che restituisce un oggetto di tipo BufferedReader Dati di input in formato binario inviati tramite il metodo getInputStream() che restituisce un oggetto di tipo ServletInputStream 18 HTTP Request Methods I metodi di richiesta più importanti sono: { { □ { { GET: recupera la risorsa identificata dalla URL richiesta POST: invia al container dati di lunghezza illimitata HEAD: ritorna l'header identificato dalla URL (e.g.Content-Type, Content-Length) PUT: memorizza una risorsa contenuta nella URL di richiesta DELETE: rimuove la risorsa contenuta nella URL 19 HTTP Request: metodo GET GET IP-address/ resourseName?param1=val1&...&paramN=valN Usato per richiedere dati (pagine HTML,...) { e.g. GET http://www.esempio.com accedo alla pagina index.html del server www.esempio.com Specifica parametri: parameterName=value; { { e.g. GET http://www.esempio.com?nome=ruggero Web server destinatario può usare il valore del parametro per inviare contenuti specifici 20 HTTP Request: metodo POST POST IP-address/ resourseName?param1=val1&...&paramN=valN Usato per accedere a risorse dinamiche { e.g. Dati utente raccolti mediante FORM HTML Differenze tra GET e POST { { GET trasmette parametri appendendoli a URL POST trasmette parametri inclusi in body della richiesta 21 HTTP Response Una HTTP response contiene: { Un result code cioè codici d'errore e.g.: 400: risorsa non disponibile 401: risorsa richiede un'autenticazione 500: errore occorso all'interno del server 503: Web Server momentaneamente sovraccarico e non può soddisfare la richiesta { Degli HEADERS field 22 HTTP Response (2) □ Un Body contentente i dati di output che posso essere: Dati di output non strutturati (espressi in forma testuale) inviati tramite il metodo getWriter() che restituisce un oggetto di tipo java.io.Writer Dati di output in formato binario inviati tramite getOutputStream()che restituisce un oggetto di tipo ServletOutputStream 23 Ciclo di vita: distruzione Metodo destroy(): Viene chiamato per consentire alla servlet di eseguire il rilascio di tutte le risorse (e.g., file aperti, connessioni a Data Base, ecc.) prima che la servlet venga distrutta □ La distruzione di una servlet ed il relativo scaricamento (unloading) dalla memoria avviene solo quando tutte le chiamate a service() da parte dei client sono state eseguite, o allo scadere di un timeout specificato □ 24 Esempi 25 JBOSS AS E’ un application server openSource Utilizza esclusivamente standard basati su J2EE Ha costi di licenza nulli Vasta comunità di sviluppatori Ampio supporto tecnico Per eseguire il deploy di una Servlet utilizza il container Tomcat sviluppato da Apache Software Foundation 26 Installation how to passo1: installazione di jdk-1_5_0_06-windowsi586-p passo2: installazione di JBOSS-4.0.3SP1 # java –jar jboss-4.0.3SP1.jar richiesta di scelta della versione della jdk richiesta di realizzare una installazione completa Nota: di default JBoss utilizza la porta 8080 per esporre i servizi web. E’ possibile modificare la porta (in generale le configurazioni base) modificando il file server.xml di tomcat 27 Installazione (2) 28 Esempio Servlet import javax.servlet.*; import javax.servlet.http.*; import java.io.*; //import java.util.*; public class PrimaProva extends HttpServlet { public void service(HttpServletRequest req, HttpServletResponse res) throws IOException,ServletException { String param1=req.getParameter("da"); String param2=req.getParameter("a"); int da=Integer.parseInt(param1); int a=Integer.parseInt(param2); OutputStream os=res.getOutputStream(); PrintWriter out=new PrintWriter(os); out.println("<HTML><HEAD><TITLE>Prima Prova</TITLE></HEAD>"); out.println("<BODY><TABLE BORDER=\"1\">"); for(int i=da;i<=a;i++) { out.println("<TR><TD>"); out.println(i); out.println("</TD></TR>"); } out.println("</TABLE></BODY></HTML>"); out.close(); } } 29 Esempio Servlet Compilazione di PrimaProva.java 30 Esempio Servlet (2) Creare la cartella prova.war In prova.war creare la cartella WEB-INF In WEB-INF creare la cartella classes In classes inserire I file *.class ottenuti a seguito della compilazione del file .java In WEB-INF creare il file web.xml 31 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <servlet> <servlet-name>PrimaProva</servlet-name> <servlet-class>PrimaProva</servlet-class> </servlet> <servlet-mapping> <servlet-name>PrimaProva</servlet-name> <url-pattern>/PrimaProvaServlet</url-pattern> </servlet-mapping> </web-app> 32 Deploy Copiare la cartella prova.war nella cartella deploy di Jboss Nota: ogni volta che viene apportata una modifica al file .java devo cancellare la cartella e rieseguire l’operazione di deploy 33