MokaByte
Numero 13 - Novembre 1997
|
|||
|
II parte |
||
Maurizio Boscaini |
Analisi del meccanismo dicomunicazione CGI e delle comunicazione tra client e server | ||
Introduzione
alla lezione
La volta scorsa
abbiamo visto come richiedere ad un programma Java, residente su un server
web, un'immagine.
Come avevo anticipato,
in questa puntata vediamo brevissimamente il metodo POST a livello teorico
e continuiamo l'analisi del metodo GET attraverso un esempio più
complesso, che prevede il passaggio di parametri.
NOTA
Ricordo che questo corso si basa sul server web OmniHTTPd per Windows 95
e che con altri server può essere necessario effettuare alcune modifiche
ai programmi proposti (ad esempio, una particolarità di OminHTTPd
è che non si comporta correttamente quando il programma richiamato
nell'interfaccia CGI, nel nostro caso il batch file, ha un nome lungo,
contiene la parola "cgi" in determinate posizioni oppure contiene un trattino
"-").
Il
metodo POST
Attraverso questo
metodo il programma client instaura una connessione diretta con il server
HTTP, quindi manda i dati dopo l'HTTP header. Queste informazioni sono
disponibili nello standard input del programma CGI.
Passaggio
di parametri ad un programma CGI scritto in Java, per creare una pagina
su misura
Costruiamo un'applicazione,
che riceve alcuni dati inseriti dall'utente in una FORM di una pagina HTML
e ritorna una pagina basata su questi dati.
Il procedimento
ricalca quello della volta scorsa; quindi, abbiamo bisogno dei seguenti
file:
Pagina HTML iniziale | test-par.html |
File batch | param.bat |
Classe principale Java per la ricezione dei dati e la risposta | CGITest.java |
Classe Java di supporto | Cgi.java |
Il file test-par.html contiene il link a cgi-test.bat e può essere posto in una qualunque directory per la nostra prova in locale (vedi puntata precedente), mentre deve essere posto in opportune directory per documenti nel caso di richiamo della pagina attraverso un server www. Il link è contenuto in una FORM HTML, poichè questo TAG (marcatore del linguaggio Hypertext Markup Language) ci permette di specificare dei parametri da passare al programma CGI e visualizzare pulsanti e campi di testo nel browser. Come si può notare dal listato, passiamo 4 parametri:
<HTML>Così si presenta la nostra pagina HTML:
<HEAD>
<TITLE>Esempio: cgi test</TITLE>
</HEAD>
<BODY TEXT="#FFFFFF" background="smgreen.gif" LINK="#FF0000" VLINK="#551A8B"
ALINK="#FF0000">
<B>Per ricevere un messaggio personalizzato inserire i dati nella form e premere il
pulsante SUBMIT</B><HR>
<FORM NAME="myform" METHOD="POST" ACTION="http://localhost/cgi-win/db-test.bat">
<INPUT TYPE=HIDDEN NAME="MESSAGGIO" VALUE="BENVENUTO">
<INPUT TYPE="TEXT" SIZE="20" NAME="USERNAME">
Inserisci qui il tuo nome e cognome <P>
<INPUT TYPE="TEXT" SIZE="20" NAME="USERMAIL" VALUE="login@host.domain">
Inserisci il tuo indirizzo di E-mail
<P>Categoria d'utenza <BR>
<INPUT TYPE="RADIO" NAME="CATEGORIA" VALUE="Studente"> Studente <BR>
<INPUT TYPE="RADIO" NAME="CATEGORIA" VALUE="Privato"> Privato <BR>
<INPUT TYPE="RADIO" NAME="CATEGORIA" VALUE="Professionista"> Professionista <BR>
<INPUT TYPE="RADIO" NAME="CATEGORIA" VALUE="Azienda"> Azienda<P>
<INPUT TYPE=SUBMIT VALUE="SUBMIT">
</FORM>
</BODY>
</HTML>
Il file param.bat deve essere posto nella directory CGI-WIN insieme ai file compilati .class. Anche in questo esempio il compito del batch file si riduce alla disabilitazione dell'echo sullo standard output e al richiamo dell'interprete Java per il nostro file .java. Ora, però, vogliamo passare anche dei valori al programma, quindi è necessario redirezionare il canale %1 sullo standard input del file .java.
@echo offIl listato di CGITest.java viene riportato di seguito. Possiamo notare che sfruttiamo la classe Cgi (riportata più sotto), al cui costruttore passiamo il canale standard di input e che ci permette di accedere ai parametri dell'interfaccia CGI, compresi quelli impostati da noi nella FORM. In particolare, per impostare lo sfondo della pagina di risposta uguale quello della pagina di chiamata ottengo attraverso il metodo getBaseReferer() l'URL proprio della pagina di partenza. Gli altri metodi mi permettono di semplificare la stesura e facilitare la comprensione del programma, risultando, in ogni caso, di facile comprensione.
java CGITest << %1 >> %3
public class CGITest {Ecco, infine, la classe di supporto Cgi.java. La classe estende java.util.Properties e carica i parametri dell'interfaccia, che sono scritti proprio nella forma NOME=VALORE tipica della classe Properties.private Cgi cgi; // rappresenta i parametri CGI
public CGITest() {
cgi = new Cgi(System.in);// HEADER
sendln("Content-type: text/html");
sendln("");// CONTENT
String str = new String("");
String sfondo = getBaseReferer() +"/smgreen.gif";
String messaggio= cgi.getProperty("MESSAGGIO");
String username= cgi.getProperty("USERNAME");
String usermail= cgi.getProperty("USERMAIL");
String categoria= cgi.getProperty("CATEGORIA");sendln("<HTML><BODY BACKGROUND=\""+ sfondo +"\"");
sendln(" TEXT=#FFFFFF LINK=#0000EE VLINK=#551A8B ALINK=#FF0000>");
sendln("<CENTER><B>"+ messaggio +"</B></CENTER><HR>");
sendln("Nome utente :"+ username +"<BR>");
sendln("E-Mail :"+ usermail +"<BR>");
sendln("Categoria :"+ categoria +"<BR>");
sendln("</BODY></HTML>");
} // end CGITest()
// Ritorna l'URL del documento che ha richiesto l'esecuzione del programma CGI
private String getBaseReferer() {
String referer = cgi.getProperty("Referer");
int lastSlashIndex = referer.lastIndexOf("/");
return referer.substring(0, lastSlashIndex);
} // end getBaseReferer()
private void send(String string) {
System.out.print(string);
} // end send()
private void sendln(String string) {
System.out.println(string);
} // end sendln()
public static void main(String args[]) {
new CGITest();
} // end main()} // end class CGITest
import java.io.*;Nel browser, dopo aver compilato e spedito il modulo, si ottine il seguente risultato:
import java.util.Properties;public class Cgi extends Properties {
String dati; // contenuto dell'informazione dell'interfaccia cgi
public Cgi(InputStream in) {
try {
load((InputStream)in);
} catch (IOException ioe) {
System.out.println("Errore di caricamento : " + ioe);
}
} // end Cgi()} // end class Cgi
Conclusioni
Le possibilità
di sviluppo di questo semplice esempio sono notevoli. L'unica nota particolarmente
negativa è costituita dal tempo di attesa molto lungo per ricevere
la pagina di risposta. Ora che siamo in grado di passare dei parametri
al programma CGI siamo in grado di costruire un'applicazione per l'interrogazione
di un database. Questo, infatti, sarà l'argomento della prossima
puntata.
|
||
|
||
MokaByte ricerca
nuovi collaboratori
|
||
|