MokaByte Numero 29  - Aprile 1999 
Java Servlet all’opera
di 
Lavinio Cerquetti
In collaborazione con Computer Programming


Istanze di pianificazione, implementazione, debug, amministrazione e caratteristiche dei Java Servlet. 
I serlvet dappertutto

In un qualsiasi colloquio tecnico è oramai impossibile non sentir nominare Java; ancora di più, nei discorsi con i colleghi si scopre ad un tratto che non esiste nessuno che non lo usi da sempre, o che non ne stia verificando la produttività. D’altro canto quando si parla della praticità di Java, i giudizi in merito si fanno tutt’altro che omogenei, e non è facile sentire opinioni assolutamente contrastanti sul suo valore, sul suo attuale spettro di utilizzo e sulle sue prospettive future. Forse, il problema è che in ogni valutazione di questa piattaforma si fondono questioni politiche e di principio che, per loro natura irrazionali, rischiano di impedire, o quantomeno di traviare, la possibilità di un giudizio obiettivo sulle sue capacità. 
Al di là di ogni opinione personale, infatti, appare evidente che nell’enorme marea di protocolli ed API associati al linguaggio della Sun sia possibile rintracciare due ‘anime’ distinte: l’utilizzo lato client - all’interno di Applet, o in applicazioni stand-alone - e l’utilizzo lato server, associato ai Servlet, agli Enterprise JavaBean, agli Agenti, alle API ed ai servizi di Transaction Management, agli Application Server ed ai protocolli di programmazione distribuita, primo fra tutti CORBA. 
Purtroppo, e nonostante una favorevolissima campagna d’opinione, gli insormontabili problemi di performance e di portabilità reale che affliggono le soluzioni Pure Java lato client (un discorso a parte va fatto per il recente Microsoft Visual J++, il cui intimo legame al mondo Windows permette di risolvere i problemi di prestazioni legati alla complessità di alcune librerie, come le Swing API) hanno impedito a questo linguaggio, almeno sino ad oggi, di affermarsi nel mondo desktop. 
La difficoltà di risolvere le questioni prettamente velocistiche e le eccessive richieste di risorse proprie di questo ambiente sono alla base del ritardo nel rilascio dell’ultima versione del Java Development Kit, e sono ormai così evidenti da aver convinto la Sun a rallentare la spinta di Java in questo settore ed a caratterizzarlo sempre più come una soluzione server-side, sino ad arrivare, si vocifera, alla realizzazione di un Server-only JDK.
Ora, se l’evoluzione di Java nel mondo desktop sta attraversando una fase di stallo, la situazione si presenta in maniera radicalmente opposta dal lato server, dove tutte quelle caratteristiche che ne rendono problematico l’utilizzo nel mondo client si trasformano invece in punti di forza addirittura cruciali. È infatti opinione di chi scrive, opinione confortata dal favore che il mercato sta riservando a questa tecnologia, che la sua dinamicità, interoperabilità, flessibilità, scalabilità e portabilità spicchino particolarmente nella realizzazione di soluzioni server-side, e che i Servlet combinino tutte queste virtù con una naturale semplicità di sviluppo veramente rara nell’informatica odierna.
Quest’affermazione per essere dimostrata richiederebbe un’attenta analisi dei diversi protocolli di interazione Web lato server, argomento che purtroppo esula dal tema di quest’articolo, ma che, in virtù del suo interesse e della sua attualità, ci ripromettiamo di affrontare nei prossimi numeri di questa rivista. 
Quello che invece tenteremo di fare in questa sede è fornire una casistica di problemi e soluzioni tipici del deployment di applicazioni Web basate su Servlet, tentando di mostrare quali scelte si nascondano dietro la realizzazione di un sito basato su queste tecnologie, nei diversi momenti della sua esistenza e della sua crescita. Dunque, il discorso non verterà sulle caratteristiche del protocollo e della sua programmazione: per un’introduzione a queste problematiche rimandiamo il lettore agli articoli già apparsi su questa stessa rivista ([1], [2]) e su MokaByte ([3]), oltre che alle risorse disponibili sul sito Sun ([4]). Ci limiteremo qui a ricordare, molto brevemente, che i Servlet sono degli oggetti Java eseguiti dai server Web in seguito ad una richiesta dell’utente, in grado di generare una normale pagina HTML da inviare al browser; essi sono dunque, dal punto di vista del client, in tutto e per tutto affini a degli script CGI. In particolare, l’uso dei Servlet non richiede un browser Java-enabled, dal momento che l’utilizzo di Java è esclusivamente confinato al server.
 
 

