Programmazione lato server CGI e introduzione alle

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