ELEMENTI DEL LINGUAGGIO HTML |
Java è un linguaggio di programmazione introdotto dalla Sun Microsystems, la cui caratteristica fondamentale è di produrre programmi del tutto indipendenti dall'hardware su cui girano, che pertanto può essere un normale PC, un Mac, un sistema UNIX o Solaris, ecc..
Fin qui, Java è stato utilizzato per costruire programmi (applets) in alternativa
ai programmi (scripts) CGI. La principale differenza fra le due metodologie di
sviluppo sta nella modalità di esecuzione dei programmi.
Gli script CGI vengono eseguiti sul server a cui ci si collega con conseguente
sovraccarico dello stesso in caso di numerosi connessioni contemporanee: ciò può
penalizzare il lavoro delle persone collegate (in locale od in remoto) allo stesso server.
Le applicazioni scritte in Java vengono invece richiamate sul computer client e qui
eseguite.
Chiaramente chi si connette deve possedere un interprete Java che permetta
l'esecuzione delle applets. Per rendere possibile quanto detto, Java incorpora delle
caratteristiche che ne fanno il principale candidato quale più diffuso linguaggio di
Internet per il prossimo futuro.
La principale di queste caratteristiche è la sua portabilità, scopo che viene raggiunto
rendendo l'esecuzione delle applets indipendente dall'architettura che le esegue. Ciò è
possibile grazie la fatto che Java è fondamentalmente un linguaggio interpretato: le
applets non vengono compilate in codice macchina (che le renderebbe dipendenti
dall'hardware) ma ciascuna istruzione è sostanzialmente una chiamata ad una opportuna
routine implementata nell'interprete.
Inoltre possiamo vedere che Java non permette, su di una particolare macchina,
l'implementazione dei tipi fondamentali (come gli interi) diversamente da quanto
specificato dal linguaggio.
In realtà per ragioni di efficenza, prima di essere eseguite, le applets vengono compilate
in un codice intermedio, detto "bytecode". Il codice intermedio prodotto dal
"compilatore" Java non è altro che il codice macchina di una Java Virtual
Machine (JVM) che è una specifica per un ipotetico processore che esegue il codice
Java.
L'interpretazione consente una pressochè totale indipendenza dall'hardware, ma allo
stato puro i programmi interpretati sono poco efficienti. D'altronde, la compilazione, pur
producendo programmi molto più efficienti, rende il prodotto finale hardware-dipendente e
la ricompilazione del sorgente non è sempre sufficiente per superare il problema.
Ad esempio, un linguaggio compilato come il C++, che fa largo uso dei puntatori, ha nei
puntatori stessi il principale limite alla portabilità in quanto questi sono utilizzati
direttamente per localizzare le celle di memoria senza alcuno strato intermedio al di
sopra della nuda macchina. Java invece "elimina" i puntatori fornendo un diverso
meccanismo di gestione della memoria. Dato che l'obiettivo di un programma scritto in Java
e' di essere caricato ed eseguito automaticamente, sarebbe inaccettabile che ci fosse la
possibilità che un'applicazione possa avere un bug che blocchi il sistema: per esempio
scrivendo sopra lo spazio di memoria riservato al sistema operativo. Per evitare, ad
esempio, un accesso a locazioni di memoria riservate, il compilatore Java controlla che un
programma non vada ad indirizzare zone di memoria fuori da quelle che gli sono state messe
a disposizione (array bound). La gestione della memoria avviene tramite un garbage
collector automatico che tiene traccia di tutti gli oggetti e dei riferimenti ad essi di
un programma Java. Quando un oggetto non ha più riferimenti, viene rimosso dal garbage
collector.
Essendo nato come linguaggio per sistemi distribuiti, Java necessita di un alto
livello di sicurezza. Questa viene garantita attraverso parecchie protezioni e
verifiche che l'ambiente esegue a tempo di esecuzione. A tempo di compilazione, subito
prima dell'esecuzione del codice, il compilatore controlla che il programma esegua le sue
operazioni secondo le regole previste dal linguaggio, onde evitare operazioni che possano
compromettere l'integrità del sistema. Il codice prodotto viene comunque ricontrollato
prima di essere eseguito poichè questo potrebbe essere stato, intenzionalmente o meno,
cambiato tra la fase di compilazione e quella di esecuzione. Successivamente l'interprete
Java determina la disposizione in memoria delle classi. Inoltre il caricatore di classi
mette ogni classe caricata dal Network nella sua propria area di memoria. Ancora, il
compilatore verifica che le classi caricate non accedano al file system, eccetto che nei
modi specifici loro consentiti dal client o dall'utente.
Tutto ciò dovrebbe costringere gli sviluppatori a scrivere del codice "buono",
ovvero privo di funzioni pericolose o particolarmente "maliziose".
Generalmente il costo della portabilità, sicurezza e robustezza di un linguaggio, si paga a tempo di esecuzione: la soluzione mista di Java, almeno in parte, rimedia a ciò implementando l'anzidetta JVM. La JVM produce codice molto simile al codice macchina di un processore reale (tanto che qualcuno sta già lavorando alla produzione di processori JVM per un'esecuzione hardware del bytecode). Java cerca di ottimizzare a tempo di esecuzione operazioni come il garbage collecting semplicemente eseguendole durante le attese. E' infatti raro che un programma impegni constantemente la CPU: più facilmente questo sarà soggetto ai tempi di attesa dell'input, come l'inserimento di dati da tastiera da parte dell'utente o la lettura degli stessi da memorie di massa.
Per finire, Java è semplice e immediato: pur avendo preso molto dal C++, ha eliminato
tutte quelle features a basso livello che avrebbero creato impedimenti e ne avrebbero
minato la sicurezza. In questo modo si è ottenuto un linguaggio senz'altro meno potente
(poichè a più alto livello rispetto il C++), ma più pulito, facile e sicuro.
Java vanta già un potente insieme di librerie di classi che forniscono molte delle
funzionalità che servono per sviluppare un'applicazione velocemente ed efficacemente.
Nescape Navigator include un JVM fin dalla versione 2.0.
JavaScript è un linguaggio di programmazione orientato agli oggetti come Java, ma in
realtà, mancando le raffinate strutture di questo, deve essere piuttosto considerato come
una particolare estensione del linguaggio HTML.
Javascript consente di scrivere script i quali vengfono integrati nella pagina
HTML, al pari di qualsiasi TAG HTML, portando sul client tutta una serie di attività,
come i controlli sui form ecc, che prima richiedevano l'invio dei dati sul server,
l'esecuzione di script CGI, la risposta ecc. In ultima analisi, nelle nuove versioni di
Netscape, JS potrà interagire con eventuali applet Java.
Javascript è molto più limitato di Java, non può ad esempio comunicare su di un socket,
non ha la gestione di finestre, dell I/O ecc. Con JS non è possibile creare applicazioni stand
alone al contrario di Java.
Le sfere di azione di Javascript sono:
![]() | il BROWSER, con le sue componenti (finestre, frame), loro attributi (toolbar,
statusbar ecc), le loro locazioni (cioè l'URL che contengono) |
![]() | il DOCUMENTO (cioè l'HTML): JS può creare un nuovo documento in un frame e
andarci a srivere le linee HTML dentro, con infinite
possibilità condizionali ecc. |
![]() | i LINK e gli EVENT HANDLERS: è possibile abbinare istruzioni JS a dei
link es: <A HREF="javascript:unaFunzione()">Una Funzione<A> o a degli eventi particolari |
![]() | i FORM: JS può effettuare controlli sui campi immessi nei form, o gestirli
attraverso event handlers come OnFocus (quando il cursore entra
in un campo di input), OnClick , onSubmit ecc |
![]() | la SESSIONE: JS ha a disposizione l'history della sessione corrente, con la quale è possibile andare avanti e indietro tra le pagine visitate. |
Le tipiche applicazioni di JavaScript sono:
![]() | gestione di frame e finestre: aprire un certo documento in un frame o una finestra in
base ai dati immassi in un altro. Apertura di nuove finestre. |
![]() | controllo della congruità dei dati immessi in un form |
![]() | imagemap sul client |
![]() | apertura di 'finestre di aiuto' |
![]() | orologi vari |
![]() | giochini vari, matematici e basati su testo |
![]() | quelle amenissime scritte scorrevoli sulla barra di stato (BASTAA!!) |
![]() | pagine personalizzate per i visitatori abituali, che hanno firmato un guestbook e
tornano a rivedere il sito (con i Cookies) |
![]() | contabilizzazione del totale degli acquisti online nei famosi CyberMall (shopping
centers cybernetici?) ecc. ecc. |
Cosa non si può fare con Javascript?
Non è possibile creare animazioni nel senso vero della parola. Javascript agisce solo
su una finestra od un frame intero, non su aree di questo. L'alternativa è creare un
piccolo frame e ricaricarlo N volte quanti sono i fotogrammi dell'animazione, ma i
risultati sono però deludenti, lo sfarfallio fastidioso. Oppure utilizzare GIF animati.
Qualcosa di simile alle animazioni è possibile creare utilizzando i caratteri del
browser, facendo scorrere per esempio delle scritte colorate ingrandite in un frame.
Con Javascript non è possibile aprire, salvare, in genere operare sui file, sia in locale
che sul server, per ovvie ragioni di sicurezza.
Un'altra cosa che non sarà più possibile fare, a partire dai prossimi release di
Netscape, è accedere alla locazione dei documenti puntati dall'history del browser, cioè
sapere quali siti sono stati precedentemente visitati. Questo per ovvi motivi di privacy.
Nè è possibile far inviare allo script messaggi di e-mail senza che l'utente ne dia
conferma.
Su quali versioni di bowser gira Javascript?
Per rimanere ai browser più diffusi, Javascript gira su tutte le versioni di Netscape 2.0 che supportano i frame, comprese quelle per Windows 3.1 che non supportano invece Java. E gira anche su Internet Explorer a partire dalla versione 3.0.
È possibile avere un contatore di accessi scritto in Javascript?
Si, è possibile, ma conterà solo gli accessi dei browser che possono far girare Javascript stesso. Ed ha comunque bisogno di un programma CGI sul server per scrivere il file del contatore.Vediamo infine qualche piccolo script in modo da comprendere come vengano inseriti all'interno dei documenti HTML e constatare le possibilità che Javascript offre.
Cominciamo dalle funzioni, che non sono difficili da capire e sono molto utili.
E' conveniente dichiarare le funzioni tra i tag <head> della pagina HTML. Le
funzioni vengono invocate dagli eventi attivati dall'utente, quindi è ragionevole tenere
le loro dichiarazioni tra i tag <head>, in modo tale che vengano caricate prima che
un utente possa fare qualcosa che le invochi.
Gli script possono essere posti all'interno di un commento per fare in modo che i
browser più vecchi, che non supportano Javascript, non li considerino.
<html> <head> <script language="JavaScript"> function pushbutton() { alert("Ciao!"); } </script> </head> <body> <form> <input type="button" name="Button1" value="Clicca qui" onclick="pushbutton()"> </form> </body> </html>
Per provare subito questo script, usando un browser che supporta Javascript, cliccare sul
pulsante.
Questo script crea un pulsante che risponde al clic con una finestra con la scritta
'Ciao!'. Ma che cosa succede con la presenza di questo script? Come prima cosa la funzione
viene caricata e tenuta in memoria, quindi viene creato un pulsante con i classici tag
<form> (HTML). A questo punto si deve notare qualcosa di nuovo tra i parametri del
tag <input>: la presenza del parametro onclick. Questo parametro dice al
browser quale funzione invocare quando si clicca sul pulsante (naturalmente soltanto se il
browser supporta Javascript). Nell'intestazione viene dichiarata la funzione pushbutton()
che viene eseguita quando si clicca sul pulsante.
C'è anche un'altra novità nello script: il metodo alert. Questo metodo è già
dichiarato in Javascript, si deve quindi soltanto invocarlo. (il metodo alert nonè stato
certo pensato per l'uso che ne abbiamo fatto qui, che è puramente didattico). Ci sono
diversi altri metodi a disposizione.
Vediamo ora come poter leggere ciò che un utente ha inserito in una form.
<html> <head> <script language="JavaScript"> <!-- nascondiamo lo script ai vecchi browser function getname(str) { alert("Ciao, "+ str+"!"); } // fine del commento --> </script> </head> <body> Inserisci il tuo nome: <form> <input type="text" name="name" onBlur="getname(this.value)" value=""> </form> </body> </html>
Ora si provare questo script:
Inserisci il tuo nome:
In questo script sono stati utilizzati altri nuovi elementi.
Per prima cosa si noti l'inserimento dello script all'interno del commento, per nascondere
lo script ai vecchi browser che non possono eseguirli. E' necessario seguire l'ordine
mostrato: l'inizio del commento deve trovarsi subito dopo il primo tag <script> e il
commento deve terminare subito prima del tag </script>.
In questo documento HTML vi è una form in cui l'utente può inserire il proprio nome. Il
parametro onBlur del tag <input> indica al browser quale funzione invocare
quando qualcosa viene immesso nella form. La funzione getname(str) verrà invocata
quando questo elemento della form perde il focus o quando viene premuto il tasto 'Invio'
dopo aver inserito qualcosa. La funzione acquisisce la stringa immessa tramite il comando getname(this.value).
'This.value' indica il valore che è stato immesso in questo elemento della form.
Il prossimo esempio mostra l'implementazione di una funzione che gestisce la data di un documento, così che sarà il browser a visualizzare la data di ultima modifica della pagina HTML, senza costringere il creatore della pagina a scrivere la data nel documento.
<html> <body> Questa e' una semplice pagina HTML. <br> Ultima modifica: <script language="JavaScript"> <!-- nasconde lo script ai vecchi browser document.write(document.lastModified) // fine del commento --> </script> </body> </html>
Eccetera, questo non è un manuale del linguaggio Javascript....