Il ruolo dei Servlet nelle scelte iniziali

La selezione del sistema operativo e del server Web cui demandare la gestione di un sito è tradizionalmente complicata e deve tener conto di differenti istanze, alcune delle quali in reciproca contraddizione:

  • l’ambiente prescelto deve essere sufficientemente conosciuto, in modo da rendere possibile il reperimento di programmatori ed amministratori dotati del relativo know-how e da non richiedere il retraining di quelli già disponibili;
  • lo stesso ambiente deve però essere tecnologicamente all’avanguardia e dotato di caratteristiche pari, se non superiori, alle offerte della concorrenza, in maniera da poter rispondere alle esigenze del cliente e garantirne la massima soddisfazione;
  • siti ad elevata interazione richiedono una stretta coesione tra applicazioni e Web server, costringendo all’utilizzo di API assolutamente non portabili e spesso di difficile utilizzo;
  • le API di comunicazione non sono, inoltre, l’unico fattore che precluda la portabilità delle applicazioni realizzate: oltre al dialogo con il server, i servizi Web richiedono un framework in grado di supportare funzionalità avanzate come il controllo delle sessioni, la comunicazione con database relazionali o ad oggetti, l’accesso a filesystem remoti e l’interoperabilità con servizi distribuiti in rete; 
  • d’altronde nel mercato odierno la scalabilità è un valore importante: è possibile, se non molto probabile, che lo stesso sito Web al crescere del numero di utenti richieda una conversione ad un altro ambiente o ad un differente Web server, cosa che, proprio per via dell’utilizzo spinto di API proprietarie, può richiedere la completa riscrittura delle applicazioni e l’adozione di un nuovo framework;
  • le scelte iniziali possono, nel mondo reale, rivelarsi sbagliate: si ricade così nel punto precedente, e per evitare la fatidica riscrittura si è costretti ad intervenire sulle altre componenti del sistema allo scopo di aumentarne le prestazioni, sbilanciandone l’architettura generale e nascondendo o ritardando l’insorgere dei problemi anziché risolverli.
Bene, queste istanze sono intrinsecamente risolte dall’architettura dei Servlet, che elimina alla radice l’intera problematica della "scelta di partenza" ed apre nuove frontiere allo stesso concetto di portabilità. 
Infatti, l’universalità dei Servlet non si limita solo alla loro comunicazione con il server Web (e quindi con l’utente) ma si estende anche a tutte le loro funzionalità, sotto forma di: 
  • sessioni, incapsulate nella classe javax.Servlet.http.HttpSession, la quale si avvale di un utilizzo ottimizzato e personalizzabile dei cookie; 
  • utilizzo di sorgenti di dati relazionali e non, tramite le librerie di classi JDBC ([5]);
  • interoperabilità estrema, basata sul supporto nativo per CORBA, RMI, Enterprise JavaBean, Agenti, serializzazione e caricamento dinamico di classi in rete;
  • pieno accesso a filesystem e socket, sia locali che remoti; 
  • garanzia totale di portabilità fornita dal linguaggio Java e dalle sue librerie di classi.
In effetti, con i Java Servlet è perfettamente possibile (e molto comune) utilizzare fin dalle fasi iniziali di  sviluppo diversi Web server sotto differenti sistemi operativi, per valutarne al meglio le performance e fornire al cliente, in ogni momento ed al crescere delle sue esigenze, la soluzione più valida ed efficiente. Parimenti, le caratteristiche di questo protocollo permettono di separare il sito di produzione da quello di sviluppo senza alcuno sforzo ulteriore in termini di programmazione, consentendo al personale tecnico di sfruttare gli ambienti più congeniali e funzionali per il loro lavoro: il tanto pubblicizzato slogan Java ‘write once, run everywhere’, che rappresenta ancora una chimera nel mondo desktop, è al contrario un’assoluta ed incontestabile realtà del mondo server.

