MokaByte Numero
32 - Luglio Agosto 99
|
|||
|
|
||
|
Ugo Chirico |
|
|
Una soluzione alternativa piuttosto interessante che mostra come realizzare, con un sistema alternativo ai classici client server, un motore per la generazione di contenuti dinamici |
La generazione
dinamica di pagine web rappresenta una delle funzionalità più
interessanti tra quelle fornite dai server HTTP. La Common Gateway Interface
(CGI) fu la prima tecnologia sviluppata. Molto diffuse sono le Active Server
Page (ASP) fornite dai server della Microsoft. Molto interessanti e davvero
flessibili ed eleganti sono le Servlet Java.
Tuttavia, sebbene abbiano delle caratteristiche che le contraddistinguono e che ne hanno determinato il successo, sono tutte strettamente legate alla piattaforma ed alle caratteristiche del server. Per le CGI è necessario avere un server che consenta l'esecuzione dello script in perl, o in un altro linguaggio interpretato dal server, o direttamente come file eseguibile. Per le ASP è necessario un server Microsoft o dei plug-in. Infine per eseguire le Servlet, sebbene il codice scritto in Java sia indipendente dalla piattaforma, è necessario installare sul server un servlet-engine. Così, anche quando il risultato che si vuole ottenere è davvero molto semplice, è necessario valutare tutti gli aspetti relativi alle caratteristiche della piattaforma e del server per scegliere la tecnologia migliore. Se poi malauguratamente il server non supporta nessuna delle tre tecnologie, come capita in quei provider che forniscono spazio web gratuito, non c'è soluzione. Quest'articolo si propone di presentare un'alternativa "leggera" alle suddette tecnologie che, se pur con delle limitazioni (altrimenti non sarebbe "leggera"), consenta la generazione dinamica di pagine web, tralasciando completamente gli aspetti relativi al server. A dimostrazione della tecnica si presenterà infine un motore di ricerca per siti web. L'idea di baseL'idea di base prevede un applet da inserire nella pagina contenente la form per l'immissione dei dati che determineranno la pagina da generare, poche righe di codice in JavaScript, ed eventualmente uno o più file, localizzati sul server dal quale è stata scaricata l'applet, da usare ad esempio come template per la pagina, o come semplice database contenente ulteriori informazioni da elaborare durante la generarazione della pagina (Figura 1).L'unica limitazione sta nell'impossibilità di creare ex-novo o di aggiornarne file sul server, limitazione imposta dal protocollo HTTP. Tuttavia, tale limitazione potrebbe essere superata qualora il server fornisse anche un servizio FTP.
Il paradigma
di computazione è il seguente: la form raccoglie i dati; il codice
JavaScript costruisce con essi la query e la passa all'applet chiamando
il metodo postQuery; quest'ultima elabora la query, legge il file di dati
sul server per prendere delle decisioni, legge eventualmente il template,
e costruisce con esso la nuova pagina inserendola in una stringa che restituisce
al chiamante; il codice JavaScript che riceve la pagina sottoforma di stringa,
provvede a costruire una nuova finestra scrivendo in essa la pagina generata
(Figura 1).
Implementazione di un LightServerDi seguito è riportata una possibile implementazione delle componenti necessarie a costruire un LightServer.Si mostreranno solo gli aspetti fondamentali, rimandando il lettore interessato ai file sorgenti allegati. Il codice è stato scritto seguendo le specifiche del JDK 1.02 per consentire l'esecuzione dell'applet anche nei browser della vecchia generazione. Classe LightServerLa classe LightServer è una classe astratta che implementa le funzionalità di base. È la base-class da cui derivare per costruire un server specializzato.public abstract class LightServer extends Applet
// Attributi del tag <body> della pagina risultante
// Query impostata nella pagina html
//
Questo è il metodo che deve essere riscritto nella classe derivata
La funzione getParmValue consente di estrarre dalla query il valore di uno dei parametri //
Interpreta la query e restituisce il valore del paramentro richiesto
Infine la funzione getGenericExceptionPage, chiamata in caso di errore imprevisto, genera una pagina che mostra l'eccezione occorsa. //
In caso di errore imprevisto costruisce una pagina contenente l'errore
La classe LightServerException implementa un eccezione prevista dal LightServer. public class LightServerException extends Exception //
Attributi del tag <body> della pagina risultante (vedi LightServer)
//
Costruttore
Il metodo getMessagePage, restituisce una pagina che specifica l'errore occorso. Per implementare una pagina di errore personalizzata è necessario derivare da essa e sovrascrivere il suddetto metodo. //
Genera una pagina contenente il messaggio dell'eccezione
return strPage;
Il codice JavaScript e la pagina HTMLIl codice JavaScript fa da collante tra l'applet, la form di immissione dati e la pagina risultante.Poichè i metodi di un applet possono essere invocati da JavaScript solo a caricamento avvenuto è necessario introdurre un controllo sul caricamento della pagina. La variabile bLoaded e la funzione loaded, invocata al verificarsi dell'evento onLoad del body, asservono a tale scopo. <body
bgcolor="#FFFFFF" onLoad="loaded();">
//
Invocato al verificarsi dell'evento onLoad del body
La funzione invokeServer costruisce la finestra che ospiterà la pagina risultante, invoca il metodo postQuery del LightServer e, al termine della computazione, scrive nella finestra la stringa contenente la pagina. // Invoca
l'applet passandogli la query
//
Genera la pagina dei risualtati
//
Estrae il documento
//
Scrive un messaggio di attesa
//
Invoca il Server
//
A computazione terminata cancella il messaggio di attesa
//
Scrive il risultato della query nella pagina
L'applet va inserita della pagina impostando i valori dei parametri richiesti <applet
--- eventuali altri parametri --- </applet> La form consente di raccogliere i dati necessari per costruire la query e di invocare il server alla pressione del tasto Submit <form
onSubmit="invokeServer('query=' + query.value)">
Un motore di ricercaA titolo di esempio, e per mostrare le potenzialità effettive del LightServer, è stato implementato un motore di ricerca per il web. Le prestazioni sono buone per siti di piccole e medie dimensioni, tuttavia non è stato ancora sperimentato in siti più grandi.Classe WebSearchServerLa classe WebSearchServer implementa il motore di ricerca.public class WebSearchServer extends LightServer La query deve essere nel formato "keyword=<keywords>". Supporta anche query formulate usando gli operatori logici AND e OR, rappresentati rispettivamente dai simboli '+' e '<spazio>'. Ad esempio sono valide le seguenti query: "keyword=pasta+fagioli" oppure "keyword=java game" Per la generazione della pagina dei risultati essa fa uso di un file di testo che rappresenta il database contenente le parole chiave relative alle pagine all'interno del sito e i riferimenti ad esse (il file index.txt in ne è un esempio). //
URL del database
In questa implementazione un record di tale database è composto da cinque campi separati da {CR+LF} e ha il seguente formato: URL della
pagina
Esempio: ./Italiano/SearchLibIta.html
A causa della
sua semplice struttura, il database può essere popolato agevolmente
a mano. Tuttavia, soprattutto quando il sito è di grandi dimensioni,
è consigliabile scrivere un piccolo robot che interpretando i tag
nelle pagine popola il database riempiendo opportunamente i campi.
//
Stream di input per la lettura del database
//
Inizializzazione. Legge il valore del parametro dell'applet "database"
// Legge la URL del database nel parametro "database"
Il metodo executeQuery,
implementa l'algoritmo per la scomposizione della query e per la ricerca
delle parole chiave richieste all'interno del database. Infine costruisce
la nuova pagina inserendo un item per ogni pagina trovata.
//
Implementa il l'algoritmo del server
// Apre il database
// Estrae dalla query il valore del parametro "keyword"
// Vettore contenente i risultati della ricerca
// Verifica eventuali operatori booleani '+' per AND e '<spazio>' per
OR
N.B. A causa della lunghezza e pesantezza del codice per la scomposizione della query e per la ricerca nel database al fine di popolare il vettore dei risultati, si rimanda al file sorgente allegato.
// L'applet prevede due parametri aggiuntivi "table" e "image" per
// URL dell'immagine
// Stringa contenente la pagina dei risultati
// Costruisce la pagina
// Inserisce nella pagina un item per ogni pagina trovata
}
// Termina la pagina dei risultati
return strPage;
La pagina HTML con la form per la ricerca La pagina HTML contenente la form per la ricerca deriva da quella presentata sopra. Di seguito sono riportate solo le parti di codice soggette a modifiche evidenziando in grassetto le variazioni apportate. function
invokeServer(strKeywords)
//
Genera la pagina dei risualtati
//
Estrae il documento
//
Scrive un messaggio di attesa
//
Invoca il Server
//
A computazione terminata cancella il messaggio di attesa
//
Scrive il risultato della query nella pagina
Nel tag relativo all'applet è necessario impostare i valori dei parametri <applet
La form prevede un campo text in cui inserire la parola da ricercare. <form
onSubmit="invokeServer('keyword=' + Keywords.value)">
(In allegato
è riportata l'implementazione di tutte le componenti pronta all'uso)
ConclusioniIl codice presentato è solo una tra le possibili implementazione della tecnica illustrata. Data la semplicità dell'idea esso può essere facilmente modificato per asservire ad esigenze particolari.L'esempio illustrato è stato testato con Netscape Navigator 4.5 e Internet Explorer 4.0. Date le sostanziali differenze tra i browser non è ipotizzabile che per versioni diverse siano necessarie delle modifiche nel codice JavaScript. Le limitazioni della tecnica illustrata sono imputabili alle restrizioni imposte dal protocollo HTTP che non consente la creazione ex-novo di file sul server o l'aggiornamento degli stessi. Qualora il server fornisca anche un servizio FTP, è ragionevole pensare che, mediante i comandi del protocollo, sia possibile creare e aggiornare file sul server. Tuttavia questa soluzione rimane sul piano puramente teorico in quanto non è stata ancora sperimentata. Il prossimo passo prevede l'estensione della tecnica proprio in questa direzione. |
|
||
|
||
MokaByte ricerca
nuovi collaboratori
|
||
|