|
ASP: la guida introduttiva
Capitolo 3 - l'oggetto built-in Response
3.0 Scopo
ed utilizzo dell'oggetto Response
3.1 Il
metodo Response.Write
3.2 Il
metodo Response.End
3.3 Il
metodo Response.Redirect
3.4 La
proprietà Buffer e gli output bufferizzati
3.5 Le
proprietà Status e ContentType
3.0 - Scopo ed utilizzo dell'oggetto Response
Tra
la famiglia degli oggetti built-in di ASP (cfr. capitolo
precedente) Response, come il nome lascia ad intendere, è
l'oggetto dedicato alla formattazione e all'invio di un qualche
output al client. La sintassi necessaria per utilizzare
l'oggetto Response è quella classica degli oggetti di JavaScript,
dove il nome dell'oggetto è separato dal nome della proprietà o
del metodo che sta venendo invocato con un singolo punto.
Response.nomeProprietà
Response.nomeMetodo(parametro1,parametro2,...)
Response.nomeCollezione("chiave")
Ecco
schematicamente cosa fornisce l'oggetto Response:
|
Proprietà |
|
|
|
|
Buffer |
Booleano, specifica se il buffer è attivo o meno |
|
CacheControl |
Si utilizza per indicare ai proxy di aggiungere o meno
l'output della pagina alla propria cache |
|
CharSet |
Aggiunge all'header della pagina la specifica di un
particolare charset indicato |
|
ContentType |
Specifica il content type da inviare secondo le norme del
protocollo HTTP al client |
|
Expires |
Indica la durata della pagina all'interno della cache del
browser |
|
ExpiresAbsolute |
Indica la data di scadenza della pagina archiviata nella
cache del browser |
|
Status |
Specifica la linea di stato restituita al client dal server |
|
|
|
|
Metodi |
|
|
|
|
AddHeader |
Aggiunge un header specifico alla pagina, di cui è possibile
settare nome e valore |
|
AppendToLog |
Aggiunge una riga al Log del server |
|
BinaryWrite |
Invia all'output il parametro passato senza applicare
conversioni di charset |
|
Clear |
Ripulisce l'output, ma solo se bufferizzato |
|
End |
Interrompe l'interpretazione della pagina, e restituisce
l'output bufferizzato |
|
Flush |
Invia all'istante l'ouput bufferizzato |
|
IsClientConnected |
Verifica durante l'esecuzione della pagina se il client è
ancora connesso |
|
Pics |
Aggiunge un valore al PICS label dell'header |
|
Redirect |
Invia un messaggio di redirect al browser, spostandolo su un
differente URL |
|
Write |
Scrive sull'output della pagina |
|
|
|
|
Collezioni |
|
|
|
|
Cookies |
Setta e recupera i valori relativi ai cookie |
|
|
|
Non
è intenzione di questa guida prendere in analisi sin da ora
tutte le proprietà ed i metodi sopra indicati. Molti di essi
saranno trattati separatamente nei capitoli seguenti, come ad
esempio la collezione Cookies. Per il momento ci si accontenterà
di prendere in analisi solo le proprietà e i metodi di uso più
ricorrente.
3.1 - Il metodo Response.Write
Nei
due capitoli precedenti già si è accennato all'utilizzo di
questo metodo, utile per inviare un output di testo al client.
La giusta sintassi di utilizzo è la seguente:
<% Response.Write(stringa); %>
Che
comunque rimane del tutto equivalente alla più semplice da "embeddare"
tra i codici HTML:
<%=stringa%>
Il
parametro stringa, come indica il nome stesso, può essere
una stringa o comunque un tipo di dato che abbia
rappresentazione in stringa. Con JScript è possibile concatenare
più stringhe con l'operatore + direttamente all'interno di Write:
nome = "Pippo";
Response.Write("Ciao " + nome + ", io sono un output!");
3.2 - Il metodo Response.End
Il
metodo End conclude l'esecuzione della pagina e invia al client
gli output non ancora inviati. Tutto quello che segue
consequenzialmente una chiamata a Response.End non verrà preso
in considerazione, sia esso codice di scripting o semplice
output di altro tipo. Si provi il seguente esempio:
<%@ LANGUAGE = JScript %>
<%
Response.Write("IO VENGO SCRITTO");
Response.End;
Response.Write("IO NON VENGO SCRITTO");
%>
NEMMENO IO VERRO' SCRITTO!
3.3 - Il metodo Response.Redirect
Questo metodo segnala al browser del client di spostarsi su un
altro URL. Tutto quello che seguirà consequenzialmente una
chiamata a Redirect non verrà né interpretato dal server, né
comunque ascoltato dal client che sarà passato a fare richiesta
ad un altro URL. I percorsi indicati possono essere relativi o
assoluti. La sintassi è semplice. l'URL deve essere espresso
come una classica stringa. Si prenda a modello il seguente
esempio:
Response.Redirect("pagina2.htm");
3.4 - La proprietà Buffer e gli output bufferizzati
La
proprietà Buffer di Response gestisce una cosa assai
importante nell'utilizzo di una tecnologia server-side come ASP.
La proprietà, accesibile sia in lettura che in scrittura,
rappresenta un valore Booleano (true o false) che
sta ad indicare se l'output dovrà essere bufferizzato o meno. Di
default questa proprietà è settata a false. Questo
significa che normalmente gli output non saranno bufferizzati, e
perciò verranno inviati al client man mano che saranno generati.
Impostandola invece su true si attiverà la
bufferizzazione dell'output. In questa maniera ogni dato inviato
all'output (ad esempio tramite Reponse.Write) non sarà girato al
client il più presto possibile, ma sarà conservato in un buffer
temporaneo, per essere poi spedito al termine dell'esecuzione
oppure su comando esplicito del codice (con il metodo Flush).
Questo ha vantaggi e svantaggi. Un output non bufferizzato dà
l'impressione di essere molto più veloce, specie relativamente a
lunghe pagine HTML, e difatti l'utilizzo di output non
bufferizzati è la prassi per la generazione dinamica di pagine
in HTML. Attivare la bufferizzazione permette però di poter
gestire assai più elegantemente il possibile output,
intervenendo più volte su di esso. Di default l'output è spedito
non appena generato, per questo non è più possibile intervenire
su di esso. Se il codice ha postato la stringa "Ciao" al client
non potrà più tornare sui propri passi cancellando quanto fatto:
quando il codice tenterà di farlo probabilmente l'utente starà
già visualizzando il messaggio sul proprio monitor. Con il
buffer attivato, invece, un comando di scrittura su output non
implica automaticamente l'invio del medesimo al client. Sarà
dunque possibile intervenire a più riprese su header e corpo
dell'output, con alcuni metodi speciali che hanno significato
sono in questo ambito:
-
Response.Clear - ripulisce
l'output accumulato nel buffer
-
Response.Flush - invia
all'istante i dati accumulati nel buffer al client, senza
attendere la fine dell'esecuzione
Alcuni metodi di uso comune in presenza di un output
bufferizzato si comportano in maniera leggermente diversa
dall'usuale:
-
Response.End - oltre ad
interrompere l'esecuzione in questo caso invia al client
l'output cumulato nel buffer
-
Response.Redirect - può
essere utilizzato anche dopo aver già scritto tutti gli header
nell'output. In questo caso ripulirà il buffer e inserirà il
comando di redirect al posto dei dati cumulati
3.5 - Le proprietà Status e ContentType
Status e ContentType sono altre due proprietà che vanno ad
influenzare l'header della risposta inviata dal server al client.
Per quanto possibile si è cercato di non addentrarsi nei meandri
del protocollo HTTP, la cui conoscenza faciliterebbe la
comprensione del capitolo, tuttavia ora diviene necessaria una
piccola immersione nelle sue specifiche. Non se ne risentano i
lettori più attenti, si sta cercando solamente di essere
semplici e facilmente comprensibili.
Il protocollo HTTP altro non è che un insieme di regole che
descrive come debba avvenire un dialogo tra un client ed un
server. L'esempio più sfruttato da e guide che tentano
di illustrare le funzionalità di tale protocollo è quello della
telefonata, e qui non si vuole venir meno a questa consolidata
tradizione. Quando si telefona ad un amico o ad un conoscente si
ricorre involontariamente all'uso di un certo "protocollo", o
meglio, all'uso di un insieme di regole. Ad esempio chi risponde
dice sempre "pronto" per segnalare la sua presenza e la sua
disponibilità dall'altra parte del cavo, e immediatamente chi ha
effettuato la chiamata risponderà salutando e dichiarando la
propria identità. Solo dopo queste operazioni preliminari si
passerà al colloquio, ossia al vero scopo della telefonata. Il
protocollo descritto per la "telefonata tipo" non è comunque
rigido, le cose tra uomini potrebbero svolgersi assai
differentemente e probabilmente ci si continuerebbe a capire lo
stesso. Sui computer, naturalmente, non esiste flessibilità, per
cui tutti i server e tutti i client devono rispondere secondo le
regole del protocollo HTTP, che definisce appunto il
funzionamento di una "chiamata". Se un client o un server
dovessero "rispondere male" la controparte in rete
riaggancierebbe subito la linea. Così come per la telefonata tra
persone, dove il colloquio vero e proprio viene fatto precedere
da un header introduttivo, il protocollo HTTP prevede uno
scambio di informazioni iniziali tra il client ed il server. Con
le pagine ASP ci si sta occupando della gestione del server,
quindi si dovrà fare la parte di colui che risponde. Il client
solitamente si collega ad un server mediante protocollo HTTP
indicando un URL di suo interesse. Il compito sel server è
quello di recuperare, se esiste, il file puntato dall'URL e di
spedirlo al client, facendolo però precedere da una serie di
informazioni inerenti l'esito della richiesta e la natura del
file. Status e ContentType controllano proprio questi ultimi due
aspetti citati.
Status inserisce nell'header una riga che specifica
l'esito della richiesta. Nel protocollo HTTP questo viene
identificato da una serie di tre numeri. Ad esempio 200
significa "ok, ho trovato il file, adesso arriva", mentre 404
significa "mi dispiace, il file specificato dall'URL che mi hai
passato non esiste". Con Status è possibile alterare questa
parte dell'header:
Response.Status = "401 Unauthorized";
Questa riga dice al client che non si ha l'autorizzazione per
ricevere il file richiesto. In questa sede non saranno trattati
tutti i possibili status di un header, per chi fosse interessato
all'argomento si consiglia di cercare in rete le specifiche del
protocollo HTTP.
ContentType definisce la natura del file che si sta per
inviare al client. I browser non sono soliti riconoscere i file
in base asll'estensione che porta il loro nome, quanto piuttosto
rispetto alla descrizione fornita dal server su di essi.
ContentType permette di controllare questa descrizione. Con ASP,
infatti, non si realizzano solo ed esclusivamente semplici
output HTML, ma con l'ausilio di giusti ActiveX esterni è
possibilissimo mandare in output ad esempio delle immagini
(tipico caso dei contatori ad immagini), dei suoni o comunque
altri tipi di output differenti dal classico "text/html" di
default. Si provi ad eseguire la seguente pagina ASP:
<%@ LANGUAGE = JScript %>
<% Response.ContetType = "text/plain"; %>
<html>
<head>
<title>E' una pagina HTML?</title>
</head>
<body>
Cosa vedi?
</body>
</html>
Come
è possibile vedere l'HTML compreso nell'output invece di venire
interpretato dal browser verrà stampato all'interno della
finestra! Questo perchè abbiamo fatto dire al client dal server
che la pagina che seguiva era "text/plain", ossia semplice
testo, e il browser il semplice testo lo prende e lo stampa
senza svolgere ulteriori compiti. Utilizzando Microsoft Internet
Explorer non sempre avviene ciò, questo perchè la Microsoft ha
scelto di far parlare al suo browser un linguaggio diverso dal
resto di Internet, ma non scendiamo in inutili polemiche.
Se si voleva lanciare come output un JavaScript era possibile
farlo utilizzando la dicitura "application/x-javascript". Sono
davvero tanti i possibili MIME TYPE (così vengono
chiamate queste stringhe che indicano la tipologia del file) che
un browser può riconoscere o che ASP, con le necessarie
estensioni, può generare. Qui ne citiamo solo alcuni che
potranno tornare utili nelle applicazioni più comuni:
|
Testuali |
|
|
|
|
text/html |
Settato di default, è il comune MIME TYPE di una pagian HTML |
|
text/plain |
File di testo semplice |
|
text/rtf |
File in formato Rich Text Format |
|
text/xml |
File in formato XML |
|
|
|
|
Immagini |
|
|
|
|
image/gif |
Immagine GIF |
|
image/jpeg |
Immagine JPEG |
|
image/png |
Immagine PNG |
|
|
|
|
Audio |
|
|
|
|
audio/midi |
File MIDI |
|
audio/x-wav |
File audio in formato WAVE |
|
audio/x-realaudio |
File audio in formato RealAudio |
|
|
|
|
Altro |
|
|
|
|
application/x-javascript |
File JavaScript |
|
application/zip |
File WinZip |
|
|
|
|