Il supporto dei Servlet: implementazioni native e Java Servlet engine

La novità rappresentata dal protocollo Java Servlet - o per essere più precisi, il suo successo - ha colto di sorpresa diversi produttori di Web server, che non riuscendo ad adeguarsi con sufficiente velocità hanno di fatto aperto il mercato ad una nuova classe di prodotti, i Java Servlet engine. Si tratta di estensioni - spesso interamente gratuite - che implementano il meccanismo dei Servlet secondo le specifiche Sun. 
Quella che segue è una panoramica dei principali engine attualmente disponibili; ricordiamo ancora una volta che, dal punto di vista dei Servlet, non esistono differenze tra queste soluzioni, ed è possibile in ogni momento portare la propria applicazione sotto un altro server, un altro engine, e addirittura un altro sistema operativo:

  • LiveSoftware JRun Servlet engine ([6]): disponibile sotto Windows 95/NT, Unix e Macintosh, compatibile con i server Web Microsoft, Netscape ed Apache, e gratuito nella versione base, deve parte della sua fama all’endorsement ufficiale operato nei suoi confronti dalla Microsoft; la LiveSoftware è inoltre produttrice di un’intera linea di tool ed estensioni dedicati a questo protocollo della Sun, come un Web server interno - incluso nell’ultima versione di questo engine - che lo trasforma in una soluzione completa adatta ad ambienti di testing, un toolkit comprendente il supporto per le Java Server Pages (l’analogo delle pagine ASP nel mondo Java) e diversi tool mirati a facilitare lo sviluppo ed il debug dei Servlet;
  • IBM Servlet Express, oggi parte dell’IBM WebSphere Application Server ([7]): disponibile in licenza gratuita per lo sviluppo ed il debug sotto Windows NT, AIX e Solaris, e compatibile con i server IBM Domino, Microsoft, Netscape ed Apache; si tratta di un Servlet engine estremamente potente, dotato di un framework con estensioni proprietarie, dello stesso tool di amministrazione remota del Sun Java Web Server, di un’implementazione completa delle Java Server Pages, nonché del supporto nativo per il pooling degli accessi JDBC (una tecnica per ottimizzare l’utilizzo di connessioni multiple contemporanee alla medesima sorgente dati, in gran voga in architetture multithreaded come quella dei Servlet) e dell’interoperabilità CORBA; 

  •  

     

    New Atlanta ServletExec ([8]): disponibile sotto Unix, Windows e Macintosh, compatibile con i server Microsoft, Netscape ed Apache; nella sua ultima versione - ancora in beta al momento della stesura di quest’articolo - supporta le Java Server Pages; 

  • Apache JServ ([9]): Servlet engine per il server freeware Apache, disponibile sotto diverse piattaforme e leader incontrastato del mercato; 
  • ATG Dynamo Application Server ([10]): application Web server di fascia alta compatibile con i server Microsoft, Netscape ed Apache, disponibile sotto Solaris, AIX ed NT. 

  •  

     

    Inoltre, i Servlet sono ormai supportati in maniera nativa da un buon numero di server Web, tra i quali ricordiamo: 
    La prima implementazione dei Servlet, per così dire "di riferimento", effettuata dal Java Web Server originariamente noto come Jeeves ([11]) e giunto ormai alla versione 1.1.2, tra i cui punti di forza si segnala l’Applet di amministrazione remota realizzato in Java;

  • KonaSoft Enterprise Server ([12]): oltre ad una completa implementazione della Servlet API fornisce il supporto per una nuova categoria di oggetti Java eseguibili associati alle sorgenti dati JDBC, chiamati Proclets, lontanamente affini alle SQL stored procedure; 
  • O’Reilly WebSite ([13]): prodotto limitato alle piattaforme Microsoft, ma molto conosciuto ed apprezzato per l’alto numero di API, estensioni e protocolli supportati;
  • Zeus Web Server ([14]): disponibile per piattaforme Unix ed NT, è un server Web mission-critical; si segnala non solo per il supporto fornito ai Servlet ed alle altre soluzioni di interoperabilità Java (RMI, CORBA), ma anche per un insieme di funzionalità strettamente legate alla sua fascia di mercato, in particolar modo per quanto riguarda la gestione della sicurezza. 
  • Sono state volutamente omesse tutte le soluzioni a carattere sperimentale - come il server Jigsaw ([15]) realizzato dal consorzio W3C - o semplicemente troppo recenti per essere considerate realmente affidabili, come il Web Server Avenida ([16]). Infatti, non si è cercato di fornire l’elenco completo di tutte le attuali implementazioni del protocollo Servlet, ma solo di quelle la cui stabilità, facilità di amministrazione e scalabilità in ambienti di produzione sono ampiamente provati.
