|
ASP: la guida introduttiva
Capitolo 7 - un libro degli ospiti in ASP
7.0 Introduzione al
tutorial
7.1 Conservazione e
lettura dei messaggi
7.2 Form di invio
del messaggio
7.3 Inserimento di
un nuovo messaggio
7.0 - Introduzione al tutorial
E'
finalmente giunto il momento di mettere a frutto le conoscenze
acquisite nel corso dei capitoli precedenti, realizzando una
prima applicazione ASP di una certa entità. Lavorando con
JScript, oggetti built-in, oggetti ActiveX e accesso al File
System realizzeremo un semplice guestbook, in Italia meglio noto
come "libro degli ospiti". Si tratta sostanzialmente di una
pagina Web all'interno della quale un visitatore può inserire un
messaggio, in maniera abbinata ad alcune informazioni, quali il
proprio nome, l'indirizzo e mail e l'URL della propria Home
Page. Insomma, il classico servizio che molti siti amatoriali
ospitano per dare voce ai propri visitatori. Il codice e le
regole che esamineremo, comunque, avranno ancora una volta
valore generale, per cui con un po' di maestria sarà possibile
ottenere tantissime varianti sul tema, realizzando ad esempio
delle bacheche per scambio annunci e altri servizi basati
fondamentalmente sullo stesso meccanismo del guestbook.
Il
progetto sarà costituito da 4 files distinti in rapporto tra di
loro, lo schema sarà quello rappresentato qui di seguito:
I FILE DEL PROGETTO "LIBRO DEGLI OSPITI"
-
messaggi.txt - file di testo utilizzato per conservare
i messaggi degli utenti. Da questo file verranno letti i
messaggi da visualizzare, e in questo file sarà introdotto
ogni nuovo messaggio.
-
guestbook.asp - pagina ASP in grado di prelevare i
messaggi contenuti in messaggi.txt e
di formattarli in un opportuno output HTML da inviare al
browser del visitatore.
-
nuovo_messaggio.htm - pagina di semplice HTML
contenente un form da utilizzare per l'invio di un nuovo
messaggio alla pagina
inserisci_messaggio.asp, con metodo POST
-
inserisci_messaggio.asp - pagina ASP che raccoglie i
dati inviati dall'utente, li controlla, li formatta e li
inserisce in cima a messaggi.txt.
E'
bene stabilire ora la struttura di un singolo messaggio,
analizzando quali campi possano di fatto costituirlo.
Selezioneremo ora alcuni campi esemplificativi, alcuni dei quali
dovranno essere inseriti obbligatoriamente, mentre altri
potranno essere anche tralasciati. Ecco uno schema relativo alla
struttura di un singolo messaggio:
NOME IDENTIFICATIVO
(campo obbligatorio)
E MAIL (campo facoltativo)
HOMEPAGE URL (campo
facoltativo)
CORPO DEL MESSAGGIO (campo
obbligatorio)
Nei
paragrafi successivi vedremo come trasformare questa
concettualizzazione del problema in una forma appetibile per un
computer, attraverso appunto la tecnologia ASP.
7.1 - Conservazione e lettura dei messaggi
Il
fulcro dell'intero progetto è rappresentato da
messaggi.txt, il semplice file di
testo che utilizzeremo come supporto e come contenitore dei
messaggi inseriti dagli utenti. Vediamo allora come organizzare,
o per meglio dire formattare, questo file affinché possa
ospitare una rappresentazione del messaggio teorizzato nel
paragrafo precedente. La cosa più ovvia che ci viene in mente è
quella di inserire ogni campo su righe distinte, ed è una
soluzione piuttosto accettabile per questo nostro primo e
semplice tutorial. Potrebbe poi darsi che in certe occasioni ci
venga utile agire manualmente sul file di testo, quindi per pura
chiarezza in fase di lettura da parte dell'uomo divideremo ogni
messaggio con un invio, ossia con una riga bianca. Ecco un
esempio di un file di testo in grado di soddisfare le regole
appena annunciate:
--- INIZIO ---
Sauron
sauron@sauronsoftware.it
http://www.sauronsoftware.it
Ciao a tutti i lettori!
Tizio
Io non ho messo e mail e url... tanto sono facoltativi!
--- FINE ---
Questo piccolo esempio presenta un file di testo contenente due
messaggi. Le scritte INIZIO e
FINE sono da considerarsi escluse e
sono state utilizzate solo per mettere in risalto come, anche
alla fine del secondo ed ultimo messaggio, sia stata introdotta
comunque una riga bianca.
Una volta in possesso di questi dati realizzare la pagina
guestbook.asp rimane abbastanza
semplice. Si realizzi per prima cosa il file
messaggi.txt inserendo al suo interno i due messaggi di
poche righe sopra, in modo da predisporlo a divenire "cavia"
della pagina ASP che stiamo per andare a creare. Ecco cosa
dovremo dire al server tramite la pagina guestbook.asp:
-
tramite l'oggetto ActiveX denominato
Scripting.FileSystemObject apri uno stream verso messaggi.txt
-
se
non sei alla fine dello stream (raggiungimento dell'ultima
riga del file di testo) procedi al passo 3, altrimenti chiudi
lo stream e concludi
-
leggi una riga, questo è il nome di un messaggio, stampalo
nell'output
-
leggi una riga, questa è l'e mail. Il campo è facoltativo. In
caso dovesse essere vuoto non fare nulla, altrimenti stampa
l'indirizzo e mail nell'output HTML generando un collegamento
ipertestuale di tipo mailto: ad esso
-
leggi una riga, questo è l'url per la home page. Il campo è
facoltativo. In caso dovesse essere vuoto non fare nulla,
altrimenti stampa l'indirizzo nell'output HTML generando un
collegamento ipertestuale
-
leggi una riga, questo è il messaggio, stampalo nell'output
-
salta una riga nello stream
-
torna al passo 2 e reitera il ciclo a partire da lì
Questi 8 passi descrivono alla perfezione l'algoritmo che
abbiamo intenzione di utilizzare. Nella concettualizzazione di
esso, ovviamente, si è esclusa ogni forma di ritocco grafico e
ci si è concentrati solo sul meccanismo principale. Questa è una
maniera molto efficiente di procedere, le aggiunte grafiche
possono poi essere fatte indipendentemente in un secondo
momento. Ecco come viene ora formulata la pagina
guestbook.asp:
<%@ LANGUAGE = JScript %>
<%
// Apertura dello stream verso il file di testo
var fso = new ActiveXObject("Scripting.FileSystemObject");
var stream = fso.OpenTextFile(Server.MapPath("messaggi.txt"));
%>
<html>
<head><title>Libro degli ospiti</title></head>
<body>
<h1>Libro degli ospiti</h1>
<h4><a href="nuovo_messaggio.htm">Firmalo anche tu!</a></h4>
<%
while (!stream.AtEndOfStream) {
Response.Write("<hr>");
aux = stream.ReadLine();
Response.Write("<b>Nome:</b> " + aux + "<br>");
aux = stream.ReadLine();
if (aux!="") Response.Write("<b>E mail:</b> <a href='mailto:" + aux + "'>" + aux + "</a><br>");
aux = stream.ReadLine();
if (aux!="") Response.Write("<b>Home Page:</b> <a href='" + aux + "'>" + aux + "</a><br>");
aux = stream.ReadLine();
Response.Write("<b>Messaggio:</b><br>" + aux + "<br>");
stream.SkipLine();
}
stream.Close();
%>
<hr>
<p><font size="2">Powered by "ASP: la guida introduttiva"</font></p>
</body>
</html>
Con
questo codice già è possibile sperimentare la prima parte del
libro degli ospiti. Qualora dovesse insorgere un errore il
consiglio è di controllare attentamente ciò che è stato inserito
in messaggi.txt, in particolare la presenza della sola ed unica
riga vuota finale.
Svuotando completamente messaggi.txt potrete ottenere un
guestbook totalmente "vergine".
7.2 - Form di invio del messaggio
La
seconda parte del progetto è costituita da quei due file che
permettono l'inserimento di un nuovo messaggio nell'archivio. Si
parte dalla pagina HTML nuovo_messaggio.htm,
contenente il form da compilare ed inviare per portare a
compimento l'operazione. Non ci si soffermerà più di tanto su di
esso, data la banalità della cosa:
<html>
<head><title>Firma il libro degli ospiti</title></head>
<body>
<h1>Libro degli ospiti</h1>
Introduci il tuo messaggio ed invia il modulo
<hr>
<form action="inserisci_messaggio.asp" method="post">
<b>Nome: (*)</b><br>
<input type="text" name="nome"><br>
<b>E mail:</b><br>
<input type="text" name="email"><br>
<b>Home Page:</b><br>
<input type="text" name="homepage" value="http://"><br>
<b>Messaggio: (*)</b><br>
<textarea rows="5" cols="30" name="messaggio"></textarea>
<br>
<input type="submit" value="Invia">
<input type="reset" value="Cancella">
</form>
<hr>
I campi contrassegnati da (*) sono <b>obbligatori</b>
</body>
</html>
Come
è possibile vedere i dati sono inviati con metodo POST alla
pagina inserisci_messaggio.asp,
oggetto di studio del sucessivo paragrafo.
7.3 - Inserimento di un nuovo messaggio
Si è
finalmente giunti alla parte conclusiva, ma anche più laboriosa,
del progetto. Il file inserisci_messaggio.asp
dovrà agire in base ai seguenti passi:
-
recupera i dati inviati tramite il form
-
controlla questi dati, in caso di problemi interrompi la
procedura e dai notifica dell'accaduto
-
esamina i dati, correggili e ottimizzali per la loro
archiviazione
-
apri uno stream in lettura verso messaggi.txt
-
leggi e conserva l'intero contenuto di messaggi.txt
-
chiudi lo stream in lettura
-
crea un nuovo messaggi.txt vuoto sovrascrivendo quello
precedente e instaura uno stream in scrittura con esso
-
inserisci in esso il nuovo messaggio
-
inserisci in esso la lista dei messaggi precedenti
-
chiudi lo stream in scrittura
Questo algoritmo illustra quindi le operazioni necessarie. I
singoli passi sono stati raggruppati in tre diverse classi, in
modo da rendere ancora più chiare le tre operazioni base:
leggere e validare il form, prelevare il contenuto del file di
testo, generare una nuova lista di messaggi contenente in cima
ad essa quanto appena inviato dall'utente. Questa doppia
operazione di lettura/scrittura di messaggi.txt è dettata
dall'esigenza di inserire in testa alla lista il nuovo
messaggio, in modo da tale che accedendo a guestbook.asp questo
risulti il primo ad essere letto. Qualora si fosse invece optato
per un inserimento in coda alla lista sarebbe allora bastato
accedere a messaggi.txt una sola volta, in modalità
ForAppending. Il messaggio, in questo
caso, verrebbe però visualizzato come l'ultimo della lista.
Il codice del documento può essere ora presentato:
<%@ LANGUAGE = JScript %>
<%
function togliInvio(str) {
var cars;
var str2 = "";
for (c=0;c<str.length;c++) {
cars = str.charCodeAt(c);
if (cars!=13 && cars!=10) {
str2 += str.charAt(c);
} else {
if (cars==13) str2 += " ";
}
}
return str2;
}
// Ricezione del form
var nome = String(Request.Form("nome"));
if (nome=="undefined") nome = "";
var email = String(Request.Form("email"));
if (email=="undefined") email = "";
var homepage = String(Request.Form("homepage"));
if (homepage=="undefined" || homepage=="http://") homepage = "";
var messaggio = String(Request.Form("messaggio"));
if (messaggio=="undefined") messaggio = "";
// Controllo campi obbligatori
if (nome=="" || messaggio=="") {
Response.Write("Non hai compilato tutti i campi obbligatori! Torna indietro e correggi.");
Response.End;
}
// Elimina eventuali "invii" dai vari campi
// Evita così che un campo possa andare su più di una riga
nome = togliInvio(nome);
email = togliInvio(email);
homepage = togliInvio(homepage);
messaggio = togliInvio(messaggio);
var fso = new ActiveXObject("Scripting.FileSystemObject");
// Legge i messaggi vecchi
var in_stream = fso.OpenTextFile(Server.MapPath("messaggi.txt"));
var vecchi = in_stream.ReadAll();
in_stream.Close();
// Crea il nuovo file
var out_stream = fso.CreateTextFile(Server.MapPath("messaggi.txt"));
out_stream.WriteLine(nome);
out_stream.WriteLine(email);
out_stream.WriteLine(homepage);
out_stream.WriteLine(messaggio);
out_stream.WriteLine();
out_stream.Write(vecchi);
out_stream.Close();
Response.Redirect("guestbook.asp");
%>
La
particolare funzione togliInvio
fornita nel codice si occupa di eliminare ogni eventuale andata
a capo presente nei vari campi. Un invio, infatti, verrebbe
riportato come tale all'interno dello stesso file di testo e
perciò il nostro modello di messaggio non verrebbe più
rispettato. Davanti alle "conquiste" fatte nel corso dei
capitoli precedenti la comprensione del codice dovrebbe
risultare piuttosto agevole. In ogni caso i blocchi di codice
sono commentati e divisi tra di loro seguendo la stessa logica
utilizzata per raggruppare i diversi passi dell'algoritmo
utilizzato.
Si lascia ora al lettore la facoltà di migliorare e di
arricchire il progetto secondo la propria fantasia. Ecco alcune
possibili tracce di lavoro sulle quali esercitarsi:
-
disabilitare la possibilità da parte dell'utente di inserire
codice HTML nei messaggi
-
creare una console di amministrazione del guestbook,
attraverso la quale sia possibile cancellare messaggi
indesiderati
-
limitare il numero di messaggi presenti nel file di testo ad
un numero finito, ad esempio facendo in modo che
all'inserimento del ventunesimo messaggio venga
automaticamente eliminato il primo
Buon
lavoro! |