Università degli Studi di Modena e Reggio Emilia Facoltà di Ingegneria – Reggio Emilia CORSO DI TECNOLOGIE E APPLICAZIONI WEB La Tecnologia CGI-Servlet Ing. Marco Mamei M. Mamei – La tecnologia CGI 1 Programmazione client/server in WWW HTTP client sistema locale richiesta HTTP risposta server sistema remoto PROTOCOLLO http BASE: La risposta normalmente è statica Æ la pagina ricevuta dal server pre-esiste memorizzata sul server. Anche se la pagina potrà essere “interattiva “ (p.e., perché contiene client-side script) essa è comunque preesistente. CGI introduce la possibilità di avere risposta con informazioni dinamiche Æ dei programmi software sul server vengono lanciati in esecuzione dal server stesso in risposta a specifiche richieste, e producono in output una pagina HTML richiesta Risposta tipo di elaborazione Documento HTML CGI Statica (la pagina è un file, non modificabile) Dinamica Æ la pagina viene prodotta dinamicamente sul server semplice trasferimento file dal server qualunque elaborazione sul nodo server Æ applicazioni che vengono lanciate in esecuzione da specifiche richieste http e che producono una pagina Web in risposta M. Mamei – La tecnologia CGI 2 Common Gateway Interface (CGI) applicazioni esterne HTTP client sistema locale richiesta HTTP risposta server CGI sistema remoto CGI è uno standard per interfacciare un server WWW con applicazioni esterne (residenti sulla macchina server) CGI fornisce all’utente la capacità di eseguire una applicazione sulla macchina server remota NOTA: CGI non stabilisce in quale linguaggio dovrà essere scritta la applicazione. CGI stabilisce solo il protocollo di interazione tra server e applicazione. Qualsiasi applicazione che rispetta tale protocollo potrà diventare una applicazione CGI, o, secondo una terminologia più diffusa, un servizio Web Applicazioni CGI possono essere scritte in: C/C++, Fortran, PERL, TCL, Any Unix shell, Visual Basic, PHP, Java ….etc etc M. Mamei – La tecnologia CGI 3 Programmazione CGI Una applicazione CGI permette agli utenti di eseguire una applicazione sul nodo dove risiede il server www. Normale attivazione di una CGI: • Si invia al server un messaggio (questo può avvenire sia attraverso FORM HTML, sia attraverso applicazioni ad-hoc) i cui dati serviranno come input al programma. • Il messaggio scatena l'esecuzione del programma CGI • Il programma CGI genera come output ad esempio una pagina HTML in cui inserisce i risultati della sua esecuzione Interfaccia tra server WWW e applicazione CGI • Standard input: il server manda come standard input alla applicazione CGI i dati ricevuti dal client (browser). Il numero di byte totali è nella varabile di ambiente CONTENT_LENGTH. • Coppie Nome-Valore: L’input della applicazione è costituito da insiemi di stringhe nome=valore. In pratica, l’input è formato da una serie di variabili con un nome e un valore. Le differenti variabili sono separate da & • Standard output: l’applicazione CGI manda il risultato dell-elaborazione sullo standard output (in formato HTML), verso il server, il quale prende i dati e li manda al client. M. Mamei – La tecnologia CGI 4 ESEGUIRE LE CGI CON LE FORM HTML Un modo semplice ed efficace di invocare una CGI è attraverso una form HTML. - il TAG FORM può essere associato a una ACTION, corrispondente a una applicazione da eseguirsi sul server - la esecuzione si scatena quando si fa click sul BUTTON SUBMIT <TITLE>Esempio di Form </TITLE> <H1>Esempio di Form </H1> <FORM METHOD="POST" ACTION="http://127.0.0.1:8080/cgi-tests/NULLA"> Premi invio: <INPUT TYPE="submit" VALUE="Lancia Applicazione"> </FORM> M. Mamei – La tecnologia CGI 5 La prima CGI (*) Ecco il file Servlet.java. Le Servlet sono il costrutto java per realizzare applicazioni CGI. Le Servlet inoltre, come vedremo più avanti, estendono il concetto di CGI verso quello più sofisticato di Web Services. import java.io.*; import javax.servlet.*; public class Servlet1 extends GenericServlet { public void service(ServletRequest req, ServletResponse res) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<h1>Hello World!</h1>"); out.println("</body>"); out.println("</html>"); } } In questo caso, la nostra CGI stampa output senza avere preso alcun input. In effetti, la form con cui la abbiamo lanciata aveva solo il bottone submit ma non aveva altri componenti che permettessero di fare input. NOTIAMO: l’output della applicazione e’ un documento HTML. Poiché in generale le servlet vengono accedute tramite browser è opportuno fornire come output qualcosa che il browser sappia interpretare (text, html, xml). Tuttavia, si possono immaginare situazioni (le vedremo più avanti) in cui una servlet può essere acceduta da un applicazione java ad-hoc. In questo caso è necessario che client (applicazione java) e server (servlet) siano accordate sul formato dei messaggi (e.g. SOAP). M. Mamei – La tecnologia CGI 6 Analisi del primo esempio import java.io.*; import javax.servlet.*; // import necessari public class Ese1 extends GenericServlet /* la classe GenericServlet implementa l’interfaccia Servlet, che richiede la realizzazione di alcuni metodi di base */ { public void service(ServletRequest request, ServletResponse response) throws IOException, ServletException /* il metodo service è il metodo che viene scatenato quando si accede alla Servlet */ /* I suoi parametri rappresentano sono oggetti che servono per recuperare i dati relativi alla invocazione della Servlet (request) e per preparare i dati relativi alla risposta della servlet (response) */ { response.setContentType("text/html"); /* diciamo il tipo della risposta (VEDI DOPO) */ PrintWriter out = response.getWriter(); /* per scrivere la risposta, abbiamo bisogno dell’apposito flusso di output. Lo recuperiamo chiedendolo all’oggetto response. // Scriviamo la risposta in HTML out.println("<html>"); out.println("<body>"); out.println("<h1>Hello World!</h1>"); out.println("</body>"); out.println("</html>"); } } M. Mamei – La tecnologia CGI 7 APPLICATION-TYPE Quando un browser riceve un file, riconosce che file è o dalla estensione (.html, .txt, etc. etc.) o dalla intestazione del file (p.e., <?XML version1.0> Con le CGI, poiché l’output è prodotto da un programma e non da un file, non vi è l’estensione…. E’ necessario specificare come prima cosa dell’output il tipo di contenuto che seguirà: Content-type: text/html Content-type: text/txt E quindi, come visto prima, la Servlet come prima cosa, nel suo output, dovrà produrre questo response.setContentType("text/html"); M. Mamei – La tecnologia CGI 8 Servlet: Architettura generale Il ciclo di vita di una servlet: - si crea un oggetto dalla classe servlet corrispondente la prima volta con init - questo oggetto rimane in esecuzione fintanto che può servire (quando lo si rilascia esplicitamente con destroy) - i servizi service vengono serviti più velocemente (non si deve mandare in esecuzione un nuovo processo ogni volta) - l’oggetto servlet può essere dotato di stato interno (tramite appositi attributi) e quindi può differenziare il suo comportamento sulla base della storia passata delle richieste - più richieste in concorrenza vengono gestite creando un thread che va ad eseguire il metodo service della servlet – ci potrebbe essere bisogno di sincronizzare i thread Le Servlet come moltre altre tecnologie che vedremo nel corso sono applicazioni gestite da un’applicazione esterna (applicazioni managed). Non hanno un main, quindi non eseguono autonomamente. Ci sarà, a qualche parte, un’altra applicazione – con il main – che attiva e gestisce i metodi della servlet. Qusta applicazione è il Servlet Container. M. Mamei – La tecnologia CGI 9 Il Servlet Container Il servlet container è reposnsabile del buon funzionamento delle servlet, in particolare si occupa di: • Fornire, in collaborazione con il web-server, i servizi di rete tramite i quali avviene l’interazione tra client e servlet. • Stabilire un mapping per la servlet, cioè creare un’associazione tra la servlet e un URL • Decodificare le richieste e formattare i risultati basati sui formati MIME. • Gestire il ciclo di vita delle servlet (vedi dopo) • Supportare protocolli comd http • Gestire il mulithreading • Gestire eventuali politiche di sicurezza. In generale, il servlet container è un’istanza di middleware: un componente sw. inserito tra il sistema operativo e l’applicazione per offrire servizi avanzati all’applicazopme che dunque si semplifica M. Mamei – La tecnologia CGI 10 CGI CON INPUT <TITLE>Esempio di Form </TITLE> <H1>Esempio di Form </H1> <FORM METHOD="POST" ACTION="http://wwwlia.deis.unibo.it/cgi-bin/post-query"> Inserisci del NAME="entry"> testo: <INPUT TYPE=”TEXT” e premi per invio: <INPUT TYPE="submit" VALUE="Invio"> </FORM> Visualizzazione form Per tutte i tag ai quali si può dare input, viene data alla applicazione come input, quando la si lancia, una serie di coppie NOME=VALORE, separate da &, che potrà usare per capire quali dati ha selezionato/inserito l’utente. Nell’esempio: entry=quello_che_l’utente_ha_scritto_nel_textfield& submit=Invio M. Mamei – La tecnologia CGI 11 ANALIZZIAMO ACTION E METHOD Attributi del form tag <TITLE>Esempio di Form </TITLE> <H1>Esempio di Form </H1> <FORM METHOD="POST" ACTION="http://wwwlia.deis.unibo.it/cgi-bin/post-query"> Inserisci del testo: <INPUT NAME="entry"> e premi per invio: <INPUT TYPE="submit" VALUE="Invio"> </FORM> Dove: ACTION METHOD URL di chi processa la query (la applicazione, il file che contiene la applicazione da eseguire) metodo usato per sottomettere il form: POST il form con i dati è spedito come data body (metodo consigliato), cioè come dati che fanno parte del testo del messaggio HTTP GET il form con i dati è spedito attaccato all’URL, cioè come parte integrante dell’URL del messaggio (action?name=value&name=value) caso GET http://www-lia.deis.unibo.it/cgi-bin/ get-query?entry=testo&submit=Invio caso POST http://www-lia.deis.unibo.it /cgi-bin/post-query e come data body: entry=testo&submit=Invio M. Mamei – La tecnologia CGI 12 Differenza tra GET e POST Con il metodo GET I dati del form sono appeso all’URL specificato nell’attributo ACTION del tag FORM. I solito il GET è usato quando I dati da inviare sono pochi o quando si desidera che il link possa essere memorizzato in un bookmark Con il metodo POST I dati del form sono inseriti nel corpo della richiesta. Questo metodo è utilizzato nel caso in cui non si desidera visualizzare I parametri nell’URL (visibile nel browser) o nel caso di molte imformazioni M. Mamei – La tecnologia CGI 13 Come Recuperare l’input da una CGI import java.io.*; import java.util.*; import javax.servlet.*; public class CGI0 extends GenericServlet { public void service (ServletRequest request, ServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<h2> Lunghezza Totale: " + request.getContentLength() + " byte </h2>"); out.println("<h2> Ecco cosa hai scritto </h2>"); out.println("<br><br>"); out.println("<br><br>"); String valore = request.getParameter("entry"); out.print("NOME " + valore + " "); out.println("<br><br>"); out.println("</body>"); out.println("</html>"); }} M. Mamei – La tecnologia CGI 14 BASIC FORM TAGS I forms sono i moduli per richiedere informazioni all’interno delle pagine html. Vediamo una breve lista delle possiblità con cui sperimentare… Tag/attribute <FORM> Use Indica un form all’interno di un documento HTML. All’interno di <FORM></FORM> si devono mettere tutti i campi che servono per generale l’input e sottmetterlo al server <INPUT TYPE=“SUBMIT” VALUE=”…”> Fornisce un pulsante submit per il form. La pressione di questo pulsante scatena l’invio del form al server. L’attributo value produce il testo sul pulsante. Fornisce un pulsante submit grafico. L’attributo SRC indica l’immagine che è originata dal file indicato, e l’attributo bordo = compone il bordo dell’immagine. Fornisce un pulsante reset per il form, che annulla tutti i dati inseriri. L’attributo VALUE produce un testo sul pulsante. <INPUT TYPE=“IMAGE” NAME= “POINT” SRC= “…” BORDER=0> <INPUT TYPE=“RESET” VALUE= “…”> M. Mamei – La tecnologia CGI 15 Input Field Tag and Attribute Tag/attribute <INPUT> TYPE= “…” NAME= “…” VALUE= “…” SIZE= “n” MAXLENGTH= “n” SELECTED ACCEPT= “…” M. Mamei – La tecnologia CGI Use Fissa un’area in un form per l’input di dati dall’utente Fissa il tipo di campo di input. Possibili valori sono TEXT, PASSWORD, CHECKBOX, RADIO, FILE, HIDDEN, IMAGE, SUBMIT, e RESET. Nome della variabile Fornisce un contenuto associato con NAME= “…” . Bisogna usare questo attributo con i pulsanti RADIO e CHECKBOX perché non accettano altri input. Si può anche usare con text fields per avere un input iniziale. Fissa la dimensione visibile per un field. E’ possibile usare questo attributo solamente con i text input. Fissa il più lungo set di caratteri che possono essere sottomessi. Usare questo attributo con text fields. Indica la selezione di default che deve essere presentata quando il form è inizialmente caricato o resettato. Specifica i tipi accettabili di MIME per file caricati. Wildcards sono accettabili come in image/*. 16 Text Area Tags and Attributes Tag/attributes <TEXTAREA> NAME= “…” ROWS= “…” COLS= “…” M. Mamei – La tecnologia CGI Use Fissa un’area in un form per un inserimento dati testuale dell’utente. Il contenuto iniziale del textarea va inserito tra l’opening e il closing tag. Stabilisce una nome per un input field. L’attributo NAME è usato nel caso di CGI Fissa il numero di linee per l’area Fissa il numero di colonne per l’area. 17 Select Fiedls Tags and Attributes Tag/attributes <SELECT> NAME= “…” SIZE= “n” MULTIPLE <OPTION> VALUE= “…” SELECTED M. Mamei – La tecnologia CGI Use Fissa un’area in un form per un field di selezione che può intendersi come una lista a cascata. Stabilisce un nome Fissa la dimensione di larghezza per i campi. Il default crea una lista a cascata. Si può cambiare il default (2 o maggiore) se si vogliono più opzioni ben visibili. Fa si’ che un campo selezionato accetti più di una selezione. Si utilizza questo attributo insieme a SIZE= per fissare un numero grande quanto il massimo numero di possibili selezioni. Evidenzia i valori inclusi nel campo selezionato. Si avrà un <OPTION> per ogni item che si inserirà . Il closing tag è opzionale. Fornisce un valore associato a Name Fa specificare una selezione per default che apparirà quando il form è inizialmente caricato o resettato 18
© Copyright 2024 Paperzz