Fra tutti i motori Servlet disponibili per il mondo Windows, ritengo sia consigliabile il Servlet Express dell’IBM: è eccezionalmente stabile, possiede un front-end amministrativo tra i più completi, e le sue caratteristiche avanzate elencate in precedenza lo rendono una scelta vincente, in grado di seguire interamente lo sviluppo di un progetto a partire dalle sue esigenze iniziali sino alle richieste di una scalabilità più spinta.

Il framework standard e le estensioni di terze parti

Come si è visto le Servlet API implementano in maniera portabile i due meccanismi fondamentali della programmazione lato server, vale a dire il concetto di sessione - l’identificazione di una serie di richieste provenienti da un’unica coppia utente/browser - e l’accesso alle funzioni native di autenticazione fornite dal sistema operativo. Essi, insieme a tutte le rimanenti funzionalità fornite dall’ambiente run-time Java, realizzano un framework vasto e completo. Tuttavia è ragionevole pensare che applicazioni particolarmente complesse possano trarre dei benefici da strumenti ancora più avanzati, mirati all’ottimizzazione dell’attività dei Servlet in ambienti mission-critical. Tali strumenti sono disponibili agli sviluppatori attraverso librerie di classi aggiuntive implementate direttamente da alcuni Servlet engine, o disponibili sotto forma di prodotti di terze parti, e non risultano utili nelle iniziali fasi di sviluppo del sito, o nel deployment di soluzioni di fascia medio-bassa, ma rappresentano piuttosto un’importante arma nelle mani dei programmatori al crescere delle esigenze del cliente. Un notevole sforzo in questo senso è stato compiuto da IBM che, molto attenta all’evoluzione del mondo Java, ha incluso nel suo Servlet Express alcune estensioni di grande potenza ed utilità:

  • Un sistema di clustering delle sessioni (Session Tracker) mediante il quale è possibile distribuirne la gestione tra più server in maniera da bilanciare ed ottimizzare le perfomance in ambienti ad alto carico di lavoro; 
  • l’implementazione delle sessioni tramite un meccanismo alternativo (URL rewriting) che ne consente l’uso anche da parte di browser in cui il supporto per i cookie non sia presente o sia stato esplicitamente disattivato; 
  • il supporto per l’archiviazione ed il retrieving di profili utente persistenti e personalizzabili tramite una qualsiasi connessione JDBC;
  • un layer di astrazione all’accesso ai dati realizzato tramite JavaBean, che fornisce al programmatore un insieme di funzionalità avanzate; è vero che molte di esse sono state rese standard dalla stessa Sun nell’ultima versione della JDBC API, ma alcune caratteristiche, come il caching dei risultati delle interrogazioni SQL e la loro suddivisione in sottoinsiemi (subpackaging) rappresentano tutt’ora un qualcosa di unico; 
  • un completo meccanismo di pooling e condivisione delle connessioni JDBC, punto fondamentale nell’evoluzione di una soluzione Servlet nell’ottica della scalabilità.
