MokaByte Numero 13 - Novembre 1997
Foto
Java e CGI 
II parte
 
di
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>
<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>
Così si presenta la nostra pagina 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 off
java CGITest << %1 >> %3
Il 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.
public class CGITest {

 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

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.
import java.io.*;
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
 

Nel browser, dopo aver compilato e spedito il modulo, si ottine il seguente risultato:









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 rivista web su Java

MokaByte ricerca nuovi collaboratori
Chi volesse mettersi in contatto con noi può farlo scrivendo a mokainfo@mokabyte.it