INTERAGIRE CON IL WEB CON ASP Introduzione Supponiamo di creare un sito il cui scopo è quello di presentare un catalogo di prodotti, il tutto con il solo ausilio dell’HTML. Cominciamo a classificare i prodotti in categorie, ogni categoria in sottocategorie e così via, per finire ai prodotti. Per facilitare la navigazione creiamo tante pagine quante sono i prodotti e quante le categorie e le sotto-categorie. Risultato: abbiamo un’infinità di pagine e l’utente è costretto a passare di pagina in pagina per raffinare la sua ricerca. D'altronde l’altra alternativa è quella di raggruppare tutti i prodotti in un’unica pagina, a discapito sempre dell’utente che adesso non viene per niente guidato nella sua ricerca. Perché l’utente possa interagire con il Web più efficientemente, dovremo adottare un sistema in grado di interfacciarsi con un database e creare le pagine Web "al volo". In altre parole, quando il navigatore visita il nostro catalogo on-line, deve trovare un form HTML che gli consenta di effettuare una selezione sui prodotti del catalogo e di inviare la sua richiesta al server Web, il quale crea "al volo" una pagina HTML con la scheda del prodotto. Qui parleremo di due tecniche (molto diverse tra loro) in grado di realizzare questa interazione dinamica: Script CGI (basata sull’interfaccia Common Gateway Interface) e Active Server Pages. Script Server-side e Web-side: Per script si intende un programma che realizza un’interazione tra il Web e il navigatore. I linguaggi di programmazione script più diffusi sono il Perl, C/C++, Java, JavaScript e VBScript e si distinguono in Web-page (o client-side) e in server-side a seconda che lo script risiede sul computer client oppure sul server. Quando un’utente invoca uno script server-side, il computer sul quale risiede il server Web esegue lo script che interagisce con il client. Uno script Web-page (solitamente scritto in JavaScript, VBScript), invece, è uno script le cui istruzioni risiedono all’interno delle istruzioni HTML che formano la pagina Web, quindi è il computer client ad eseguirlo. CGI: è l’acronimo di Common Gateway Interface) ed è uno standard che specifica l’interfaccia tra browser e server Web. In altre parole esso specifica il formato dei dati che si scambiano il browser e i server Web attraverso il protocollo di trasmissione HTTP. Uno script CGI è quindi un programma (solitamente scritto in Perl) che elabora l’input dell’utente e crea eventualmente la risposta generando una pagina HTML. L’input avviene trasmettendo il form HTML, quindi il browser invia i dati del form al server Web (secondo lo standard CGI) e quest’ultimo esegue lo script il quale elabora i dati ricevuti (ad es. inserendoli in un database, spedendoli via e-mail ad un indirizzo specificato o generando semplicemente una risposta attraverso una pagina HTML) ASP: è l’acronimo di Active Server Pages) ed è una tecnologia in grado di realizzare un’interazione tra l’utente e il Web attraverso la generazione dinamica di pagine HTML. Per scrivere le nostre pagine .asp possiamo usare un qualsiasi linguaggio di scripting (generalmente JavaScript e VBScript) – gli esempi riportati sono tutti in VBScript. Naturalmente non sussite alcun problema di compatibilità con il tipo di browser dell’utente perché ASP è server-side. Con ASP si è in grado di interfacciarsi via Web con un database relazionale come Access o SQLServer o in generale con una fonte dati ODBC, sfruttando il potente linguaggio di interrogazione SQL. Con ASP è possibile anche usare componenti ActiveX. Per poter usare ASP occorre avere un server Web Microsoft: Microsoft Internet Informatin Server (Ms IIS) (che include ASP a partire dalla versione 3.0) per Windows NT oppure Personal Web Server per Windows 95/98. Un’alternativa alla Microsoft è rappresentato dalla Chili!Soft che ha prodotto Chili!ASP in grado di girare su moltissime piattaforme (tra cui Windows NT e in un prossimo futuro LINUX). Purtroppo però, a differenza dei primi due, Chili!ASP non è freeweare! Configurare Microsoft IIS per Active Server Pages Al momento è disponibile la versione 4.0 di Windows NT con la versione più aggiornata di ASP, per la quale occorre aver installato (in ordine) NT 4.0 Service Pack 3, Internet Explorer 4.01 e NT 4.0 Option Pack. Si consiglia comunque di visitare il sito della Microsoft all’indirizzo: Microsoft dove è possibile scaricare NT 4.0 Option Pack e leggere attentamente i requisiti Hardware e Software per l’installazione. La prima cosa da fare è la creazione di una directory in cui creare una nuova directory premendo il tasto destro del mouse su Default Web Site e scegliendo New, Virtual Directory dal menù di scelta rapida. WindowsNT 4.0 Option Pack). Una volta lanciato: aprire la cartella Internet Information Server e poi la cartella Default Web Site creare una nuova directory premendo il tasto destro del mouse su Default Web Site e scegliendo new, Virtual Directory dal menù di scelta rapida. a questo punto compare una nuova finestra. Digitare il nome che si vuole assegnare al nuovo sito (il quale sarà utilizzato dagli utenti per accedere al sito) e premere il tasto next. Nella nuova finestra occorre definire la cartella fisica nella quale si desidera posizionare l’applicazione. Fare click su next. la nuova finestra ci permette di definire i livelli di accesso degli utenti alla nuova directory. Per rendere eseguibile ASP in questa directory basta selezionare Allow Script Access. Premere il tasto finish e avete terminato. Configurare PWS (Personal Web Server) Personal Web Server 4.0 è la versione ridotta di IIS 4.0 per Windows 95/98 e WindowsNT Workstation. Unico requisito software per l’installazione di PWS è IE 4.01 (o successivo). Per la configurazione non ci sono istruzioni particolari da seguire. La cartella di default \Inetpub\wwwroot è già configurata per gli .asp, quindi si può iniziare ad usare questa per le nostre prove. Nel caso in cui si voglia aggiungere un nuovo sito virtuale, si lanci Gestore del Sito Web Personale contenuto nel gruppo di programmi Internet Explorer -> Personal Web Server. Una volta lanciato: fare click su Impostazioni Avanzate, quindi su Aggiungi si apre una nuova finestra in cui scriviamo il percorso della cartella che ospiterà fisicamente il nostro nuovo sito, il nome del sito virtuale, e i permessi di accesso (Script deve essere selezionato) premere ok e abbiamo finito La nostra prima pagina potrà avere come nome Default.htm o Default.asp o quasiasi altro nome noi specifichiamo in Documenti predefiniti (presente sempre in Impostazioni Avanzate). A quest’indirizzo è possibile scaricare l’Option Pack che contiene PWS per Win95/98: http://www.microsoft.com/ntserver/nts/downloads/recommended/NT4OptPk/ Con che linguaggio scrivere gli ASP Si è già detto che gli script ASP sono server-side, ma dove sono situati? A differenza degli script CGI essi si trovano all’interno delle pagine HTML (a cui viene però data l’estensione .asp per essere riconosciti dal server Web) delimitati dai segni di maggiore e minore insieme al segno di percentuale: <html> <head></head> <body> <% ‘qui saranno ospitate le istruzioni ASP %> </body> </html> Naturalmente dal lato client non saranno visibili le linee di codice ASP, bensì la traduzione che il server Web effettuerà di esse in formato HTML. Analizziamo adesso due oggetti fondamentali per l’uso di ASP: Response e Request. Response gestisce il flusso di dati dal server verso il client. In particolare, attraverso il metodo Write consente l’output delle nostre eleborazioni in formato HTML. <% Var = "Esempio" Request.Write (Var) %> Request gestisce invece il flusso di dati nel senso inverso, dal client al server. Attraverso il metodo Form possiamo catturare i dati inviati con un form HTML, mentre con il metodo QueryString le variabili inviate con i collegamenti ipertestuali (quelli che compaiono a destra del punto interrogativo (?), ad es. <href="Dettagli.asp?Nome=Gino">) <% Request.Form ("Nome") Request.Form ("Cognome") Request.QueryString ("Nome") %> Session L’oggetto Session permette di istanziare delle variabili per ogni utente (ovvero per ogni browser che accede alla pagina .asp) le quali saranno attive per un tempo specifico, per impostare il quale scriviamo: <% Session.timeout=30 %> Questa istruzione manterrà "in vita" le nostre session per 30 minuti. Perché gli oggetti Session funzionino occorre che sul browser client siano attivi i Cookies perché è proprio di un Cookies che fa uso la Session per memorizzare i dati. Per istanziare una variabile Session e poi usarla: <% Session(nome_session)=valore For i=1 to Session(nome_session) do Next %> Accesso ai Database (DSN e DSN-Less, i Cursori e i Lock) Per accedere ai dati di un database attraverso ASP occorre creare un’istanza di un’oggetto Connection e poi di un’oggetto Recordset di ActiveX Data Objects attraverso il metodo CreateObject dell’oggetto Server. Possiamo interfacciarci con una fonte dati ODBC utilizzando un DSN oppure usando una stringa di connessione che specifica tutte le informazioni necessarie per la connesione (compreso il driver ODBC utilizzato). Esempio di connessione DSN-Less: <% path="d:\root\web\esempio" name="esempio.mdb" StringaDiConnessione="DBQ=" & path & "/" & name & "; Driver={Microsoft Access Driver (*.mdb)};" set conn=Server.CreateObject("ADODB.Connection") conn.Open StringaDiConnessione set rs = Server.CreateObject ("ADODB.Recordset") rs.Open "SELECT * FROM Clienti", conn, 3, 3 rs.Close ‘per chiudere il recordset conn.close ‘per chidere la connessione %> Esempio di connessione DSN: <% set conn=Server.CreateObject("ADODB.Connection") conn.Open "DSNName" ‘DSNName è il nome del DSN set rs = Server.CreateObject ("ADODB.Recordset") rs.Open "SELECT * FROM Clienti", conn, 3, 3 rs.Close ‘per chiudere il recordset conn.close ‘per chidere la connessione %> I numeri 3,3 presenti nel metodo Open del Recordset rs, rappresentano rispettivamente il CursorType e il LockType. Il CursorType definisce il tipo di "cursore" e può assumere i seguenti valori: 0 = (Cursore di default) permette solo spostamenti in avanti e non indietro 1 = (Cursore Keyset) 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. 2 = (Cursori Dinamici) possono vedere qualsiasi cosa: modifiche, aggiunte e cancellazioni fatte da altri utenti. Supportano, inoltre tutti gli spostamenti. 3 = (Cursori Statici) permettono gli spostamenti in avanti ed indietro. Non sono in grado di rilevare le modifiche ai dati apportate da altri utenti. Il LockType definisce il tipo di blocco sul Recordset aperto. Può assumere i seguenti valori: 1 = (adLockReadOnly) i dati si possono soltanto leggere. 2 = (adLockPessimistic) i dati sono bloccati appena qualcuno comincia ad effettuare operazioni di modifica. 3 = (adLockOptimistic) 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 N.B.: ODBC (Opend DataBase Connectivity) è una tecnologia che consente ad una applicazione sul lato client di connettersi ad un database remoto ignorando il tipo di database con cui si sta connettendo. In altre parole, ODBC, mediante la specificazione del driver del database remoto, fornisce un’interfaccia generica sul lato client. E’ possibile creare un DSN (Data Source Name) per ogni database remoto a cui ci vuol connettere specificando un nome che lo identifica univocamente sul client e naturalmente il driver del database (ad es: MS Access 97 Database o SQL Server). In questo modo possiamo far riferimento ad un database remoto attraverso il DSN specificato. Per creare un DSN usare l’utility ODBC nel Control Panel. Interrogare un Database Per interrogare il database dobbiamo formulare una query SQL ed aprire il recordset che si è precedentemente istanziato "sottoponendogli" la query (come si è già visto nel punto precedente). Per consentire al navigatore di inoltrare la sua richiesta di selezione (as esempio tutti i clienti il cui nome inizia con il carattere "P") è necessario creare una pagina HTML (o ASP) con un form HTML il cui attributo action fa riferimento alla pagina .asp che si vuole richiamare: <html> <form method=post action="myquery.asp"> Nome: <INPUT NAME=nome> <input type=submit value="Esegui Ricerca"> </form> </html> Myquery.asp: <html> <head></head> <body> <% set conn=Server.CreateObject("ADODB.Connection") conn.Open "DSNName" querySql = "Select * from Clienti where Nome =’" & Request.Form("Nome") & "’" ‘ se il tipo di dato fosse stato di tipo numerico avremmo omesso gli apici e la query ‘ sarebbe diventata: "Select * from Clienti where Nome =" & Request.Form("Nome") ‘ per ricercare tutti i clienti i cui nomi iniziano con la lettera/parola scritta, la query diventa: ‘ querySql = "Select * from Clienti where Nome LIKE ’" & Request.Form("Nome") & "%’" ‘ mentre se vogliamo i clienti i cui nomi contengono la lettera/parola scritta: ‘ querySql = "Select * from Clienti where Nome LIKE %’" & Request.Form("Nome") & "%’" set rs = Server.CreateObject ("ADODB.Recordset") rs.Open sql, conn, 3, 3 While not rs.EOF Response.Write (rs("Nome") Response.Write (rs("Indirizzo") Response.Write (rs("CodiceFiscale") .MoveNext Wend rs.Close conn.close %> </body> </html> Oltre che attraverso un form HTML, possiamo "passare" dati ad una pagina .asp anche attraverso parametri istanziati nel momento in cui il navigatore clicca su un collegamento ipertestuale. Possiamo così permettere di passare da una pagina .asp ad un’altra allo scopo di raffinare una ricerca. Nel nostro esempio, per visualizzare maggiori dettagli di un cliente, possiamo sostituire l’istruzione: Response.Write (rs("Nome")) (supponendo che il campo "Nome" rappresenti la chiave primaria della tabella "Clienti") con: Response.Write ("<a href=’myDettagli.asp?Nome=’) Response.Write (rs("Nome") ) & "’>" e nella pagina myDettagli.asp effettuare una query con la condizione: WHERE Nome=’" & Request.QueryString ("Nome") & "’" In questo modo selezioniamo quel cliente con il nome cercato e possiamo visualizzare poi tutti i dati del cliente trovato. Inserimento di dati in un Database Inseriamo adesso nell’archivio Clienti i dati introdotti dall’utente in un form HTML (il cui attributo Action sarà così impostato: action="myInserimento.asp"). Si tenga conto che il controllo della validità dei dati inseriti nel form (che viene ignorato nel seguente esempio) può essere effettuato in due modi diversi: dal lato-client, utilizzando degli script Web-page (scelta consigliata perché delega al client l’esecuzione di questa parte di codice "alleggerendo" così i compiti del server) e dal lato-server, sempre all’interno del codice ASP prima di effettuare l’inserimento. myInserimento.asp: <html> <head></head> <body> <% set conn=Server.CreateObject("ADODB.Connection") conn.Open "DSNName" set rs = Server.CreateObject ("ADODB.Recordset") rs.Open "Clienti", conn, 3, 3 rs.AddNew rs("Nome")=Request.Form("Nome") rs("Indirizzo")= Request.Form("Indirizzo") rs("CodiceFiscale ")= Request.Form("CodiceFiscale") rs.UpDate rs.Close conn.close %> </body> </html> Bibliografia (1) K. Jamsa, S. Lalani, S. Weakley -"Tutto Web”, McGraw Hill, 1997 (2) Jeffrey P. McManus - Visual Basic 6 (Accesso ai database) , Mondadori informatica, Marzo 1999