Diverso è invece l’atteggiamento seguito dalla Live Software, che propone tramite un prodotto separato - il JRun Servlet Toolkit - un insieme di servizi aggiuntivi, quali il supporto per le Java Server Pages ed il pooling di connessioni JDBC, ed indirizza i suoi ulteriori sforzi di sviluppo non all’estensione del framework Servlet ma alla realizzazione di un insieme di strumenti destinati al testing ed alla verifica delle soluzioni realizzate tramite questo protocollo.
Tra i tool di terze parti si segnala anche la libreria DBToolsJ ([17]), realizzata dalla RogueWave. Come il nome lascia intendere, si tratta di un framework Java di connettività a database relazionali - basato a sua volta sul JDBC - che spicca per alcune caratteristiche che lo rendono estremamente adatto alla programmazione dei Servlet:
  • Gestione di cursori bidirezionali e di aggiornamento (comunque presenti anche nell’ultima versione del JDBC); 
  • accesso diretto alle SQL stored procedure; 
  • un design realmente orientato agli oggetti, che si traduce in un insieme di classi e metodi coerenti e di più facile utilizzo rispetto al framework Sun; 
  • supporto per i pool di connessioni a database; 
  • completa compatibilità con il JDBC;
  • implementazione interamente thread-safe;
  • piena portabilità in ogni ambiente ed in ogni server Web o Servlet engine.
Infine, nel tentativo di rendere l’idea della costante evoluzione di questo settore del mercato ricordiamo due progetti ancora in fieri: il Sun Java Server Engine ([18]), un’API che intende proporsi come implementazione standard di funzionalità avanzate legate alla gestione di connessioni, sicurezza ed interoperabilità multiprotocollo, ed il framework RSVP ([19]), mirato alla creazione di un ambiente di sviluppo per Servlet visuale ed interattivo basato su un set di classi Java comprendente funzionalità estese. Al momento della scrittura di quest’articolo, è in fase di realizzazione la nuova versione (denominata Platform 2), completamente riscritta per avvantaggiarsi delle funzionalità delle Java Server Pages e dell’imminente Java Servlet API 3.0.
In conclusione, l’uso delle estensioni esaminate si rivela realmente necessario solo in condizioni particolari, caratterizzate da applicazioni di una complessità superiore alla media o in siti soggetti ad un carico eccezionalmente alto, cosa che depone in favore della completezza e autosufficienza del framework standard. In tali situazioni sarà allora preferibile, di norma, utilizzare uno strumento indipendente dal Servlet engine sottostante allo scopo di non introdurre alcuna dipendenza o ostacolo alla portabilità del codice.
 
 

L’amministrazione dei Servlet

Al di là delle funzionalità aggiuntive di alcuni particolari ambienti (come il pooling di connessioni JDBC, o la possibilità di politiche personalizzate nel tracking delle sessioni) che richiedono passi specifici di configurazione, le linee guida da seguire nell’amministrazione dei Servlet engine sono comuni a tutte le implementazioni, esattamente come unico è il framework di base. Sia che i tool di gestione prendano la forma di servizi esterni, o che risultino inglobati nel Web server; sia che la loro esecuzione sia demandata ad un Applet Java sia che avvenga attraverso un software nativo, i due punti fondamentali nella customizzazione dei motori Servlet sono le procedure di sicurezza e la registrazione dei Servlet stessi. 
L’organizzazione dei permessi di accesso può, in funzione dei diversi engine, basarsi sulle User Access Control List native del sistema operativo, su un database di utenti e password parallelo o su una combinazione di questi due metodi. Qualunque sia la scelta effettuata occorrerà fornire alle procedure di amministrazione la topologia degli utenti e dei gruppi che dovranno avere accesso alle risorse condivise e, in particolare per quanto riguarda i Servlet, definire le operazioni cui essi risulteranno abilitati nei confronti del server Web che li istanzia ed esegue. Queste operazioni, differenziabili per lo stesso Servlet su base utente, sono suddivise in un numero di categorie funzionali che - seppur con nomi diversi - si equivalgono nella maggior parte degli ambienti visti in precedenza. Per la precisione, esse sono:

  • Load Servlet: permesso di caricamento ed esecuzione; 
  • Write files: permesso di accesso in scrittura ai filesystem locali del server; 
  • Listen to socket: permesso di interazione con socket locali al server; 
  • Link libraries: permesso di caricamento ed utilizzo di librerie dinamiche locali al server; 
  • Read files: permesso di accesso in lettura ai filesystem locali del server; 
  • Open remote socket: permesso di interazione con socket remoti; 
  • Execute programs: permesso di esecuzione di programmi locali al server; 
  • Access system properties: permesso di accesso alle proprietà di sistema (tramite la classe java.lang.System).
