Copyrigtht © 1996, 1997 Universita' di Firenze. All rights reserved.
Free license available.
a cura di:
Alessandro Fiorenzi
Revisori:
Prof. F.Pirri, Ing.
M. Lunghi, Ing. C.
Vestri
|
Lo sviluppo di applicazioni su DataBase,
in relazione all'ambito in cui l'applicazione produrrà i suoi
frutti, richiede strumenti e modalità di accesso diverse.
Lo svuluppo di applicazioni destinate al mondo internet/intranet,
si avvale di programmazione CGI o JAVA.
Lo sviluppo di applicazioni in rete locale che non sia una
intranet, impone l'utilizzo di strumenti diversi, legati a
linguaggi di alto livello.
|
Il Web è un sitema informativo di rete basato su un'architettura software di tipo client-server, con specifiche tipologie di software Client e di software Server.Il Client (o user agent) è lo strumento a disposizione dell'utente, tipicamente un browser, per la navigazione nel Web.
Il Client assolve le seguenti competenze:
I Browser gestiscono un numero limitato di tipologie d'informazione, tipicamente testo e immagini, per le altre si affidano ad applicazioni esterne (helper) per esempio per il playback di filmati, o a Plug-In, librerie di codice specializzato, che possono essere caricate in memoria all'occorrenza.
I Server sono strumenti software permanentemente in esecuzione su elaboratori, dedicati a specifiche funzioni. I loro compiti si riassumono in:
Nonostante la semplicità dei compiti, la realizzazione di un server richiede:
Il Web essenzialmente si appoggia su tre standard:
Nel tempo si sono ampliate le funzionalità richieste dagli utenti e si è incominciato a parlare di funzionalità estese del Web; accesso a DB, linguaggi script per il Web, Java e altro ancora.
|
Il Binomio Web-Database si realizza, mediante l'utilizzo delle FORM. Questa estensione del Web prevede:
Il processo realizza lo schema illustrato dalla slide. Ad esempio, supponiamo di trovarci in una situazione assai tipica
Immaginiamo che si voglia presentare all'utente un modulo di ricerca in biblioteca di questo tipo (in una pagina HTML):

