Tecnologie Web: Parte 6a [Giovedì, 27 Aprile 2006]

Home /  Teaching


RIPASSO: Una programma Java che crea una pagina HTML

I file HTML dinamici non sono altro che pagine HTML generate sul server nel momento in cui il client le richiede. Vediamo un semplice programma Java che scrive sullo standard output (la "console") un file HTML. Il file generato è il seguente: Potenze.htm

import java.io.*;

public class Potenze {
   /**
    * Questo esempio crea sullo standard output una pagina HTML contenente
    * la tabella delle potenze dallo 0 al 10 di un dato numero fornito 
    * dall'utente. 
    *
    * @author Roberto Sassi
    * @version 1.0
    */
  public static void main(String[] args) throws IOException {
    
    // chiediamo all'utente il numero 
    InputStreamReader flussoTesto = new InputStreamReader(System.in);
    BufferedReader bufferTastiera = new BufferedReader(flussoTesto);
    String lineaLetta;

    System.out.print("Che numero devo utilizzare? ");
    lineaLetta = bufferTastiera.readLine();
    double numeroRichiesto = Double.parseDouble(lineaLetta);
    
    String mioTitolo = "Una tabella scritta da un programma Java!";
    // scriviamo l'output

	  // scriviamo l'header e l'inizio del body
    System.out.print("<html>\n<head>\n<title>" + mioTitolo + "</title>\n</head>\n");
    System.out.print("<body bgcolor=\"#ffffff\">\n");

  	// scriviamo la tabella
	  System.out.print("<b>Potenze del numero " + numeroRichiesto + " (da 0 a 10)</b><br /><br />\n");
	  System.out.print("<table border=\"3\" cellpadding=\"10\">\n");

  	System.out.print("<tr>\n" + 
      "<td></td>\n" +
      "<th>" + numeroRichiesto + "</th>\n" + 
      "</tr>\n");

    for(int i=0; i<=10; i++) {
      if(i%2==0) {
        System.out.print("<tr>\n" + 
            "<th>" + i + "</th>\n" +
            "<td bgcolor=\"FFFF00\">" + Math.pow(numeroRichiesto,i) + "</td>\n" +
            "</tr>\n");
      }
      else {
        System.out.print("<tr>\n" + 
            "<th>" + i + "</th>\n" +
            "<td bgcolor=\"0099AA\">" + Math.pow(numeroRichiesto,i) + "</td>\n" +
            "</tr>\n");
      }
    }
	
    // Chiudo la tabella
	  System.out.print("</table>\n");

  	// scriviamo la parte conclusiva della pagina
	  System.out.print("</body>\n</html>");
        
  }
}


RIPASSO: Una semplice CGI in C

Abbiamo visto che il primo modo di creare pagine Web dinamiche era attraverso semplici programmi CGI. Ma come è fatto un programma CGI? Vediamolo brevemente.

Quello che segue è il listato in C di un semplice CGI, multiplica, che dinamicamente genera una pagina HTML con il prodotto di due numeri. Per semplicità, il codice non esegue nessun controllo sugli input, ma in una situazione reale andrebbe assolutamente fatto!

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  char *stringaQuery;
  long primoNumero, secondoNumero;
  
  printf("Content-Type:text/html\n\n");
  printf("<HTML>\n<HEAD>\n");
  printf("<TITLE>CGI per la Multiplicazione di interi</TITLE>\n");
  printf("</HEAD>\n<BODY>\n");
  printf("<H3>Risultato della moltiplicazione</H3>\n");
  stringaQuery = getenv("QUERY_STRING");
  if( (stringaQuery == NULL) || 
      (sscanf(stringaQuery,"primoNumero=%ld&secondoNumero=%ld",&primoNumero,&secondoNumero)!=2) )
    printf("<P>Errore! Invalido numero o tipo di parametri forniti allo script.</P>\n");
  else
    printf("<P>Il prodotto di %ld e %ld corrisponde a %ld.</P>\n", 
      primoNumero, secondoNumero, primoNumero*secondoNumero);
  printf("</BODY>\n</HTML>");
  return 0;
}

Il codice va compilato come sempre (as esempio, gcc -o moltiplica moltiplica.c) e messo nella cartella cgi-bin del server WEB che si utilizza (tipicamente va abilitata nel file di configurazione del server WEB). Il form attraverso cui inviamo i dati da elaborare alla CGI potrebbe essere (moltiplica.htm):

<html>
<head>
<title>Form per la Multiplicazione di interi</title>
</head>
<body>
<form method="get" action="/cgi-bin/moltiplica">
Inserisci i due numeri interi da moltiplicare
<br><br>
<label>Primo Numero:</label>
<input type="text" name="primoNumero">
<br><br>
<label>Secondo Numero:</label>
<input type="text" name="secondoNumero">
<br><br>
<input type="submit" value="Moltiplica!">
</form>
</body>
</html>

Il client, quando l'utente ha inserito i dati necessari, invia la richiesta al server