L’importanza dell’aspetto sicurezza in un progetto dipende grandemente dalle sue caratteristiche, il che impedisce di fornire dei consigli universalmente validi in materia. Ad ogni modo, se la sicurezza riveste un ruolo di primo piano nell’applicazione, consigliamo di ignorarne le istanze e lavorare con gli ampi permessi di default solo nelle primissime fasi dello sviluppo: infatti, è proprio affrontando la questione già dalle iniziali fasi di modellazione e codifica che si potranno garantire solidità e robustezza all’intero sistema.  Venendo al secondo punto, la registrazione dei Servlet fornisce all’engine le informazioni necessarie alla loro istanziazione e finalizzazione; in linea di massima, è possibile decidere se essi debbano venire caricati automaticamente al boot del server (early loading) o solo in seguito alla prima richiesta di accesso (lazy loading). La dinamicità del linguaggio Java permette anche di recuperarli da un qualsiasi punto della rete, riferendosi ai rispettivi file .class non tramite il loro pathname, ma direttamente sotto forma di URL. 
Inoltre è possibile specificare dei parametri di configurazione sotto forma di proprietà Java nella classica sintassi basata sulle coppie nome proprietà/valore. Per inciso, va detto che la registrazione di un Servlet non è sempre necessaria, in quanto alcuni engine ne permettono comunque l’utilizzo "sottintendendo" dei valori di configurazione di default. Un Servlet viene eseguito dagli utenti accedendo ad un URL della forma:
 

 http://www.nomeserver.it/Servlet/<nomeServlet>

Dove <nomeServlet> equivale esattamente al nome della classe del Servlet; l’accesso ad un URL di questo genere viene intercettato dall’engine, che "dietro le quinte" dialoga con il Servlet in maniera completamente trasparente all’utilizzatore, ritornandone l’output HTML al browser. In aggiunta - ed a patto di aver effettuato la procedura di registrazione - è possibile avvalersi di un meccanismo detto aliasing che consiste semplicemente nell’associare ad ogni Servlet uno o più URL addizionali del tipo:
 

 http://www.nomeServlet.it/<nome.html>

Questo meccanismo, supportato da ogni engine, permette - una volta convertita in Java una soluzione preesistente basata su un altro protocollo - di lasciarne invariata la modalità di accesso da parte dell’utenza. 
Infine, crediamo giusto citare un bug che si manifesta in quei tool che fanno uso delle classi Sun (contenute nel package com.sun.server.admin.toolkit) per la realizzazione dei loro front-end di amministrazione. Si tratta di un problema relativo al rendering di alcuni form dell’Applet di configurazione, che si verifica solo su macchine Windows configurate alla risoluzione di 640x480 pixel e che non è aggirabile, essendo indipendente dal browser e dalla versione del JDK. 
Le uniche soluzioni possibili sono cambiare la risoluzione dello schermo o rinunciare al tool integrato e procedere alla configurazione attraverso la modifica diretta dei relativi file.

 Il debug dei Servlet: consigli e strumenti