Esistono degli appositi tag di HTML destinati a creare simili moduli. è possibile includere:
Il codice HTML che genera il modulo sopra visto è il seguente:
<HTML>
|
Il tag <FORM ... > ha un parametro ACTION
che specifica l'oggetto (ossia il programma) a cui il server
dovrà consegnare i dati immessi dall'utente. In questo caso,
vanno consegnati a un programma il cui nome biblio.cgi.
I tag <INPUT ... > definiscono le parti
della form che gestiscono l'interazione con l'utente. In questo
caso abbiamo:
Quando l'utente preme il bottone "Submit Query" il client provvede a inviare i dati al server, assieme all'indicazione dell'URL alla quale consegnarli.
I dati vengono inviati come coppie:
NomeDelCampo1=ValoreDelCampo1&NomeDelCampo2=ValoreDelCampo2
ecc.
dove:
NomeDelCampo viene dal parametro NAME;ValoreDelCampo è la stringa immessa
dall'utente in quel campo;&
e sono opportunamente codificate, se ci sono spazi e
caratteri speciali.La forma specifica del messaggio inviato dal client dipende
anche da un altro parametro del tag FORM: oltre a ACTION=...
c'è anche METHOD=... , che può essere:
GET, assunto implicitamente (come nel nostro
esempio);POST, che deve essere indicato in modo
esplicito (questo è praticamente l'unico ambito nel
quale è ammesso l'uso di tale comando).Dunque, possiamo avere:
<FORM ACTION="....."><FORM ACTION="....."
METHOD="get"><FORM ACTION="....."
METHOD="post">Nel primo e nel secondo caso, la richiesta inviata dal client consiste nella specifica della URL alla quale vengono "appesi" i dati richiesti (con un punto di domanda):
GET
/scripts/biblio.cgi?titolo=congo&autore=crichton&submit=submit
HTTP/1.0
User-agent: ...
Accept: ...
...
<----- riga vuota
Nel caso del metodo POST, che in questo contesto
è molto diffuso, i dati vengono rinviati nel corpo del
messaggio:
POST /scripts/biblio.cgi
HTTP/1.0
User-agent: ...
Accept: ...
...
Content-type:
application/x-www-form-urlencoded
Content-length: 42
<----- riga vuota
titolo=congo&autore=crichton&submit=submit
<----- dati della form
Il primo metodo è molto semplice, ma impone un limite al numero di caratteri che possono essere spediti. Il secondo invece non ha alcun limite, ed è da preferire.
Quando il server riceve la richiesta, da questa è in grado di capire:
Nel nostro esempio il programma biblio.cgi avrà
l'incarico di:
Naturalmente, il Server Web dovrà essere configurato per sapere dove trovare i programmi CGI.
|
Un programma CGI realizza un'interfaccia essenziale fra il Web e le basi di dati, definendo un Gateway fra Server (Common Gateway Interface).
Un programma CGI può essere scritto in qualunque linguaggio:
Per la comunicazione dal server Web al programma CGI si utilizzano:
POST:
i dati della form sono inviati mediante pipe).Molte variabili d'ambiente sono impostate dal server prima di lanciare il programma CGI; le principali sono:
| QUERY_STRING | La lista di coppie campo=valore
(usata con il metodo GET) |
| PATH_INFO | Informazioni aggiuntive messe dopo l'URL (usate ad esempio con le clickable map) |
| CONTENT_TYPE | Usata con il metodo POST,
indica il tipo MIME delle informazioni che arriveranno
(application/x-www-form-urlencoded); |
| CONTENT_LENGTH | Usata con il metodo POST,
indica quanti byte arriveranno sullo standard input del
programma CGI |
In più ci sono altre variabili per sapere chi è il server, chi è il client, per l'autenticazione, ecc.
L'output del programma CGI deve iniziare con un breve header contenente delle metainformazioni, che istruiscono il server su cosa fare. Poi una riga vuota, quindi l'eventuale pagina HTML.
Le metainformazioni che il server prende in considerazione (tutte le altre sono passate al client) sono:
| Metainformazione | Valori | Significato |
| Content-type: | Tipo/Sottotipo MIME | Tipo dei dati che seguono |
| Location: | URL | File da restituire al client |
| Status: | OK, Error | Esito dell'elaborazione |
Ad esempio, supponendo di usare un linguaggio di
programmazione nel quale sia definita un'ipotetica procedura println
(String s) che scrive una linea di testo sullo standard
output, un programma CGI che genera al volo una semplice pagina
HTML potrà contenere al suo interno una sequenza d'istruzioni
quale:
println("Status: 200 OK");
println("Content-type: text/html");
println(""); //linea vuota che delimita la fine delle
metainformazioni
println("<HTML>");
println("<HEAD>");
...
println("</HEAD>");
println("<BODY>");
...
println("</BODY>");
println("</HTML>");
Viceversa, se il programma CGI vuole effettuare una URL redirection il codice eseguito potrà essere:
println("Status: 200 OK");
println("Location: /docs/index.html");
println(""); //linea vuota che delimita la fine delle
metainformazioni
Dunque, la tipica catena di eventi è la seguente:
Il meccanismo delle CGI richiede un Server Web molto efficiente, per evitare rallentamenti, ma assicura un elevato livello di sicurezza, a dispetto di sistemi che utilizzano Java per interconnettersi ad un DB. Infatti, L'applet java che gira sul client s'interconnette direttamente al DB scavalcando il Server Web, questo naturalmente aumenta le performance, ma va a scapito della sicurezza del DB in quanto è l'applet che lavora direttamente sul DB .
|
Lo sviluppo di applicazioni su database che non si appoggiano su una Internet o intranet, pone un serio problema di interoperabilità, problema che è stato risolto con i seguenti stumenti:
|
Si possono sviluppare applicazioni che operano su una vastità di DB di produttori diversi, disponendo di driver nativi per l'accesso al DB di ogni specifico produttore, diversamente non sarà possibile l'interoperazione fra DB. Naturalmente ogni produttore avrà definito con suoi nomi, e con specifica sintassi, operazioni simili o uguali a quelle di altri produttori. Tutto ciò comporta aggravi di costi nello sviluppo di applicazioni. Infatti, dovendo operare su DB dei produttori A e B che implementano, per esempio, la SELECT con due sintassi diverse, nei programmi dovrei usare l'una o l'altra a seconda del DB con cui voglio lavorare. Naturalmente i driver nativi sono molto performanti.
|
Lo standard ODBC Open DataBase Connectivity è una interfaccia applicativa proposta da Microsoft nel 1991 per costruire applicazioni eterogenee, supportate dalla maggior parte dei prodotti relazionali. Tramite driver ODBC, le applicazioni interagiscono con uno specifico server. ODBC uniforma la sintassi delle varie operazioni, e si fa carico di convertirle in quelle specifiche di ogni produttore, mascherando così i vari problemi di connettività, e rendendo molto agevole la produzione di software,La sua struttura si articola in quattro componenti, la cui cooperazione permette di accedere a Database remoti.
Sinteticamente potremmo dire che ODBC si compone di due parti: una, costruita da Microsoft, per gestisce il colloquio con i programmi applicativi, laltra che e il driver vero e proprio, e realizzata dal fornitore del database per gestire laccesso alla base dati. Grazie a questa soluzione si ottiene una forte uniformita nelle tecniche di accesso alla base dati rendendo di fatto lapplicativo indipendente dalla sorgente di dati stessa.
JDBC
Larchitettura JDBC funziona allo stesso
modo. In particolare, data la somiglianza con quella ODBC, esiste
un particolare livello intermedio, chiamato JDBC/ODBC
Bridge, che permette di usare un driver ODBC con
applicazioni JDBC.
Perché allora, se il JDBC è così simile allODBC, non è
stato utilizzato questultimo?
Secondo gli sviluppatori della JavaSoft vi sono vari motivi.
Intanto, affermano, lODBC è molto complesso, ha pochi
comandi con molte opzioni, mentre larchitettura Java
preferisce basarsi su una serie di metodi semplici e immediati da
utilizzare, magari tanti, ma con pochi parametri. Inoltre, esso
si basa moltissimo sullutilizzo di puntatori a void e su
altre caratteristiche del C che trovano scarso o nessun riscontro
in Java.
Il pesante utilizzo di puntatori multipli o di tecniche basate su
deriferimenti, rende troppo difficile importare tale architettura
in Java. Comunque sia, le classi JDBC si sono aggiunte alle già
svariate classi di Java, diventando ben presto un punto di
riferimento fondamentale per chiunque voglia sviluppare
applicazioni basate sui dati in questo linguaggio.
Ma quali sono i vantaggi delle classi JDBC?
Innanzitutto esse permettono di scrivere applicazioni Java che
possono accedere a qualunque base dati semplicemente utilizzando
istruzioni SQL, non solo quelle standard, ma di fatto anche
qualunque estensione proprietaria sviluppata. Il tutto
continuando ad avvalersi dei molteplici vantaggi del linguaggio
Java, come la capacità di girare su qualunque piattaforma, la
robustezza garantita dai meccanismi di sicurezza e dalla gestione
delle eccezioni, la possibilità di operare in locale come in
remoto dato dalle classi RMI. Il meccanismo è così flessibile
che se uno sposta i dati da una base dati ad unaltra, deve
solo cambiare il driver JDBC e lapplicazione continuerà a
funzionare regolarmente con la nuova base dati. Laltro
aspetto è che, nonostante il meccanismo del Driver Manager
garantisca uninterfaccia comune a tutti i sistemi e le basi
dati, la presenza di driver JDBC specifici per ogni base dati
supportata garantisce un utilizzo ottimale delle caratteristiche
specifiche di quella base dati.
Applet sì, applet no
In effetti, le classi JDBC sono usate principalmente con le
applicazioni, ma possono essere impiegate anche in un applet.
In questo caso, tuttavia, risentono delle restrizioni tipiche
delle applet scaricate da un sistema remoto. Per esempio, un
applet che usa classi JDBC può aprire una connessione con una
base dati remota solo se questa si trova sul server dal quale
lapplet è stato scaricato. Inoltre, essa non può
utilizzare in alcun modo informazioni presenti sul client.
Persino il driver JDBC, qualora scaricato dal sistema remoto
insieme allapplet, può funzionare solo con connessioni con
lo stesso server dal quale è stato scaricato. Ciò significa che
il server dovrebbe fungere sia da server Web sia da server dati,
il che, spesso, è un po eccessivo in termini di carico.
Esistono vari modi di aggirare legalmente il problema, ma tutti
si basano su unopportuna riconfigurazione del server, cosa
non sempre così semplice da fare. Unalternativa potrebbe
essere quella di utilizzare le classi RMI per collegare
lapplet a un server intermedio il quale, utilizzando le
classi JDBC, interagisce direttamente con la base dati. Tuttavia,
si tratta di una soluzione che potrebbe creare problemi a livello
di prestazioni.
Ultimo Aggiornamento 23 Settembre 1998