Corso di ASP
Prima parte
--------------------------------------------------------------------------------
Superare i limiti dell'html per creare dei siti
sempre più rispondenti alle esigenze dei visitatori è stato una delle mete a
cui i programmatori di linguaggi di scripting hanno puntato nel corso della
storia del web. Dalle prime pagine statiche, manifesto di un sito, si è
progressivamente arrivati non solo all'esplosione del multimediale, ma,
soprattutto, al diffondersi di pagine interattive, in grado non solo di
affascinare, ma di fornire un utile strumento a chi le volesse usare.
Di linguaggi scripting ne esistono parecchi, alcuni
più simili a veri e propri linguaggi di programmazione, altri più facili. Il
perl, ad esempio, è il tipico caso di linguaggio complesso, ma molto efficace,
utilizzato per la creazione di cgi (common gateway interface) a livello
professionale e poco diffuso fra gli utenti medi, a causa della difficoltà di
apprendimento e di gestione della sua sintassi; inoltre, essendo nato in
ambiente Unix ha trovato non poche difficoltà ad affermarsi al di fuori din una
pur vasta cerchia di provider e professionisti del settore che utilizzano
questo sistema operativo. Un'altra difficoltà notevole per l'utente medio è da
sempre rappresentata dalla generale impossibilità di eseguire i cgi al di fuori
della directory cgi-bin del web server del quale ci si serve, directory il cui
accesso è limitato al web master. Solo in rari casi l'amministratore di sistema
consente l'esecuzione di script perl (che hanno la possibilita' di eseguire
operaziooni di lettura e scrittura su disco) da una qualsiasi directory. Se ciò
ha una giustificazione a livello di sicurezza di un sito web, certo non ha
invogliato gli utenti ad utilizzare questo linguaggio che richiede una
"interazione" con provider e amministratori a volte troppo
indaffarati per dare ascolto alle insolite richieste di un cliente.
Superare la staticità delle pagine web, mantenendo
al contempo una semplicità di programmazione che consenta a tutti di
intervenire senza prima dovere leggere voluminosi manuali è ora possibile
grazie ai nuovi linguaggi di scripting. Fra tutti si distingue sicuramente
l'asp (active server pages) per la rapidità e flessibilità di utilizzo che lo
caratterizzano, che però sono controbilanciate da uno svantaggio non
indifferente; l'utilizzo di questo linguaggio è confinato ai server Microsoft,
come ad esempio a IIS, e non funziona quindi con tutti gli altri server che
popolano il web. La sempre maggiore diffusione dei server Windows contribuisce
però a rendere meno limitante questo ostacolo e, tutto sommato, non è difficile
vedere diversi provider abbandonare il mondo Unix per le nuove possibilità
offerte da Windows NT.
Grazie all'utilizzo delle pagine asp, l'utente può
quindi creare dei documenti che possono fornire informazioni, rispondendo in
modo diverso alle differenti richieste dei navigatori. Ma quali sono, in breve,
i vantaggi nell'utilizzo di questo linguaggio di scripting?
1) Le pagine asp sono completamente integrate con i
file html.
2) Sono facili da creare e non necessitano di
compilazione.
3) Sono orientate agli oggetti e usano componenti
server ActiveX.
Visti i vantaggi, e viste anche le limitazioni cui
abbiamo accennato in precedenza, riassumiamo le tecnologie conivolte nello
sviluppo e funzionamento delle active server pages:
1) Windows NT
2) Protocollo tcp/ip
3) Un web server che supporti Active Server, come
IIS
4) In via facoltativa, odbc (Open DataBase
Connectivity) e un server database.
Esaminando più da vicino l'"anatomia" di
questo genere di pagine possiamo constatare che esse sono costituite da tre
differenti parti:
1) Testo
2) Marcatori html
3) Comandi script
In un documento con estensione .asp è consentito
utilizzare variabili, cicli, istruzioni di controllo, etc., grazie alla
possibilità di richiamare la sintassi un linguaggio di scripting, come ad
esempio il vbscript e il javascript, ma anche perl e rexx. La scelta del
linguaggio dipende in primo luogo dalle necessità del programmatore e dal tipo
di esecuzione che si vuole avere: se si volgiono eseguire gli script dal lato
server è preferibile utilizzare il vbscript, mentre se ci si vuole affidare
alla potenza degli "scripting engine" (motore che interpreta i
comandi dei linguaggi di scripting e li esegue) dei singoli navigatori è
sicuramente meglio utilizzare il javascript, semplice ed efficace.
Prima di iniziare ad imparare la programmazione
delle pagine asp tramite un buon numero di esempi commentati, è bene dare
un'occhiata preliminare alla sintassi per capire come esso funzioni. Non
intendiamo fare qui un elenco completo di tutti i comandi: inizieremo con un
insieme di istruzioni base che amplieremo ed illustreremo nel corso delle
lezioni utilizzando degli esempi di codice che cerchino di insegnare a creare
qualche cosa di realmente utile.
Una prima distinzione che possiamo operare a livello
di codice sorgente è a livello di comandi nativi, propri dell'asp, e comandi di
scripting che appartengono al particolare linguaggio script utilizzato. Tra i
marcatori fondamentali dell'asp ci sono sicuramente i delimitatori, che come
nell'html delimitano l'inizio e la fine di una sequenza di codice, e sono
rappresentati dai simboli:
<% e %>
Ad esempio il comando:
<% x="ciao" %>
assegna alla variabile x il valore "ciao".
Abbiamo già detto che è possibile includere anche
script nel codice asp e utilizzare così funzioni create, ad esempio, in
javascript o vbscript, richiamandole tramite il comando nativo <% Call _
%>, come nell'esempio 1 che mostra come costruire una pagina che visualizzi
la data del giorno corrente:
ESEMPIO1.ASP:
<% Call PrintDate %>
<SCRIPT LANGUAGE=JScript RUNAT=Server>
function PrintDate()
{
var x
// x è un'istanza dell'oggetto Date
x = new Date()
// il comando Response.Write scrive la data sul
navigatore
Response.Write(x.getDate())
}
// Questa è la definizione della procedura
PrintDate.
// Questa procedura manderà la data corrente al
navigatore.
</SCRIPT>
Dato che abbiamo introdotto il concetto di oggetto,
accenniamo brevemente alla sua natura; un oggetto è un’astrazione di una
struttura dati, di cui non interessa sapere come è implementata (information
hiding), ma quali sono le operazioni possibili su di essa.
L’asp possiede degli oggetti precostituiti, sui
quali si può operare con i metodi, che sono delle funzioni intrinseche
all’oggetto: per fare un esempio, sull’oggetto automobile un metodo può essere
rappresentato dall’operazione di "fare_benzina", rappresentabile con
una notazione del tipo automobile.fare_benzina.
Sebbene si rassomiglino, bisogna fare attenzione a
non confondere i metodi dalle funzioni; queste ultime infatti sono definite dal
programmatore e risultano esterne all’oggetto.
Ritornando all’esempio 1, la funzione PrintDate
definita in javascript è scritta tra i marcatori <SCRIPT> e
</SCRIPT> come sempre, però questa volta sono stati inclusi gli elementi
LANGUAGE=JScript e RUNAT=server.
Dunque, bisogna specificare obbligatoriamente quale
tipo di linguaggio si sta usando e se lo script deve essere eseguito dal alto
client o sul server; nel caso non venga specificato il parametro RUNAT, il
valore predefinito sarà "server".
Un indubbio vantaggio che deriva dall'uso del
delimitatore RUNAT di script è costituito dal fatto che il codice sorgente non
è mai presente nella pagina html che viene spedita al navigatore dal server.
Infatti, il sorgente viene rielaborato dal server che invia come risultato una
pagina costruita "al volo" nella quale sono visibili solo i codici
html e quelle funzioni per le quali non sia stato specificato il valore
"server".
E' interessante notare che non è possibile
utilizzare i delimitatori <% %> per definire una funzione, dato che non è
possibile assegnare nomi a blocchi di codice asp; in seguito vedremo come
importare alcune funzioni utilizzando il comando <!-- #include --> .
Passiamo ora all'esame dell'oggetto Response, il
quale consente di gestire l'interazione fra il server e il client. Questo
oggetto possiede una serie di metodi che consentono di effettuare una serie di
operazioni che avremo occasione do psservare più dettagliatamente nelle varie
lezioni di cui si compone questo corso. Ecco di seguito un elenco dei metodi
sopra citati:
AddHeader
AppendToLog
BinaryWrite
Clear
End
Flush
Redirect
Write
Impariamo ora ad usare il metodo Response.Write
Tenendo a mente che questo metodo richiede una
stringa di testo tra virgolette, o una funzione che restituisca una stringa,
esaminiamo l'esempio 2 che illustra come creare e chiamare delle procedure
usando due differenti linguaggi di scripting (vbscript e JScript).
ESEMPIO 2.ASP :
<html>
<body>
<table>
<!-- la table non ha i tag <td><tr>
ecc. ecc. essi saranno definiti -->
<!-- dalla subroutine Echo definita dallo script
in vbscript -->
<!-- cioè il comando <% Call Echo %>
chiamerà la subroutine e restituirà -->
<!-- i valori che compileranno la tabella. -->
<% Call Echo %>
</table>
<!-- stesso discorso soltanto che Print Data
restituisce soltanto il valore -->
<!--della data corrente perch‚ chiama la funzione
definita nello script
<!--JavaScript. -->
<% Call PrintDate %>
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Echo
Response.Write "<tr><td> Name
</td><td>Value </td></tr> "
' L'istruzione Set imposta la variabile Params
Set Params = Request.QueryString
' il For itera per ogni stringa inserita nell'URL
dopo il punto ?
' es. http://www.italystore.com/esempio2.asp?pippo=3
e Params(p) prende il parametro 3
For Each p in Params
Response.Write " <tr><td>"
& p & "</td><td> " & Params(p) &
"</TD></TR> "
Next
End Sub
</SCRIPT>
<SCRIPT LANGUAGE=JScript RUNAT=Server>
function PrintDate()
{
var x
x = new Date()
Response.Write(x.toString())
}
</SCRIPT>
Nel precedente esempio abbiamo introdotto la
Request, che può essere definito come il primo oggetto che incontriamo ad
essere intrinseco al server, dato che esso rappresenta l'elemento di
connessione tra il programma client ed il web server. In pratica, esso si
occupa di trasmettere le informazioni provenienti da alcune variabili del
server (le collection), mentre l’oggetto Response si occupa dell’interazione
tra server e client tramite l’utilizzo di metodi quali write, che permette la
scrittura a video.
La sintassi propria di questo elemento è:
Request[.Collection] ("variabile")
Vi possono essere varie collection, ed infatti ne
esamineremo alcune nelle prossime lezioni; sempre nell'esempio precedente
potete osservare l'utilizzo della collection QueryString, che accetta le
stringhe provenienti da un form oppure inserite manualmente, formate da un
punto interrogativo seguito da un testo.
Ora, per cominciare, date un'occhiata a questa
semplice pagina asp che consente di visualizzare il classico testo "Hello
World !" in una pagina html. La particolarità di questo testo consiste nel
potere apparire in una dimensione variabile da 3 punti per carattere fino a 7,
grazie ad un comando vbscript (For To) che controlla un ciclo di assegnazione
di valori alla variabile "i", la quale a sua volta definisce la
grandezza del parametro html SIZE; il ciclo viene effettuato su tutto ciò che
si trova tra For To e Next.
ESEMPIO 3.ASP :
<% For i = 3 To 7 %>
<font size=<%=i%>>Hello
World!</font>
<% Next %>
Prima di concludere la lezione, vediamo un altro
utilizzo dell'oggetto Request che utilizzando il metodo ServerVariables,
permette di richiedere al server una delle variabili di sistema come ad esempio
HTTP_USER_AGENT, la quale identifica il nome del navigatore che il client sta
usando in quel momento.
ESEMPIO 4.ASP :
<%
a=Request.ServerVariables("HTTP_USER_AGENT")%>
<% Response.write(a)%>
Per concludere questa prima puntata, ricapitoliamo i
passi necessari a creare una pagina asp:
1) Aprire un editor di testo (blocco note o Word), o
un editor html.
2) Scrivere una pagina che inizi con e si concluda
con
3) Utilizzare i comandi <%_%> ed eventuali
script
4) Salvare il file con estensione .asp.
5) Effettuare l'upload del file sul vostro sito.
6) Lanciare il navigatore e collegarsi all'URL del
vostro file
(es. http://www.italystore.com/esempio3.asp).
Per chi usa Windows 95 e vuole esercitarsi sugli
asp, la cosa migliore che può fare è procurarsi il Personal Web Server di Microsoft
e far girare off-line le proprie applicazioni, dato che le active server pages
funzionano solo in presenza di un server web Microsoft.
Abbiamo iniziato con qualche pagina abbastanza
semplice, solo per introdurre la sintassi dell'asp e dei linguaggi di scripting
ad esso connessi. Certo, conoscere bene il javascript o il vbscript aiuta molto
e qualche numero arretrato di inter.net potrà darvi una mano, specialmente
grazie al corso di javascript apparso diversi mesi fa. Nel giro di qualche lezione
mostreremo qualche linea di codice davvero utile ed interessante, affrontando
più approfonditamente le potenzialità di questo linguaggio, fino a discutere di
applicazioni di una certa complessità come la costruzione di un form di
consultazione e aggiornamento di un database remoto su web.
N.B.: i files .asp vanno lanciati in questa maniera:
http://www.pippo.com/prova.asp oppure se si ha istallato il PWS si devono
lanciare così: http://127.0.0.1/prova.asp il file prova.asp si deve trovare in
c:\intepub\wwwroot\prova.asp.
Per istallare il PWS andate sul CD di Windows 98 e
cercate nella cartella ADD-ON\PWS il file setup.exe. I file .asp sono
interpretati dal server e non si aprono col browser come per gli html.
Cose interessanti da fare ce ne sono parecchie, ma
fino alla prossima puntata vi consigliamo di consultare due siti di indubbio
interesse:
http://www.activeserverpages.com
http://aspwire.com
Corso di ASP
Parte seconda
--------------------------------------------------------------------------------
ATTENZIONE: per far funzionare il mailform bisogna
procurarsi il file smtpsvg lo trovate anche sulla mia home page.
Bentornati nel mondo della programmazione ASP, in
questa puntata il gioco comincerà a farsi duro….ma è adesso che i duri devono
cominciare a giocare.
Nella prima puntata si è definito l'Active Server
Pages come un filtro ISAPI, aggiunto all'Internet Information Server di Windows
NT; in altre parole ASP è un linguaggio di programmazione, di tipo script, che
viene eseguito sul server e genera in output del codice HTML.
La differenza dagli altri scripts languages
(Javascript, VBScript), consiste nel fatto che ASP si comporta come un file
CGI, cioè non è possibile visualizzare dal browser il codice sorgente del
linguaggio, ma solo l'output, inoltre ASP permette anche l'interazione con i
DataBase.
In questa puntata si passerà subito all'azione con
l'analisi di programmi utili ed immediatamente applicabili, come la costruzione
di un feedback form, di cui si può ammirare il listato nell'esempio1
Esempio 1:
File HTML del form:
<html><head>
<title>Input form per AspMail</title>
</head>
<body bgcolor="ffffff">
Un semplice modulo di richiesta
<!-- il tag form ha un action che richiama il
file aspmail2.asp che processera' le informazioni
provenienti dal modulo -->
<form method="POST"
action="aspmail2.asp">
<table border="0">
<tr>
<td>Nome</td>
<!-- ogni box di testo deve avere un nome per
essere identificata -->
<td><input type="TEXT"
name="nome" size="25"> </td></tr> <tr>
<td>Telefono #</td>
<td><input type="TEXT"
name="tel" size="15"> </td>
</tr>
<tr>
<td>Indirizzo</td>
<td><textarea name="indirizzo"
rows="3" cols="30"></textarea> </td>
</tr>
<tr>
<td>Email: </td>
<td><input type="TEXT"
name="email" size="20"> </td>
</tr>
<tr>
<td>Eventuali annotazioni</td>
<td><textarea NAME="commenti"
ROWS="4" COLS="30"></textarea> </td>
</tr>
<tr>
<td><input type="SUBMIT"
value="Invia"> </td></tr>
</table>
</form>
</body>
</html>
ASPMAIL2.ASP:
<html>
<head>
<title>Request con le variabili</title>
</head>
<body bgcolor="ffffff">
<!-- request.form("tel") prende il
valore contenuto nella box che si chiama "tel" e lo assegna alla
variabile strTel e cosi' per tutti le altre -->
<%
rem il metodo Serve.CreateObject crea delle istanze
a degli oggetti preesistenti come
rem (SMTPsvgMailer) creando cosi' un oggetto.
rem la variabile Mailer è un'istanza dell'oggetto
SMTPsvgMailer, cioè è una variabile che assume rem tutte le caratteristiche ed
i metodi dell'oggetto di cui è istanza ovvero il FromName,
rem FromAddress,il RemoteHost, il Recipient,
BodyText, ecc. ecc.
Set Mailer =
Server.CreateObject("SMTPsvg.Mailer")
strNome = request.form("nome")
strTel = request.form("tel")
strIndirizzo = request.form("indirizzo")
strEmail = request.form("email")
strCommenti = request.form("commenti")
rem - assegno il nome del mittente e l'indirizzo del
mittente
rem - ATTENZIONE: Questi sono campi obbligatori
Mailer.FromName = strNome
Mailer.FromAddress = strEmail
rem - assegno l'indirizzo della macchina SMTP
dell'host remoto
rem - grazie alla quale potro' inoltrare la posta.
strMailHost = "mail.xxx.it"
Mailer.RemoteHost = strMailHost
rem - Assegno l'indirizzo del destinatario cioe' il
mio.
Mailer.Recipient "nannib@libero.it"
rem - Assegno la stringa dell'oggetto o titolo
(Subject) della mail.
Mailer.Subject = "Modulo on line di
informazioni"
rem - Inserisco il corpo del messaggio
rem ogni variabile strBody etc. etc. assume il
valore della stringa tra le virgolette piu' i caratteri
rem vbCrLf che sono il Carriage Return ed il Line
Feed che servono ad andare a capo.
rem ogni volta alla strBody successiva si concatena
il valore della strBody precedente
rem cosi' alla fina la strBody sara' una stringona
rappresentante tutto il corpo del messaggio.
strBody = "Caro Nanni Bassetti" &
vbCrLf & vbCrLf
strBody = strBody & "Il mio nome e' "
& strNome & vbCrLf
strBody = strBody & "Abito in
."&strIndirizzo & vbCrLf
strBody = strBody & "Il mio numero di
telefono e' " & strTel & vbCrLf
strBody = strBody & "La mia E-mail e':
" &strEmail & vbCrLf
strBody = strBody & "Ecco i miei commenti
al tuo lavoro': " &strCommenti & vbCrLf
Mailer.BodyText = strBody
rem assegno alla variabile strPrimaLinea la stringa
"Il tuo Nome e'" seguita dal valore contenuto rem nella variabile
strNome e cosi' per gli altri. Questo per il report finale.
strPrimaLinea = "Il tuo Nome e': " &
strNome
strSecLinea = "Il tuo numero di telefono e':
" & strTel
strTerzaLinea = "Il tuo indirizzo e': "
& strIndirizzo
strQuartaLinea="La tua e-mail e':"
&strEmail
strQuintaLinea="Le tue annotazioni
sono:"&strCommenti
rem - Invio il messaggio
rem SendMail puo' ritornare un valore di True o di
False
rem se Mailer.SendMail (implicitamente significa che
e' True ) allora apparira' sul browser il
rem messaggio "Posta Inviata" ed un report
dei dati inseriti altrimenti (else) appare un messaggio
rem che comunica che ci sono stati problemi
nell'invio del messaggio.
if Mailer.SendMail then
Response.Write "Posta Inviata..."
rem infine grazie all'oggetto response ed usando il
metodo write stamo a video il valore delle
rem variabili seguite da un
response.write strPrimaLinea &
"<br>"
response.write strSecLinea &
"<BR>"
response.write strTerzaLinea &
"<BR>"
response.write strQuartaLinea &
"<BR>"
response.write strQuintaLinea &
"<BR>"
else
Response.Write "Mail fallita. Controlla il nome
del server e la connessione tcp/ip…<br>"
Response.Write Mailer.Response
end if
%>
</body>
</html>
Con questo semplice e comprensibile programmino ora
siete in grado di gestire i forms on line semplicemente facendo un upload dei
files (il file html + il file asp) nella vostra directory di lavoro.
Se si vogliono aumentare o diminuire i campi del
form, basterà aumentare o diminuire le variabili associate agli elementi di
<input> del modulo.
Chiaramente se si vogliono usare delle check box o
dei radio buttons basterà assegnare loro un valore (VALUE="…") ed un
nome (NAME="…") come si è sempre fatto in HTML.
Per concludere il commento all'esempio 1, ricordiamo
che l'SMTP (Simple Mail Transfer Protocol) è il protocollo di trasmissione
usato per la posta elettronica e quando dobbiamo inviare un messaggio dobbiamo
sempre indicare l'SMTP server, cioè l'indirizzo della macchina che si occupa di
inviare i messaggi.
Fermi ! ancora un po' di pazienza prima di buttarsi
sulla tastiera bisogna acquisire ancora altri mezzi, infatti per creare un
programma in un qualsiasi linguaggio le tre cose fondamentali da sapere sono:
- le istruzioni di assegnazione (es. x=5)
- le istruzioni di iterazione (For…To..Next visto
nella scorsa puntata)
- le istruzioni di controllo (If...Then…End If)
Ed a questo proposito ecco qui un esempio ad hoc per
ciò che riguarda le istruzioni di controllo:
ESEMPIO 2:
<TITLE>Stipendiometro in ASP</TITLE>
<body bgcolor="ffffff">
Inserisci un numero da 0 a 4
<form>
<p>Inserisci il tuo grado di stipendio (0-4):
<p><input type="text"
name="grado"><br>
<p><input type="submit"
name="Invia">
</form>
<%
rem creazione della variabile GradoSalario di tipo
Variant cioe' una variabile che può contenere
rem diversi tipi di dati (numeri, stringhe, ecc.)
dim GradoSalario
rem assegno il valore della textbox alla variabile
GradoSalario
GradoSalario=request.form("grado")
rem l'istruzione Select Case …End Select e' un
switch multiplo, cioe' un come se ci fossero
rem piu' blocchi if then end if
Select Case GradoSalario
rem nel caso in cui GradoSalario e' uguale a 0 o
uguale ad 1 allora stampa "Sei un povero barbone"
rem e cosi' via…
case 0,1
response.write("Sei un povero barbone !")
case 2,3
response.write("Buongiorno Signore !")
case 4
response.write("Eccellenza come va ?")
End Select
%>
</body>
</html>
Ancora fame di istruzioni ASP ?
Allora come promesso nella scorsa puntata, qui
vedremo il comando <!-- #INCLUDE della libreria di comandi Server Side
Include (SSI) ed analizzeremo gli aspetti più importanti degli oggetti Request
e Response.
Al comando #Include, SSI esegue una funzione simile
alla direttiva #include del C e C++ e cioè include il contenuto di un file in
un file .asp.
Il file incluso può essere di testo, HTML, .asp, di
grafica o qualsiasi altro file presente sul server.
Se, per esempio, il vostro sito è composto da
centinaia di pagine e si desiedera dare a tutte un aspetto uniforme (usando lo
stesso template), invece di ricostruire tutto il codice html per ogni pagina,
grazie all'SSI basterà inserire il template in un file da includere in tutte le
pagine.
L'inserimento di un file esterno ha la seguente
sintassi:
<!-- #INCLUDE FILE="img.inc"
-->
dove il file img.inc è posizionato nella stessa
directory del file di destinazione può contenere il seguente codice (per
esempio):
<IMG SRC="http:/www.italystore.com/asp/img/button2.gif"
WIDTH="80" HEIGHT="20" ALT="bottone"
ALIGN="CENTER" BORDER="0">
così se vogliamo inserire il bottone (button2.gif)
in tutto nostro sito web, basterà usare una riga invece di riscrivere tutto il
codice html associato.
Un altro metodo per includere i file esterni è:
<!-- #INCLUDE VIRTUAL="img.inc"
-->
dove img.inc si trova nella directory di default:
\winnt\system32\inetsrv
però è creare delle sottodirectory, per esempio
\winnt\system32\inetsrv\nanni_asp
e l'include diverrà:
<!-- #INCLUDE
VIRTUAL="/nanni_asp/img.inc" -->
Per concludere questa lezione facciamo una breve
carrellata sugli oggetti Request e Response;
come avevamo visto l'oggetto Request richiede iìle
informazioni da diverse fonti (le collezioni) e la collezione usata fin'ora è
stata la Form, ma ci sono altre come:
la Form, la Cookie, la ServerVariables.
L'insieme ServerVariables informa di tutto ciò che
il server sa riguardo al client ed a se stesso, se ad esempio si scrive il
seguente codice:
<%
a=Request.ServerVariables("HTTP_USER_AGENT") %>
<% Response.Write(a) %>
si otterrà la visualizzazione su l browser del tipo
di software client si sta usando (il che può essere molto utile quando si
intende presentare un codice HTML ottimizzato per ogni dato client).
Ecco alcune variabili del server:
HTTP_REFERER URL della pagina indicato dall'utente
al documento del sito HTTP_UA_PIXELS Risoluzione del monitore con il browser
del client
HTTP_UA_COLOR Palette dei colori del monitor
HTTP_UA_OS Sistema Operativo del browser
dell'utente
HTTP_ACCEPT_LANGUAGE Lingua accettata dal
browser
DATE_LOCAL Data corrente nella fascia oraria
locale
REMOTE_ADDR IP del client.
ALL_HTTP Tutte le variabili HTTP_*
Dell'oggetto Response abbiamo esaminato solo il
metodo Write, quindi è d'obbligo una panoramica su alcuni degli altri metodi:
Response.AppendToLog questo metodo aggiunge una
stringa di non più di 80 caratteri al file di log di IIS.
Response.BinaryWrite questo metodo permette di
visualizzare dei file binari (es. le immagini)
Response.End interrompe l'elaborazione ASP in
corso.
Response.Redirect serve per inviare i clients ad un
altro URL.
Il mondo degli ASP è sconfinato e qui noi cerchiamo
di analizzare i mezzi di più immediato utilizzo e comprensione e con questa
nobile missione nel cuore, vi lascio con uno degli strumenti più richiesti ed
usati il web-counter degli accessi al vostro sito.
Alla prossima puntata !
Inserite questo pezzo di codice dove volete nella
vostra pagina html, stando attenti a rinominarla *.asp ed il gioco è fatto !
ATTENZIONE: per far funzionare questo procuratevi il
file pagecnt dalla mia home page.
Counter:
Rem PageCount diventa un'istanza dell'oggetto
IISSample.PageCounter che si occupa di
Rem contare gli hits alla pagina
<%Set
PageCount=Server.CreateObject("IISSample.PageCounter")
Rem la variabile Hits prende il valore di PageCount
Hits=PageCount.Hits%>
Rem il tag <%= visualizza il contenuto della
variabile Hits.
<%=Hits%>
Corso di ASP
Parte terza
Metti in linea il tuo catalogo.
Impariamo a realizzare un motore di ricerca in grado
di interfacciarsi ad un database Access e Sql
--------------------------------------------------------------------------------
Nelle precedenti lezioni ci siamo avvicinati
gradualmente alla sintassi dell’asp, imparando
a costruire semplici applicazioni, prendendo
confidenza con il linguaggio.
Ora è il momento di passare a qualcosa di più
concreto e interessante e quindi proveremo a
costruire un motore di ricerca che consenta di
interagire con un database remoto via web.
Il nostro progetto si articolerà in due sezioni
distinte. La prima parte prevedere la creazione
di un form (simile al feedback form che abbiamo
imparato a creare nell’ultima puntata) attraverso
la quale l’utente possa immettere dei dati, mentre
in un secondo momento vedremo
come implementare un motore asp che processi le
informazioni (queries) e le utilizzi per "prelevare" da un database i
dati cercati.
Sembra complicato? Niente paura è più difficile a
dirsi che a farsi.
Creare l’interfaccia
Cominciamo subito con la scrittura del form che
servirà all’utente per interagire con il
database, immaginando di avere un negozio di libri
online che consenta di cercare un
libro in base cercandone i riferimenti in 4 campi:
TITOLO, AUTORE,
CATEGORIA, CASA EDITRICE.
I primi due campi sono testuali e hanno il vantaggio
di consentire ricerche parziali:
se ad esempio inseriamo il riferimento MARIO nello
spazio dedicato agli autori,
il database ci mostrerà tutti i libri il cui autore
ha per nome o MARIO; questo,
ovviamente, è possibile anche per una ricerca per
titolo
Per quanto riguarda gli altri due campi, abbiamo
deciso di strutturarli come
"menu a tendina" con due opzioni:
1. E’ possibile selezionare la parola chiave
"Tutte", che consente di
visualizzare tutti i valori associati ad un campo
(ad es. tutte le
case editrici presenti nel database).
2. In alternativa, si può scegliere un singolo
valore presente in lista.
In questo caso, ad esempio,scegliendo
"Urania" si otterrà la lista
di tutti i libri dell'Urania Editrice.
Diamo subito un’occhiata al codice html che ci
consentirà di visualizzare il form appena descritto:
FORM.HTM
<HTML>
<HEAD>
<TITLE>I NOSTRI LIBRI</TITLE>
</HEAD>
<BODY BGCOLOR="#C0C0C0"
TEXT="#0F0000" LINK="#0000FF"
ALINK="#0000CC"
VLINK="#0000FF">
<center>Motore di Ricerca
<form method="post"
action="motor.asp">
<p><b>TITOLO</b><br>
<textarea name="titolo"
cols="30"></textarea>
</p>
<p><b>AUTORE</b><br>
<textarea name="autore"
cols="30"></textarea>
</p>
<p><b>CATEGORIA</b><br>
<select name="cat">
<option
value="tutte">Tutte</option>
<option
value="DIRITTO">Diritto</option>
<option value="FANTASCIENZA">
Fantascienza</option>
</select>
</p>
<p><b>CASA EDITRICE</b><br>
<select name="editrice">
<option
value="tutte">Tutte</option>
<option
value="CEDAM">Cedam</option>
<option
value="URANIA">URANIA</option>
<option value="MONDADORI">
Mondadori</option>
</select>
<br>
</p>
<p align="center">
<input type="submit"
name="submit"
value="Cerca">
<input type="reset"
name="submit2"
value="Reset">
</p>
</form>
</center>
</BODY>
</HTML>
Costruire la base di dati
L’aspetto
interessante di questo progetto consiste nel non avere
nulla di predefinito: non esistono pagine già pronte
che rispondano
ad una ricerca dell’utente.
Al contrario, il motore in asp è
in grado di creare ogni pagina necessaria al
momento,
interagendo con le informazioni fornite dall’utente
attraverso il form.
Dopo l’interfaccia utente è ora il caso di esaminare
la base di dati.
Un database, in poche parole, è un contenitore nel
quale le
informazioni possono essere registrate in forma
strutturata.
Nel nostro caso utilizzeremo una struttura tabellare
nella
quale alle righe corrispondono i "records"
e alle colonne
i "campi". Le informazioni relative ad un
libro, ad
esempio, verranno registrate in un record formato
dai campi
"Titolo, Autore, Categoria, Casa Editrice, ecc.
ecc.".
Il procedimento di creazione di un file database è
notevolmente semplificato
dagli applicativi moderni che consentono di operare
in maniera visuale, diminuendo
i tempi di apprendimento e di realizzazione della
base di dati. Per ciò che ci proponiamo
di fare, Access è lo strumento ideale, semplice ed
efficace, ma anche Excel,
DB3 possono essere utilizzati senza problemi.
Vediamo in 9 punti come creare un file Access
contenente una tabella
nella quale registrare i libri:
1) Lanciate Microsoft Access e scegliete "Database
Vuoto".
2) Salvate il database dandogli un nome qualsiasi,
ad esempio libri.mdb.
3) Cliccate su Tabelle e poi su Nuovo.
4) Scegliete "Visualizzazione foglio
dati".
5) Rinominate le colonne con i nomi dei campi
(TITOLO, AUTORE, CATEGORIA, CASA EDITRICE, ANNO, PREZZO,COLLANA, IMM, TESTO).
6) Salvate le modifiche e scegliere un nome per la
tabella (ad esempio tablibri)
7) A questo punto Access vi chiederà di definire una
chiave primaria (nel nostro caso si tratta di un campo contatore che viene incrementato
di un’unità per ogni record inserito in tabella), che servirà ad identificare
univocamente i record.
8) Riaprite tablibri e cominciare a
"riempire" i vari record proprio come se fosse un foglio elettronico
di Excel.
9) Salvate ed uscite.
Accendiamo il motore
Ora che
abbiamo creato il nostro database (libri.mdb) contenente una sola tabella
(tablibri) nella quale sono registrate le informazioni relative ai libri che
abbiamo inserito inserito, dobbiamo costruire un motore di ricerca che sappia
maneggiare i dati.
A questo proposito, va sottolineato come lavorare
sotto Windows NT comporti dei vantaggi non indifferenti. Grazie all’utilizzo di
ADO (Activex Data Objects), un componente di Active Server preposto alla
gestione dei file (file, directory e database), è possibile infatti accedere a
qualsiasi informazione, non importa se questa sia contenuta in un database o in
un messaggio di posta elettronica. ADO, infatti,
contiene un’interfaccia specifica per la connessione ai database, OLEDB (Object
Linking and Embedding per Data Base) la quale attraverso l’interfaccia
ODBC (Object Data Base Connectivity) in essa
contenuta consente di accedere direttamente a qualsiasi database senza dovere
editare delle routine apposite per ogni tipo di dati. Riassumendo,
ADO (conosciuto anche come ADODB) è un componente
che si occupa dell’accesso "generico" ai dati e contiene al suo
interno OLEDB e ODBC, che si occupano di gestire rispettivamente, il primo i
database ad oggetti (non ci addentriamo oltre) ed il secondo i database
relazionali.
Non ci
rimane che analizzare il listato relativo al motore di ricerca vero e proprio:
MOTOR.ASP
<HTML>
<HEAD>
<TITLE>I NOSTRI TITOLI</TITLE>
</HEAD>
<BODY BGCOLOR="#C0C0C0"
TEXT="#0F0000" LINK="#0000FF"
ALINK="#0000CC"
VLINK="#0000FF">
<% rem legge dal form
titolo=request.form("titolo")
autore=request.form("autore")
cat=request.form("cat")
ed=request.form("editrice")
In questo primo blocco di codice osserviamo
l’utilizzo dell’oggetto request,
tramite il quale i valori provenienti dai diversi
campi del database vengono associati a variabili;
ad esempio, se l'autore è Pinco Pallo la variabile
autore conterrà la stringa "Pinco Pallo".
if titolo="" then titolo="%"
if autore="" then autore="%"
if cat="tutte" then cat="%"
if ed="tutte" then ed="%"
Con questa serie di direttive viene introdotto un
controllo che si occupa di sostituire agli
eventuali spazi bianchi lasciati nei form, o al
valore "tutte", il simbolo % che in
linguaggio SQL (Structured Query Language)
significa "Qualunque valore del campo".
sql="select * from tablibri where titolo
like '%"&titolo&"%' and autore
like '%"&autore&"%'
and cat like '%"&cat&"%' and
editrice like '%"&ed&"%'"
La direttiva
che vedete qui sopra può sembrare a prima vista un po’ criptica; vediamo di
commentarla. Si inizia con l’assegnare alla variabile sql una stringa di
comandi SQL il cui significato è:
SELECT (seleziona) * (tutti i campi)
FROM (dal) tablibri (la tabella tablibri)
WHERE (nella quale) TITOLO (il campo titolo)
LIKE (è pari a)
"%"&titolo&"%" (tutti i valori
+ il contenuto della variabile titolo+tutti i
valori)
AND (e) "%"&autore&"%"
ecc. ecc.
Inserire i
simboli "%" prima e dopo il contenuto della variabile rende possibile
la ricerca anche
con dati parziali; se all’interno del form
inserisco, ad esempio, nel campo AUTORE solo la lettera M,
verranno visualizzati i libri scritti da autori i
cui nomi iniziano per M.
Set OBJdbConnection =
Server.CreateObject("ADODB.Connection")
Definisco OBJdbConnection come un’istanza
dell’oggetto
Quest’oggetto informa il server che si sta creando
un mezzo per effettuare una connessione (attraverso ADO) ad un database.
Il nome del database è il DSN (Data Source Name,
cioè:
"nome della sorgente dei dati"), ed è
definibile, come amministratore di sistema, da pannello di controllo del server
NT. Insomma, si può considerare l'oggetto OBJdbConnection come un telefono,
ovvero lo strumento attraverso il quale è possibile effettuare una chiamata (utilizzando
il metodo OPEN) al DSN.
OBJdbConnection.Open"driver={Microsoft Access
Driver (*.mdb)};
dbq=c:\inetpub\wwwroot\newitalystore\libri\libri.mdb"
Per meglio comprendere il metodo Open paragoniamolo
ad una telefonata mentre per il metodo Execute potremmo pensare ad un utente
che da un’estremità della connessioni si accinga ad aprire la bocca per
parlare. Sempre riprendendo l’immagine della telefonata, le parole che
intercorrono fra i due apparecchi sono i dati contenuti nei record, che vengono
estrapolati utilizzando il metodo Open: utilizzando l'oggetto OBJdbConnection
il metodo Open apre un canale attraverso il quale può passare il flusso di dati
proveniente dalla tabella del database.
Il codice da noi usato serve per impostare una
connessione DSN-less (senza-DSN), ideale per chi non è amministratore di
sistema, dato che in essa vengono specificati il tipo di driver da utilizzare e
la directory in cui risiede il file contenente i dati.
Se avessimo usato un DSN avremmo potuto
semplicemente scrivere:
OBJdbConnection.Open "libri"
dove "libri" è un DSN che indica la
posizione del database e quale driver è richiesto per accedere ai dati. Una
connessione di questo tipo, però, ha lo svantaggio di dovere richiedere
l’intervento dell’amministratore del sistema NT nel momento in cui si decide di
spostare il database in un’altra, dato che è necessaria, in questo caso, una
modifica del DSN; una connessione DNS-less ha il vantaggio di non richiedere
alcuna modifica, dato che la directory di riferimento è già scritta a livello
di codice. Un altro sistema che non richiede alcuna conoscenza del server è:
OBJdbConnection.Open "driver={Microsoft Access
Driver (*.mdb)};dbq=" & server.mappath("libri.mdb")
Però questo sitema "rallenta" un po' il
sistema.
Set RS=OBJdbConnection.Execute(sql)%>
Dopo avere aperto la connessione con l’oggetto
OBJdbConnection, si esegue la query contenuta nella variabile sql utilizzando
il metodo Execute.
Impostiamo RS come un'istanza dell'oggetto
OBJdbConnection; quindi se scriviamo, per esempio, rs("titolo")
eseguiamo una query di ricerca sul campo "titolo".
<%
response.write ("<center><h2>Libri
Trovati
</h2><br><table
border=1><tr><td>
Numero</td><td
align=center>Titolo</td>
<td>Autore</td>
<td>Anno</td><td>Categoria</td>
<td align=center>Casa Editrice</td>
<td>Prezzo</td><td>Collana</td>
</tr>") i=0%>
L’oggetto response.write stampa a video i comandi
html che generano la tabella.
<%Do while NOT RS.EOF
i=i+1%>
"DO While" "Loop" è un ciclo che
dura fino al raggiungimento del RS.EOF, che indica la fine del file (End Of
File); per muoversi da un record a quello successivo viene inserita nel ciclo
l’istruzione RS.MoveNext.
<TR>
<TD><%=i%></TD>
<td><% id=rs("id")
titolo=rs("titolo")%>
<a href="libro.asp?ID=<%=id%>">
<%=titolo%></a><br>
</td>
Con queste righe decidiamo di mettere in una cella
il titolo del libro trovato,
recuperandolo da rs("titolo"), che
contiene il valore selezionato dall’oggetto RS nel
campo "titolo" della tabella tablibri.
Da notare, inoltre, che il titolo dell’opera
localizzata dalla ricerca apparirà come
link ad un file libro.asp che esamineremo nella
prossima lezione. Inoltre, per ora,
eviteremo di spiegare perché nella variabile
"id" abbiamo inserito il valore della chiave
primaria (il campo ID contatore) della tabella.
<td><%response.write(RS("autore"))
autore=rs("autore")%></td>
<td><%response.write(RS("anno"))
anno=rs("anno")%></td>
<td><%response.write(RS("cat"))
cat=rs("cat")%></td>
<td><%response.write(RS("editrice"))
ed=rs("editrice")%></td>
<td><%response.write("L.
"&RS("prezzo"))
prezzo=rs("prezzo")%></td>
<td><%response.write(RS("collana"))
collana=rs("collana")%></td>
</TR>
<%
imm=rs("imm")
RS.MoveNext
Loop
RS.Close
OBJdbConnection.Close%>
</table>
</BODY>
</HTML>
Infine arriviamo al metodo Close che si occupa di
chiudere tutte le operazioni di
esecuzione (Execute) e connessione (Connection) al
database; in pratica
ricollegandoci all’esempio della telefonata, adesso
stiamo salutando e abbassando
la cornetta.
Riepiloghiamo:
Si inseriscono delle keyword di ricerca nel
form.htm, si preme il tasto CERCA, il form invia le keyword al motore di
ricerca motor.asp che costruisce la query (interrogazione) per il database dal
quale seleziona i libri con le caratteristiche richieste. Infine, viene
generata una pagina che visualizza il titolo, l'autore, la categoria e la casa
editrice dei libri trovati.
Il titolo però non è un semplice elemento testuale
ma un link al file libro.asp. C osa succede se si clicca su un titolo ?
Lo scopriremo nella prossima puntata…
Corso di ASP
Parte quarta
Impariamo a creare una pagina web dinamica in asp
![]()
Nell'ultima lezione abbiamo visto come costruire un
motore di ricerca per una ipotetica libreria,lasciandoci con una domanda:
"cosa succede cliccando sul titolo di uno dei libri trovati dal motore
?". Prima di concentrarci sul listato dobbiamo capire la logica che
sovrintende al funzionamento del tutto; facciamo quindi un breve riassunto:
1) Abbiamo un form on line con quattro voci, "Titolo, autore, casa
editrice, categoria",nel quale posso scegliere i campi sui quali
effettuare la ricerca, presa una decisione va premuto il tasto
"CERCA"
2) Premuto il tasto,entra in gioco il motore di ricerca (motor.asp) che legge da
un database e seleziona i libri con le caratteristiche specificate nel form.
3) Viene generata una pagina (sempre dal motor.asp) che mostra una lista di
libri che possono interessarmi, ma i titoli in realtà sono tutti dei
collegamenti ad una pagina chiamata libro,; rivediamo il link:
<a
href="libro.asp?ID=<%=id%>"><%=titolo%></a><br>
Il fatto che vi sia un parametro "?ID=" significa che quando viene
cliccato il titolo di un libro, il browser deve aprire la pagina libro.asp
trasmettendo anche il valore della variabile "id", cui è associata il
contenuto del campo "ID" del database.
Come potete vedere, il valore della variabile id viene inserito in una
variabile che convenzionalmente prende il nome di ID ma che potrebbe chiamarsi
anche,ad esempio, PIPPO es.
<a
href="libro.asp?PIPPO=<%=id%>"><%=titolo%></a>
<br>
Questa operazione consente di richiamare il file libro.asp, passandogli
alcune informazioni, relative ad immagini, testi, titolo e altro, che sono
contenute nel record relativo al libro selezionato; in base ai dati ricevuti,il
motore libro.asp è in grado di generare una pagina html standard,nella quale
però alcuni elementi sono presi dal record identificato dalla variabile id.
Facciamo un esempio ipotizzando che la lista di titoli a disposizione del
motore di ricerca sia composta da tre libri:
L'Isola del tesoro - Giulio Verne - Ed. Adv - ecc. ecc.
Il Terzo Gemello - Ken Follett - Ed Mondadori…
Neuromante - Gibson - ecc. ecc.
Volendo avere informazioni su "Il Terzo Gemello" basterà cliccare sul
link relativo;date un'occhiata alla barra degli indirizzi del navigatore:
vedrete comparire la stringa
http://www.ibol.it/libri/libro.asp?ID=2
Ovviamente il valore di ID è uguale a due, dato che il libro in questione è al
secondo posto nella lista dei record registrati nel database.. Cliccato il
collegamento, infatti, viene costruita una pagina in base ad un modello
predefinito, che viene riempito con i dati tratti dal record due.
Insomma, con 3 pagine di codice è possibile avere un sito di migliaia di pagine
diverse:
Una pagina per il form on line del motore.
Una pagina asp che effettua le ricerche nel database e stampa a video la lista
dei risultati (come tutti i motori di ricerca su internet).
Una seconda pagina asp che genera da un modello personalizzato la pagina
relativa al libro individuato dal motore.Ora concentriamoci sul listato:
libro.asp:
<HTML>
<HEAD>
<%
REM La variabile ID2 assume il valore della variabile ID presente dopo il
"libro.asp?"
REM E' usato l'oggetto request col metodo querystring che serve proprio a
"catturare" i valori
REM delle variabili sulla riga di comando
(http://www.ibol.it/libri/libro.asp?ID=2)
id2=request.querystring("id")
REM Definisco la stringa sql utilizzando i comandi dell'omonimo linguaggio in
modo che nel database tutti i campi
REM appartenenti al record numero "ID2"; nel nostro esempio si tratta
del record numero 2
sql="select *from tablibri where id="&id2
REM Come abbiamo visto nella lezione precedente, viene effettuata una
connessione al database libri.mdb
REM e tutte le variabili seguenti vengono "caricate" dei valori
presenti nel record;
REM nel nostro esempio autore="Ken Follet"
Set OBJdbConnection= Server.CreateObject("ADODB.Connection")
OBJdbConnection.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&server.mappath("libri.mdb")
Set RS=OBJdbConnection.Execute(sql)
testo=rs("testo")
titolo=rs("titolo")
autore=rs("autore")
anno=rs("anno")
pagine=rs("pagine")
cat=rs("cat")
ed=rs("editrice")
prezzo=rs("prezzo")
collana=rs("collana")
imm=rs("imm")
REM Qui comincia la costruzione della pagina html Il tag TITLE non è fisso ma
visualizza
REM il valore della variabile titolo; nel nostro esempio titolo="Il Terzo
Gemello"
%>
<TITLE><%=titolo%></TITLE>
</HEAD>
<BODY BGCOLOR="#ffffff" TEXT="#0F0000" LINK="#0000FF"ALINK="#0000CC"
VLINK="#0000FF">
<center>
<h1>Scheda Libro</h1>
<TABLE WIDTH="100%">
<TR>
<TD WIDTH="42%">
<%
REM In questa cella viene visualizzata
un'immagine fissa (Image2.gif) nel caso in cui il campo imm del record contenga
un "-", altrimenti viene visualizzata un'immagine il cui nome viene
preso dal
REM database. Es. imm="Terzgem.gif", che rappresenta la copertina del
libro.
if imm="-"then
response.write("<IMG SRC=Image2.gif WIDTH=120 HEIGHT=150
BORDER=0>")
else
response.write("<IMG SRC="&imm&" WIDTH=120 HEIGHT=150
BORDER=0>")
end if
rem Seguono tag html perla barra laterale, i link alle altre pagine del sito e
il resto. Tutto questo costituisce il modello della pagina libro.asp.%>
</TD>
</TR>
<TR>
<TD width="42%" height="22"></TD>
<TD width="58%" height="22"></TD>
</TR>
<TR>
<TD VALIGN="TOP" ALIGN="LEFT" width="58%">
<%
REM Eccoci di nuovo ad una parte dinamica della pagina. Qui impongo che le
parole Titolo, Pagine,ecc.
REM vengano visualizzate in grassetto mentre ciò che segue la dicitura è prelevata
direttamente dal database.
REM Utilizziamo l'oggetto response col metodo write per stampare avideo i tag
html insieme alle variabili.
response.write("<b>Titolo:</b>"&titolo&"<br><b>Autore:
</b>"&autore&"<br><b>Anno:</b>"&anno&"<br><b>
Pagine: </b>"&pagine&"<br><b>Editrice:</b>"&editrice&"<br>
<b>Prezzo:</b> L.
"&prezzo&"<br><b>Categoria:</b>"&cat&"<br><b>Collana:
</b>
"&collana&"<br><br>")%>
<center>
<p> <br>
<table border=0>
<tr>
<td>
<%
REM Controllo se la variabile testo è diversa da "-". Questo consente
di verificare se c'è un testo descrittivo del libro
REM da importare nella pagina.
if testo<>"-"then
REM Il componente File Access permette di accedere a file in formato testo
tramite due gruppidi oggetti che consentono di trasformare i testi stessi in
oggetti (TextStream)e di crearne delle istanze (FileSystemObject).
REM creo un singoloFileSystemObject (objFileSys) e lo uso per creare tutti gli
oggetti TextStreamnecessari. In questo caso ne serve uno solo.
Set objFileSys=Server.CreateObject("Scripting.FileSystemObject")
REM Usiamo il metodoMapPath per specificare il percorso del file da leggere.
varInputFile=Server.MapPath("/libri")+"\testi\"+testo
REM Creiamo l'oggettoobjTsIn che tramite il metodo OpenTextFile, apre il file
individuato dallavariabile (varInputFile).
Set objTsIn=objFileSys.OpenTextFile(varInputFile)
REM Qui inizia un ciclo di lettura del file usando la proprietà AtEndOfStream
dell'oggettoobjTsIn, da usare col metodo ReadLine,
REM la quale permette di leggere una riga alla volta in un oggetto TextStream.
REM Il ciclo si ferma quando si raggiunge la fine del file di testo; l'oggetto
objTsIn viene quindi chiuso col metodo Close.
Do Until objTsIn.AtEndOfStream
i=i+1
response.write(objTsIn.ReadLine)
loop
objTsIn.Close
end if
%> </td>
</tr>
</table>
</center>
</table>
</BODY>
</HTML>
Concludiamo l’articolo ricordandovi che per utilizzare il gestore di form
apparso nella seconda lezione del corso dovete installare la libreria SMTPSVG.DLL
contenuta nel file SMTPSVG.ZIP nel cd rom o scaricabile da internet, mentre per
utilizzareil web counter apparso nella seconda lezione
bisogna installare la libreria PageCnt.dll
presente sul cd rom della terza lezione o scaricabile anch’esso da internet. Vi ricordo che:
Per utilizzare il gestore di form apparso nella seconda lezione del corso
dovete installare la libreria:
SMTPSVG.DLL contenuta nel file SMTPSVG.ZIP nel CD o scaricabile da Internet.
Per utilizzare il web counter apparso nella seconda lezione:
bisogna installare la libreria PageCnt.dll presente sul CD della terza lezione
o scaricabile da Internet.
Corso di ASP
Parte quinta
--------------------------------------------------------------------------------
Dopo avere imparato a creare le pagine html
contenenti i nostri prodotti è arrivato il momento di mettere mano alla parte
"amministrativa" del nostro catalogo in linea. Prima di addentrarci
in nuovi argomenti, vediamo di ricapitolare i passi compiuti finora:
Abbiamo creato un form di ricerca contenente i campi
Titolo, Autore, Casa editrice, Categoria.
Il tasto "cerca" presente nella form è
stato predisposto per inviare i dati inseriti dall’utente ad un file asp
(motor.asp), il quale effettua una ricerca all’interno di un database Access
(libri.mdb) e visualizza i risultati in una pagina html composta da una tabella
con tutti i libri che rispondono ai criteri di ricerca.
Ogni titolo visualizzato nella tabella è stato reso
un link ad una pagina asp (libro.asp), che contiene le informazioni relative al
libro selezionato, estratte dai campi del record associato al libro stesso.
A questo punto l’interfaccia utente del sito è
finita; chiunque può accedere alle nostre pagine e ricercare un libro,
estraendo dal database tutte le informazioni necessarie ad identificare
l’oggetto ricercato. Ora si tratta di creare, però, gli strumenti per gestire
la base dei dati, ovvero inserire, cancellare un libro, oppure modificare una o
più informazioni ad esso associate.
Come possiamo fare? In effetti abbiamo a
disposizione due possibilità
1. Modificare in locale il file contenente i dati e
poi caricarlo sulla macchina che gestisce le pagine web.
2. Agire sulla base di dati in remoto, utilizzando
il navigatore.
La prima soluzione è improponibile dato che rende
estremamente laborioso il lavoro di gruppo su uno stesso database e implica
notevoli trasferimenti da e verso il server, a meno che questo non sia
direttamente raggiungibile in locale.
La seconda soluzione, invece, permette a più
operatori, anche distanti migliaia di chilometri tra loro, di lavorare sul
database e inoltre non obbliga a scaricare tutto il file di database anche
quando si è modificato un solo record. Prenderemo quindi in esame la seconda
soluzione, creando gli strumenti appropriati per gestire in remoto il database
del sito che abbiamo appena creato.
La prima cosa da fare è creare un form html che ci
consenta di proteggere da sguardi indiscreti la parte del sito dedicata alla
gestione; è ovvio che non sarebbe una soluzione ideale lasciare libero accesso
alla modifica dei dati. In pratica, il form preleva la password dell’utente e
la invia ad un file asp (pass.asp), che la confronta con quella contenuta in un
database di codici. In caso di responso positivo, il navigatore potrà accedere
alle pagine html più riservate, altrimenti viene rediretto ad una pagina di
default..
Vediamo il codice del file pass.asp:
PASS.ASP:
<%
rem Definisco una variabile pass
dim pass
rem Inserisco nella variabile passw la password
scritta nel form html
pw=request.form("passw")
rem leggo tutti i record della tabella pass del
database pass.mdb
sql="select * from pass"
Set OBJdbConnection =
Server.CreateObject("ADODB.Connection")
OBJdbConnection.Open "driver={Microsoft Access
Driver (*.mdb)};dbq=c:\inetpub\wwwroot\domini\italystore\annunci\
pass.mdb"
Set RS=OBJdbConnection.Execute(sql)
rem Carico nella variabile pw2 il valore del campo
pw del record del datatbase pass.mdb
pw2=rs("pw")
rem Effettuo il confronto tra la password presente
nel db e la password inserita nel form
if pw<>pw2 then
rem Se le due password sono diverse allora ritorno
alla home page
response.redirect "default.asp"
rem Altrimenti inserisco nella variabile pass la
stringa "ok"
else
pass="ok"
%>
rem A questo punto inserisco il file modifica.asp
<!-- #include file="modifiche.asp"
-->
<%
end if%>
Se le password sono uguali, l’utente può accedere al
file modifica.asp che permette di scegliere se aggiungere o cancellare un
record del database.
MODIFICHE.ASP:
<%
passb=request.form("pass")
rem Controllo se la variabile pass ha il valore
"ok". La variabile pass viene direttamente dal
rem file pass.asp.
if (pass="ok") then %>
<html>
<HEAD>
<TITLE>Il Database</TITLE>
</HEAD>
<BODY background="sfondo.gif"
BGCOLOR="#C0C0C0" TEXT="#0F0000" LINK="#0000FF"
ALINK="#0000CC" VLINK="#0000FF"><p>
rem Da qui posso scegliere se aggiungere o
cancellare o aggiornare un record, la mia scelta rem verrà trasmessa al file
rem scelta.asp
<form method=post
action="scelta.asp">
<center>
<input type=submit
name="aggiungi"value="Aggiungi">
<input type=submit name="cancella"
value="Cancella">
<input type=submit name="cambia"
value="Cambia Password">
<input type=hidden name="pass"
value="ok">
</center>
</form>
</BODY>
</HTML>
<%
rem Se pass è diverso da "ok" allora torno
alla home page default.asp
else
response.redirect "index.htm"
end if%>
Fin qui nessun problema: tutto concerne la verifica
della password,ma una volta passata questa fase possiamo concentrarci sul
codice che si occupa delle varie operazioni sul database.
SCELTA.ASP:
<%
pass=request.form("pass")
s=request.form
rem Se si sceglie di aggiungere un record allora
entra in azione questa sezione del programma, che approfondiremo nelle prossime
lezioni
if s="aggiungi=Aggiungi&pass=ok"
then%>
<html>
<HEAD>
<TITLE>Il Database</TITLE>
</HEAD>
<BODY background="sfondo.gif"
BGCOLOR="#C0C0C0" TEXT="#0F0000" LINK="#0000FF"
ALINK="#0000CC" VLINK="#0000FF">
<form method=post action="add.asp">
<center><h2>Aggiungi
Libro</h2><br>
<table border=1>
<tr><td align=center>Titolo</td><td
align=center>Autore</td><td
align=center>Anno</td></tr>
<tr>
<TD><input type=text
name="titolo"></TD>
<td><input type=text
name="autore"></td>
<td><input type=text
name="anno"></td>
</tr>
<tr>
<td align=center>Categoria</td><td
align=center>Casa Editrice</td><td
align=center>Prezzo</td>
<tr>
<td><input type=text
name="cat"></td>
<td><input type=text
name="ed"></td>
<td><input type=text
name="prezzo"></td>
</tr>
<tr>
<td align=center>Collana</td><td
align=center>Testo</td>
<td align=center>Foto</td>
</tr>
<tr>
<td><input type=text
name="collana"></td>
<td><input type=text
name="testo"></td>
<td><input type=text
name="imm"></td>
</tr>
<tr><td
align=center>Pagine</td></tr>
<tr>
<td><input type=text
name="pagine"></td>
</TR>
</table> <br>
<input type=hidden name="pass"
value="ok">
<input type=submit name="ok"
value="Aggiungi">
</form>
</BODY>
</HTML>
<%end if
rem Se s="cancella=Cancella&pass=ok"
significa che abbiamo scelto l’opzione CANCELLA e
rem che siamo autorizzati ad
rem usarla
if s="cancella=Cancella&pass=ok" then
rem A questo punto creiamo un motore di ricerca che
trovi solo il record che ci interessa
rem cancellare, altrimenti dovremmo visualizzare
tutta la base di dati…
%>
<html>
<head>
<title>Modifica- by
Italystore.com</title>
</head>
<body bgcolor="#FfFfff">
<center>
<!—Qui vediamo apparire una casella di testo da
riempire col titolo del libro che ci interessa cancellare; ovviamente, se non
ricordiamo tutto il titolo possiamo inserire anche solo alcune parole contenute
in esso. Dopo la pressione del tasto CERCA viene eseguito il file cancscel.asp
che effettua una ricerca per titolo nel database e visualizza i risultati a
video. Chiaramente la ricerca può essere effettuata su più campi ma, per
semplificare, ora utilizziamo solo il campo titolo-->
<form method="post"
action="cancscel.asp">
<p><br>
<b>Cerca il titolo del libro da
cancellare:</b>
<input type="text"
name="tit"><br>
<!— Con input type=hidden inviamo il valore della
variabile pass alla pagina chiamata dal form, ovvero cancscel.asp -->
<input type=hidden name="pass"
value=<%=pass%>>
<input type="submit"
name="vai" value="Cerca">
</form>
</center>
</body>
</html>
<%end if
rem Diamo ora la possibilità di cambiare la password
da web.
if s="cambia=Cambia+Password&pass=ok"
then
sql="select * from tablibri"
Set OBJdbConnection =
Server.CreateObject("ADODB.Connection")
OBJdbConnection.Open "driver={Microsoft Access
Driver (*.mdb)};dbq=c:\inetpub\wwwroot\domini\italystore\libri\
libri.mdb"
Set RS=OBJdbConnection.Execute(sql)%>
<html>
<head>
<title>Modifica- by
Italystore.com</title>
</head>
<body bgcolor="#FfFfff">
<br>
<!-- Come al solito c’è un piccolo form che manda
la nuova password al file update.asp, insieme alla variabile pass che contiene
il valore "ok". In questo modo si evita che qualcuno si colleghi
direttamente alla pagina update.asp senza autorizzazione.-->
<form method="post"
action="update.asp?id=<%=rs("id")%>">
Password:
<input type=text
name="upw"><br>
<input type=hidden name="pass"
value="ok">
<input type=submit value="Aggiorna">
</form>
</body>
</html>
<%end if
%>
Ciò che abbiamo fatto finora non è molto difficile;
anzi si poteva evitare chiedendo all’amministratore di sistema di proteggere le
pagine tramite una password da server. La soluzione scelta, però, ha il
vantaggio di rendere indipendente il sito dall’amministratore e di rimettere
nelle vostre mani la decisione su chi debba accedere alle pagine rilevanti,
consentendovi inoltre di modificare i parametri in tempo reale.
Ora passiamo a dare un’occhiata da vicino al file
canc.asp che si occupa di cancellare i record dal database; nelle prossime
lezioni approfondiremo le altre operazioni rese possibili da questo file.
Prima, però, diamo uno sguardo al cancscel.asp:
CANCSCEL.ASP:
<html>
<head>
<title>Modifica- by
Italystore.com</title>
</head>
<body bgcolor="#FfFfff">
<%
rem Solita richiesta della variabile pass per
verificare che siamo autorizzati ad eseguire
rem questo script
pass=request.form("pass")
if pass="ok" then
rem Viene passato anche il valore di tit e inserito
in una variabile chiamata tit
tit=request.form("tit")
rem Si analizza il contenuto di tit: se essa è vuota
allora assumerà il valore "%", che significa rem "tutti" e
consente di visualizzare il contenuto di tutta la base dati.
if tit="" then tit="%"
sql="select * from tablibri where titolo like
'%"&tit&"%'"
Set OBJdbConnection = Server.CreateObject("ADODB.Connection")
OBJdbConnection.Open "driver={Microsoft Access
Driver (*.mdb)};dbq=c:\inetpub\wwwroot\domini\italystore\libri\
libri.mdb"
Set RS=OBJdbConnection.Execute(sql)%>
<%
response.write
("<center><h2>Articoli Presenti</h2><br><br><table
border=1><tr><td>Art. da
Cancellare</td><td>Autore</td><td
align=center>Titolo</td><td>Editrice</td><td>Prezzo</td><td>
Cat.</td><td
align=center>Anno</td></tr>") %>
<%Do while NOT RS.EOF%>
<TR>
<td>
<!—Nella prima cella della tabella inseriamo un
piccolo form che chiama il file canc.asp passandogli il valore, inserito nella
variabile c, del campo ID del record. Insomma, indichiamo quale dei record deve
essere cancellato. Nella prima cella apparirà un tasto con etichetta
"Cancella" il quale, se premuto, effettuerà la cancellazione del
record. -->
<form method=post
action="canc.asp?c=<%=RS("ID")%>">
<input type="hidden"
name="pass" value="<%=pass%>">
<input type="hidden"
name="tit" value="<%=tit%>">
<input type="submit"
name="Cancella" value="Cancella">
</form>
</td>
<TD><%=RS("autore")%></TD>
<td><%=RS("titolo")%></td>
<td><%=RS("editrice")%></td>
<td>
<%=RS("prezzo")%>
</td>
<td><%=RS("cat")%></td>
<td><%=RS("anno")%></td>
</TR>
<%RS.MoveNext
Loop
RS.Close
OBJdbConnection.Close
%>
</table><br>
<form method=post
action="modifiche.asp">
<input type=hidden name="pass"
value="ok">
<input type=submit name="back"
value="Torna al menu di gestione">
</form>
<br>
</center>
</body>
</html>
<%else
rem Nel caso in cui il valore di pass sia diverso da
"ok", significa che stiamo tentando di usare rem il file cancscel.asp
senza essere passati attraverso la richiesta di password iniziale.
response.write "<h1>Accesso Negato
!</h1>"
end if
%>
Adesso abbiamo a video una tabella di uno o più
libri, contenete nella prima colonna un tasto con etichetta
"CANCELLA"; se premiamo il pulsante eseguiremo il file canc.asp, che
eliminerà il record corrispondente al libro.
CANC.ASP:
<%
rem Come sempre prendiamo i valori di tit e di pass
dal file precedente cancscel.asp
tit=request.form("tit")
pass=request.form("pass")
rem Solita verifica di autorizzazione
if pass="ok" then
rem La variabile canc prende il suo valore dalla
variabile c sulla stringa di comando.
rem C contiene il valore del campo contatore ID che
identifica univocamente il record nel
rem database
canc=request.querystring("c")
%>
<html>
<head>
<title>Cancella - by
Italystore.com</title>
<body bgcolor="#FfFfff">
<%
rem Cancella i record selezionati
Set OBJdbConnection2 =
Server.CreateObject("ADODB.Connection")
OBJdbConnection2.Open "driver={Microsoft Access
Driver (*.mdb)};dbq=c:\inetpub\wwwroot\domini\italystore\
libri\libri.mdb"
rem L’unica rispetto al motore di ricerca è nella
stringa di comandi sql. Infatti, al posto
rem di "Select" abbiamo
"Delete", che significa "cancella". L’espressione sql
tradotta
rem in italiano significa quindi: "Cancella
tutti i campi della tabella tablibri in cui il campo
rem contatore ID è uguale al valore contenuto nella
variabile canc"
sql="Delete * from tablibri where
ID="&canc
Set RS2=OBJdbConnection2.Execute(sql)
OBJdbConnection2.close
rem Dopo l’operazione di cancellazione viene
visualizzato un messaggio esplicativo e viene
rem data la possibilità di tornare indietro alla
pagina cancsel.asp tramite un form.
rem Abbiamo scelto di usare un form e non un link
perché in questo modo possiamo passare i rem valori di pass e tit al file
cancscel.asp.
%>
<H2>CANCELLAZIONE EFFETTUATA!</H2>
<br>
<form method=post
action="cancscel.asp">
<input type="hidden"
name="tit" value="<%=tit%>">
<input type="hidden"
name="pass" value="ok">
<input type="submit"
name="goon" value="Continua a cancellare">
</form>
</body>
</html>
<% else
rem Se pass è diverso da "ok"
response.write "<h1>Non sei autorizzato a
cancellare !</h1>"
end if %>
Siamo arrivati alla fine. Vi sembra tutto un po’
lungo e complicato? A dire il vero, l’unica parte davvero ostica è
rappresentata dalle pagine di raccordo tra le scelte da effettuare
(password,cancella, aggiorna, ecc.) e l’esecuzione dei file asp Il resto è
tutto sommato semplice: il vero strumento per cancellare i record è costituito
dai due file canscel.asp e canc.asp; inoltre quest’ultimo file è una versione
modificata del motori di ricerca, già visto nelle precedenti lezioni.
Ora è tempo di concludere questa puntata e lasciarvi
sperimentare il nuovo codice che abbiamo appena esaminato. Nel prossimo numero
vedremo come inserire nuovi record nel database e impareremo qualche altro
comando asp. Alla prossima allora!
Corso di ASP
Parte sesta
--------------------------------------------------------------------------------
Continua il nostro viaggio nell’affascinante mondo
degli ASP (Active Server Pages) di Microsoft.
Nell’ultima lezione abbiamo visto come cancellare
dei records di un database residente sul server, tramite web, oggi vedremo come
aggiornare ed aggiungere dei record.
Con quest’ultime due funzioni abbiamo completato
l’insieme dei mezzi per gestire un database remoto, sarà compito vostro creare
una pagina dalla quale poter scegliere che tipo di operazioni fare.
Naturalmente questa pagina sarà accessibile solo ai
possessori di password autorizzata, altrimenti chiunque potrebbe commettere
chissà quali nefandezze sulla vostra base di dati.
La scorsa puntata abbiamo visto che una volta
immessa una password nel form in html, essa viene confrontata con quella
presente nel database della password, se le due combaciano allora si entra nella
pagina dalla quale si possono compiere le operazioni di cancellazione ed
aggiunta di record nel database dei libri (libri.mdb) altrimenti si torna all'
home page.
Vediamo come si aggiorna un record, nello specifico
vediamo come facciamo a cambiare la nostra password on-line.
Se dalla pagina modifiche.asp clicchiamo su AGGIORNA
PASSWORD, allora viene lanciato il file Update.asp:
Update.asp
<%
REM solita procedura di controllo della variabile
pass per vedere se contiene il valore "ok" altrimenti non si esegue
il codice di update.asp
pass=request.form("pass")
if pass="ok" then%>
<HTML>
<HEAD>
<TITLE>Agiiorna il Database</TITLE>
</HEAD>
<BODY background="sfondo.gif"
BGCOLOR="#C0C0C0" TEXT="#0F0000" LINK="#0000FF"
ALINK="#0000CC" VLINK="#0000FF">
<%
REM la upw assume il valore del campo di tipo text
col name="upw" che sarebbe la nuova password che desidero usare
upw=request.form("upw")
rem solita procedura di connessione al database di
nome pass.mdb.
Set OBJdbConnection = Server.CreateObject("ADODB.Connection")
OBJdbConnection.Open "driver={Microsoft Access
Driver (*.mdb)};dbq=c:\inetpub\wwwroot\domini\italystore\libri
\pass.mdb"
REM qui c’è la novità l’istruzione sql (Structured
Query Language) Update, che serve appunto ad aggiornare un record.
sql="update pass set
pw='"&upw&"' where
id="&request.querystring("id")
REM commentiamola: "Aggiorna la tabella pass
(del db pass.mdb) poni il campo pw uguale al valore contenuto in upw dove il
campo id è uguale al valore della variabile id mandata sulla stringa di comando
dal form.
Set RS=OBJdbConnection.Execute(sql)
rem esegue l’istruzione sql
OBJdbConnection.Close
%>
<center>
<h2>Database Password Aggiornato !</h2>
premi back per tornare indietro !
</CENTER>
</BODY>
</HTML>
<%
REM se pass fosse stato diverso da "ok"
allora veniva fuori questa scritta !
else
response.write "<h1>Accesso Negato
!</h1>"
end if%>
Naturalmente il sistema di "aggiornamento"
del record può essere esteso anche a più campi e a più records, ad esempio potremmo
aggiornare i campi prezzo e quantità dei record di un database di articoli del
nostro magazzino.
Ma oltre l’aggiornamento il sistema di gestione
remota di un database deve poter anche aggiungere dei records e allora:
Add.asp
<%
pass=request.form("pass")
if pass="ok" then%>
<HTML>
<HEAD>
<TITLE>Il Database</TITLE>
</HEAD>
<BODY background="sfondo.gif"
BGCOLOR="#C0C0C0" TEXT="#0F0000" LINK="#0000FF"
ALINK="#0000CC" VLINK="#0000FF">
<%
REM solito sistema per caricare i valori delle
variabili inviate dal form.
titolo=request.form("titolo")
autore=request.form("autore")
cat=request.form("cat")
ed=request.form("ed")
anno=request.form("anno")
prezzo=request.form("prezzo")
collana=request.form("collana")
pagine=request.form("pagine")
testo=request.form("testo")
imm=request.form("imm")
REM una serie di if che controllano se i campi sono
vuoti, per esempio di un libro potremmo avere solo il titolo e l’autore a
questo punto gli altri campi devono assumere dei valori fittizi come il
"-" o lo "0" (per quelli numerici)
if titolo="" then titolo="-"
if autore="" then autore="-"
if ed="" then ed="-"
if cat="" then cat="-"
if anno="" then anno=0
if prezzo="" then prezzo=0
if collana="" then collana="-"
if pagine="" then pagine="-"
if imm="" then imm="-"
if testo="" then testo="-"
rem solita procedura di connessione al database
libri.mdb
Set OBJdbConnection =
Server.CreateObject("ADODB.Connection")
OBJdbConnection.Open "driver={Microsoft Access
Driver (*.mdb)};dbq=c:\inetpub\wwwroot\domini\italystore\libri
\libri.mdb"
REM qui c’è la novità, infatti pongo la variabile RS
come oggetto Recordset.
L’oggetto Recordset si usa per creare un set di
records, appunto un insieme di record sul quale lavorare.
L’oggetto Recordset è "l’officina" di ADO
(Active Data Object) (ne abbiamo parlato nelle scorse lezioni), cioè il posto
in cui sono eseguite quasi tutte le attività di gestione del database.
RS diventa un’istanza dell’oggetto Recordset quindi
può usufruire del metodo Open.
Open apre la tabella "tablibri", sulla
connessione OBJdbConnection (definita in precedenza), i numeri 3,3 che seguono
rappresentano rispettivamente:
il CursorType
il LockType
Il CursorType definisce il tipo di
"cursore", il quale è una rappresentazione dei dati (records) e
definisce anche il tipo di viste possibili su di essi.
I tipi di cursori sono di 4 tipi:
Cursore di default valore:0 è come un cursore
statico ad eccezione del fatto che permette solo spostamenti in avanti e non
indietro, poiché questo cursore non deve tener traccia dei record aggiunti,
modificati o cancellati da atri utenti.
Cursore Keyset valore: 1 possono vedere le modifiche
apportate da altri utenti, nonché spostarsi tra i record in avanti ed indietro.
Non possono vedere i record aggiunti o cancellati da gli altri utenti.
Cursori Dinamici valore:2 possono vedere qualsiasi
cosa: modifiche, aggiunte e cancellazioni fatte da altri utenti. Supportano,
inoltre tutti gli spostamenti.
Cursori Statici valore: 3 permettono gli spostamenti
in avanti ed indietro. Non sono in grado di rilevare le modifiche ai dati
apportate da altri utenti.
Il valore di LockType (o di BLOCCO) determina che
tipo di blocco il fornitore di dati DBMS (Data Base Management System), ossia
il database realizzato con Access (libri.mdb), deve usare quando si apre un
Recordset, questo ai fini del controllo di concorrenza sugli accessi ai dati da
parte di più utenti contemporaneamente.
Per definizione le applicazioni client/server
implicano che più di una persona può accedere contemporaneamente ad un
database, questa caratteristica è chiamata concorrenza.
Per un accesso concorrente ci deve essere un
deposito al quale più utenti accedano per leggere e cambiare i dati.
Ciò significa che il DBMS deve garantire l’accuratezza
dei dati memorizzati e per gestire in modo efficiente un accesso concorrente ai
dati, è necessario fronteggiare un altro problema, che è chiamato interferenza.
L’interferenza è quel fenomeno che accade quando due
fenomeni della stessa natura si sovrappongono causando un disturbo reciproco,
questo principio è facilmente estensibile all’azione di due utenti che stiano
compiendo la stessa operazione sullo stesso record di un database.
Per evitare l’interferenza esistono le opzioni di
blocco:
adLockReadOnly valore: 1 i dati si possono soltanto
leggere.
AdLockPessimistic valore: 2 i dati sono bloccati
appena qualcuno comincia ad effettuare operazioni di modifica, così da
mantenere un’integrità assoluta dei dati, ma con spiacevoli rallentamenti del sistema,
infatti finché l’utente non finisce le sue modifiche quei dati sono bloccati.
Il blocco pessimistico ha il vantaggio di essere molto sicuro, specialmente su
sistemi come Internet, che ha la possibilità di far accedere tantissimi utenti
contemporaneamente, ma ha lo svantaggio di creare parecchie difficoltà su
Internet proprio perché qualche utente potrebbe andare a pranzo e lasciare i
records bloccati, oppure i rallentamenti della rete causerebbero un blocco
abbastanza lungo nel tempo ecc. ecc.
AdLockOptimistic valore: 3 il blocco ottimistico
crea un buffer temporaneo in cui vengono conservati gli aggiornamenti e le
modifiche sui dati, mentre i dati originali sono ancora accessibili agli altri
utenti, quando si lancia un comando di aggiornamento (Update) allora i dati
vengono bloccati e appena finito l’aggiornamento il blocco viene rilasciato.
Set
RS=Server.CreateObject("ADODB.Recordset")
RS.Open "tablibri",OBJdbConnection,3,3
REM Usiamo il metodo AddNew per immettere il valore
della variabile titolo nel campo "titolo" del database, il valore
della variabile autore nel campo "autore", e così via per tutti gli
altri.
RS.AddNew
rs("titolo")=titolo
rs("autore")=autore
rs("cat")=cat
rs("editrice")=ed
rs("anno")=anno
rs("prezzo")=prezzo
rs("collana")=collana
rs("pagine")=pagine
rs("testo")=testo
rs("imm")=imm
REM dopo aver caricato i valori delle variabili
lanciamo il metodo Update (dato che abbiamo usato il blocco ottimistico) che
serve a bloccare i dati fino a quando non finisce l’aggiornamento.
rs.update
REM a questo punto chiudiamo la connessione col
database e l’apertura del recordset.
RS.Close
OBJdbConnection.Close
%>
<center>
<h2>Database Aggiornato !</h2>
premi back per tornare indietro !
</CENTER>
</BODY>
</HTML>
<% else
response.write "<h1>Accesso
Negato!</h1>"
end if%>
Riepilogando in queste lezioni abbiamo visto:
I comandi basilari dell’ASP (Active Server Pages)
Un gestore di feedback form.
La realizzazione di un motore di ricerca.
La costruzione dinamica di una pagina html
Come cancellare dei records da un database via web
L’aggiornamento e l’aggiunta dei dati di un database
via web.
Utilizzando questi mezzi si possono inventare e
implementare tantissime applicazioni utili e carine, senza spendere !
Potete realizzare motori di ricerca, shopping cart
per il commercio elettronico, bacheche su web gestite automaticamente, web
chat, ecc. ecc.
Alcuni esempi (realizzati dal sottoscritto):
http://www.italystore.com/annunci (inserimento e
lettura di annunci economici)
http://www.giroscopio.com/racconti (inserimento e
lettura di racconti)
http://www.giroscopio.com (motore di ricerca)
http://www.italystore.com (shopping cart)
I mezzi sono quelli che vi ho dato manca ancora un
ultimo ingrediente per realizzare quasi tutto: session.sessionId.
L’oggetto session con il suo metodo sessionId
permette di assegnare ad ogni browser un numero univoco (come un cookie),
quindi se in un listato asp scrivo:
<% x=session.sessionid %>
e poi vado a scrivere il valore della variabile x in
un campo (es. il campo "user") di un database, ovviamente potrò
"personalizzare" alcuni records di quel database.
Questo è molto utile ad esempio nella realizzazione
di uno shopping cart (carrello per gli acquisti elettronici), infatti quando un
cliente sta leggendo dal database i suoi acquisti non sta facendo altro che
leggere tutti i records che hanno nel campo "user" il suo numero
session.sessionid.
È intuitivo che se ci sono due clienti
contemporaneamente uno non vedrà gli acquisti dell’altro proprio perché ognuno
leggerà i suoi records personali.
La stringa sql sarà: "select * from
tabella_acquisti where user="&x
e cioè leggi dalla tabella_acquisti del database
tutti i records che hanno il valore di x nel campo user.
Facile vero ? No ? Bè con un po’ d’impegno lo
diventerà….ah chiaramente vi consiglio l’acquisto di un buon libro sugli asp.
Buona Fortuna e buon lavoro !