La prima osservazione da fare riguarda i Java Development Kit e le Java Virtual Machine. 
Essi sono disponibili in molteplici versioni, che non si differenziano solo per le API supportate ma, come avviene un po’ per tutti i moderni ambienti di sviluppo, anche per i diversi bug e problemi in essi presenti. Dunque, è necessario leggere attentamente la documentazione del proprio Servlet engine, e seguire i consigli in essa contenuti riguardo agli strumenti di run-time supportati: infatti è opportuno sapere, ad esempio, che tra le versioni 1.1.5 e 1.1.6 del JDK esistono realmente delle differenze e che altrettante ne esistono tra la Virtual Machine Sun e quella Microsoft, e che potrebbero essere proprio queste diversità il motivo di quei misteriosi crash nel vostro ultimo Servlet! In linea di massima ogni engine non solo specifica chiaramente le VM e i JDK supportati, ma spesso li include addirittura nella propria distribuzione. In questo caso raccomandiamo sempre di scaricarli dalla rete e di configurarli correttamente, perché il tempo perso in queste operazioni verrà ampiamente ripagato dal guadagno in solidità e affidabilità che ne deriva. 
Lo stesso principio vale ovviamente per i Servlet engine: nel momento in cui ci si accinge a sviluppare una nuova applicazione - specie se di una certa importanza - il suggerimento è di controllare l’ultima versione del motore prescelto, eventualmente procedendone all’aggiornamento. Così facendo vi assicurerete il supporto per le versioni più recenti del JDK e di tutte le API - incluse quelle dei Servlet stessi - ed eviterete i problemi di stabilità riscontrati nelle precedenti versioni di numerosi engine, problemi che si traducevano in frequenti ed inspiegabili crash. Al di là dei consigli pratici, di quali strumenti di debug possono avvalersi gli sviluppatori di Servlet? Innanzitutto, ogni programmatore ha bisogno di testare rapidamente le modifiche apportate al proprio codice: punto di forza, questo, delle soluzioni CGI basate su linguaggi interpretati (come il Perl) in cui è sufficiente un semplice click sul tasto Reload del proprio browser, ed iniziale motivo di critica nei confronti del protocollo Sun. 
Oggi la situazione è molto cambiata, ed i motori più evoluti - come l’IBM Servlet Express - verificano automaticamente che l’istanza in memoria del servlet sia aggiornata, ed in caso contrario provvedono a ricaricarlo da disco alla prima richiesta. Utilizzando ambienti più spartani è comunque sufficiente, prima di ricaricare la pagina del servlet, effettuarne l’unload dalla memoria dell’engine con il relativo tool di amministrazione, ed il server lo riinizializzerà al successivo accesso. In alternativa è possibile, specialmente nelle prime fasi del testing, eseguire i Servlet non all’interno di un Web server reale ma tramite un ambiente di esecuzione dedicato. Le scelte a disposizione in questo senso sono essenzialmente due:

  • Il tool a linea di comando servletrunner incluso nel Sun JDK; limitato sotto alcuni punti di vista - particolarmente nel supporto per le procedure di autenticazione e security - ma pur sempre una soluzione pratica e veloce;
  • il Servlet engine dedicato, incluso nell’Inprise JBuilder 2 ([20]), un importante ambiente di sviluppo visuale in Java orientato alla realizzazione di software Pure Java client/server; in particolare esso permette di operare all’interno dell’IDE durante tutto il ciclo di vita del Servlet, rendendone possibile il debug in maniera analoga ad ogni altra applicazione.
Diversi engine forniscono poi dei tool di analisi dell’attività del server e delle richieste degli utenti: ancora una volta, dobbiamo menzionare l’IBM Servlet Express - le cui funzionalità di controllo sono basate sull’Admin Toolkit della Sun - e la sua capacità di monitoraggio in tempo reale dei file di log, dell’utilizzo delle risorse del sistema, dei Servlet attivi, delle sessioni in corso e dell’utilizzo dei pool di connessione a database. E dal momento che i Servlet non possiedono interfaccia utente e che vengono eseguiti in un contesto particolare - vale a dire in un regime di stretta coesione ed interazione con il server - sino ad oggi sono stati proprio i file di log, supportati direttamente dal framework standard della Sun, lo strumento per eccellenza utilizzato nel loro debug. A questa via, che rimane pur sempre valida, si è recentemente affiancata una nuova e rivoluzionaria possibilità, molto simile a quanto appena visto in relazione all’Inprise JBuilder. 
Si tratta del Servlet Debugger, uno dei tool realizzati dalla LiveSoftware, che funge da "ponte" tra il JRun Servlet Engine e le più comuni piattaforme di sviluppo in maniera da rendere possibile il debug di un Servlet all’interno delle più comuni IDE Java.
Sempre a proposito di strumenti di analisi dei Servlet ricordiamo un altro prodotto della Live Software, il Servlet Killer, con il quale è possibile effettuare un test di carico multithreaded dei propri Servlet e portare così alla luce eventuali colli di bottiglia o, peggio, potenziali situazioni di deadlock. 
Insomma, proprio in questi ultimi mesi il supporto al debug dei Servlet è notevolmente migliorato, segno di una rapida maturazione di questo protocollo e di una precisa richiesta del mercato. Rimane ovviamente indispensabile la conoscenza del proprio motore e delle possibilità che esso mette a disposizione, ma strumenti di analisi e controllo come quelli forniti dall’Inprise JBuilder o dalla Live Software sono, secondo noi, assolutamente necessari, tanto più nella realizzazione di applicazioni Web complesse e ramificate.