GET /cgibin/moltiplica.cgi?primoNumero=7&secondoNumero=3 HTTP/1.1
Host: www.dti.unimi.it

Il server, riconosce dalla cartella in cui è contenuto il file ("cgi-bin") e/o dall'estensione (".cgi") che il file è una CGI (va eseguito). Per prima cosa copia nella variabile di ambiente QUERY_STRING la stringa dei parametri (in questo caso primoNumero=7&secondoNumero=3); quindi fa partire il processo CGI e infine preleva dallo standard output quanto la CGI vi ha scritto e lo invia al client.

HTTP/1.x 200 OK
Content-Type: text/html; charset=iso-8859-1

<html>
...


Nuovi elementi di Java: Interfacce

In Java, l'elemento centrale del linguaggio è il concetto di Classe. Ma talvolta il livello di astrazione che si vuole realizzare è superiore. Ad esempio, si pensi di voler realizzare un metodo che sia in grado di trovare il maggiore di un insieme di oggetti. Gli oggetti su cui si vorrebbe applicare il metodo sono molto diversi tra di loro ma certamente in comune hanno almeno il fatto che è possibile in qualche modo "misurarli" (ad esempio potremmo voler trovare l'oggetto "automobile" che abbia il bagagliaio più capiente, o l'oggetto "albero" con il fusto più alto, etc...). Dovremmo scrivere un metodo "cercaMassimo" diverso per ciascuna classe!

Java fortunatamente fornisce un'ulteriore strumento per fronteggiare queste situazioni: le interfacce.

Una interfaccia è l'elenco di un insieme di funzionalità che richiediamo ad una classe sotto forma di metodi. Ecco, ad esempio, la definizione di una interfaccia per il tipo Misurabile.

public interface Misurabile {
double getMisura();
}

La dichiarazione di interfaccia elenca tutti i metodi richiesti dall'interfaccia; questa interfaccia richiede un solo metodo, ma, in generale, un'interfaccia ne può richiedere più d'uno.

Un'interfaccia è simile a una classe, ma ci sono alcune differenze importanti:

Una volta definita una interfaccia, possiamo costruire una classe con un metodo che ordini oggetti di tipo "Misurabile". Oggetti di questo tipo non esistono, ma il metodo potrà essere utilizzato indifferentemente su tutti gli oggetti di classi che implementino l'interfaccia.

Cosa significa implementare una interfaccia? Vuol dire che la nuova classe che costruiamo (la classe "Albero", ad esempio) dovrà fornire una implementazione di tutti i metodi specificati dall'interfaccia e dovrà avvisare il compilatore dichiarandolo:

class Albero implements Misurabile {
private double altezza;
private double diametroBase;

...

public double getMisura() {
  return this.altezza;
}

Vedere: "Concetti di informatica e fondamenti di Java", C. S. Horstmann, Apogeo (2005), da capitolo 10.1 a 10.3.



Nuovi elementi di Java: Package

Quando il numero di classi in un progetto cresce, la semplice suddivisione in files diventa sempre più complessa da maneggiare. Java prevede un meccanismo per venire incontro al programmatore, è il meccanismo dei pacchetti.

Per dire al compilatore che il contenuto di un certo file appartiene ad un certo pacchetto lo si specifica nella prima riga del file con il comando

package nomeDelPacchetto;

Il nome del pacchetto deve essere univoco. Un nome possibile è ad esempio com.jspbook (che viene utilizzato dal libro di testo techWEB).

Le classi devono essere organizzate in una struttura di cartelle gerarchica. Quindi se si sceglie com.jspbook come nome del pacchetto, dovremo mettere i file delle classi nella cartella <cartellaRadice>/com/jspbook

Per compilare il file, basterà specificare opportunamente il percorso di ricerca delle classi CLASSPATH

javac -classpath <cartellaRadice> nomeProgrammaJava.java

Il meccanismo dei pacchetti offre molto di più di quanto visto in queste poche righe!



Strumenti di sviluppo

Il corso si baserà sull'utilizzo del container Servlet/JSP Tomcat (versione 5.5) che potete trovare all'indirizzo: http://tomcat.apache.org/

L'installazione è semplicissima; è probabilmente consigliato installarlo sulla porta 80 e non 8080. Eventualmente, potete trovare alcune indicazioni sull'installazione all'indirizzo: http://www.coreservlets.com/Apache-Tomcat-Tutorial/

Un buon ambiente di sviluppo per Servlet/JSP è Eclipse integrato dal "Eclipse Web Tools Platform (WTP) project" che potete scaricare dal sito: http://www.eclipse.org/webtools/.

Il libro di testo è corredato da un file WAR che contiene tutto il codice. È utile per cominciare a programmare Servlet e JSP pages. Lo potete trovare sul sito del libro all'indirizzo: http://www.jspbook.com/jspbook.war.

Fare il deployment è relativamente semplice. Una volta installato Tomat, andate alla pagina 127.0.0.1 e selezionate "Tomcat Manager". Nella pagina che si apre dopo aver inserito le credenziali è possibile caricare direttamente il file WAR: ("WAR file to deploy").