Conclusioni

Rispetto alle tante soluzioni server-side esistenti, il protocollo Java Servlet presenta un impressionante numero di vantaggi. Non solo, come già è stato fatto notare nell’introduzione, possiede una potenza semantica ed una flessibilità, dinamicità e scalabilità uniche, ma esso è l’unico protocollo lato server universale: un Servlet Java, una volta realizzato, è immediatamente portabile in qualsiasi ambiente senza necessità di ricompilazione. Inoltre, cosa che non si può dire di molti suoi concorrenti, la tecnologia dei Servlet non è un prodotto a sé stante, ma si trova al centro di una costellazione di protocolli e soluzioni intrinsecamente multipiattaforma e rappresenta la porta d’ingresso ad un framework globale orientato al mondo dei server, con il quale Sun intende fornire una soluzione solida ed esaustiva ad ogni esigenza di condivisione distribuita di dati ed applicazioni. Nomi come Enterprise Java Bean, Aglet, JTA e JNDI non sono solo delle sigle, ma strumenti dai quali sarà impossibile prescindere già nell’immediato futuro e che impareremo a conoscere meglio nei mesi a venire.

Bibliografia

[1] Michele Sciabarrà, "Server Side Programming con Java Servlet", Computer Programming No.66, Febbraio  1998;
[2] Giovanni Puliti, "Gestire gli accessi Web con un server Java", Computer Programming n.69, Maggio 1998; 
[3] Fabrizio Giudici, "I Servlet", MokaByte, Settembre 1997: http://www.mokabyte.it/1999/09/Servlets.htm
[4] Sun Servlet: http://java.sun.com/products/Servlet/index.html
[5] Sun JDBC: http://java.sun.com/products/jdbc/index.html;
[6] Live Software: http://www.livesoftware.com
[7] IBM Servlet Express: http://www.software.ibm.com/webservers/appserv/download.html;
[8] New Atlanta ServletExec: www.newatlanta.com;
[9] Java-Apache Project: http://java.apache.org;
[10] Dynamo Application Server: http://www.atg.com/develop/products/d3;
[11] Sun Java Web Server: http://jserv.java.sun.com/products/webserver/index.html;
[12] Konasoft: http://www.konasoft.com;
[13] O’Reilly WebSite: http://website.ora.com;
[14] Zeus Web Server: http://www.zeustech.net/products/zeus3;
[15] W3C Jigsaw: http://www.w3.org/Jigsaw;
[16] Avenida Web Server: http://www.avenida.co.uk;
[17] RogueWave DBToolsJ: http://www.roguewave.com/products/dbtoolsj;
[18] Sun Java Server Engine: http://java.sun.com/products/javaserverengine/index.html;
[19] WithinReach RSVP: http://www.withinreach.co.il/RSVP;
[20] Inprise JBuilder 2: http://www.inprise.com/jbuilder
 

Lavinio Cerquetti si occupa di modellazione e sviluppo del software (prevalentemente in C/C++,  Java e Delphi) in ambienti Windows e Unix, concentrandosi sulla programmazione distribuita e  di rete. 
Può essere contattato tramite e-mail all’indirizzo lavinio@poboxes.com


MokaByte Java Web Magazine www.mokabyte.it 
La redazione di MokaByte ricerca nuovi collaboratori. 
Chi volesse mettersi in contatto con noi può farlo scrivendo a mokainfo@mokabyte.it