MokaByte Numero 20 - Giugno 1998

 
HotJava HTML Component 
di
Daniela Ruggeri 
Analisi del browser "Fai Da te"

 

 
 
  



In questo articolo analizziamo il pacchetto HotJava Html Component che supporta circa l’80% delle funzionalità del browser HotJava Browser. Proveremo poi a vedere come si costruisce e si utilizza un browser.



 

Introduzione
Il Bean HotJavaSystemStack
Il Bean HotJavaBrowserBean
Il Bean AuthenticatorBean
Il Bean HotJavaSystemState
Esempio di costruzione Browser entro il contenitore BeanBox
Analisi del pacchetto
Conclusione
 



 

Introduzione
 

Il pacchetto scaricabile in versione try (versione attuale 1.1.2) dal sito JavaSoft ha la durata di 1 mese di prova.

Queste funzionalità sono fornite dai quattro componenti JavaBeans che costituiscono il pacchetto HotJava HTML Component e che possono essere assemblati insieme abbastanza semplicemente e usati per visualizzare documenti sia in locale che sotto Internet.

Questi componenti riguardano:


Il primo è il bean più importante e rappresenta il centro del browser, e gli altri beans forniscono solo funzionalità di supporto.
 

Il Bean HotJavaBrowserBean

Questo Bean è il visualizzatore della pagina HTML nonché di tutte le pagine HTML di supporto necessarie a gestire ogni tipo di problema, nel caricamento del documento (esempio Host sconosciuto, invio posta, file non trovato e così via…).

Associato ad esso esiste una classe BeanInfo, la HotJavaBrowserBeanBeanInfo, che permette di ricavare proprietà, metodi ed eventi.

Per quanto riguarda la personalizzazione, piuttosto che fornire una classe BeanCustomizer è stato messo a disposizione un bean apposito (HotJavaSystemState) sia per rilevare lo stato del componente HTML sia per impostare le variabili che riguardano l’ambiente di connessione.

Lo stato del bean si intercetta attraverso il cambiamento delle proprietà che sono tutte di tipo bound e quindi intercettabili dall’esterno. Gestendo l’evento PropertyChangeEvent associato alla lista ascoltatrice PropertyChangeListener, è possibile intervenire a modificare l’aspetto e il comportamento del bean.

Le proprietà gestite sono mostrate in tabella
 
String documentString L’URL del documento corrente in formato stringa
URL documentURL  L’URL del documento corrente 
Reader documentSource  L’ input stream del documento corrente
String documentTitle Il titolo del documento corrente
String errorMessage Il più recente errore dovuto all’interpretazione dei tag HTML
String statusMessage  L’ultimo messaggio di stato. 

Esempio: Applet loaded

double loadingProgress  Informazioni numeriche circa il caricamento del documento: 
 
 
  1. Documento in caricamento
  2. Documento caricato
boolean documentReloadable  True se il documento può essere ricaricato 
boolean secureConnection True se la corrente connessione è sicura
String[] frameList Un vettore contenente il nome di tutti i frames HTML
DocumentSelection selection  La corrente selezione dell’utente
ElementInfo indicatedElement  Il link (se esiste) sotto il cursore 
String charset  L’insieme di tipo caratteri usati da tradurre in Unicode

Una delle proprietà più interessanti è la proprietà indicatedElement e che gestisce la classe ElementInfo formata dai seguenti metodi

class ElementInfo {

        public String imageURL; // link dell’immagine

        public String hrefURL; // link HREF

        public String altText; // Testo alternativo

        public MouseEvent event; // Timpo di evento interessato riguardante la tipologia Mouse

};

Tramite questa classe è possibile ottenere informazioni sul link dove è posizionato il cursore, e operare opportune modifiche. Per esempio tramite il campo MouseEvent è possibile risalire al componente puntato dal cursore e cambiare il tipo cursore da quello standard a quello di tipo HAND_CURSOR.

Per quanto riguarda i metodi, oltre ai metodi get e set associati alle proprietà, e i metodi add e remove associati alle liste ascoltatrici abbiamo:
 
find()  Ricerca una stringa all’interno del documento
print()  Stampa il documento
clearImageCache() Cancella le immagini dalla cache
ExecuteHistoryCommand()  Gestisce l’evento BrowserHistoryEvent. Questo metodo è usato per abilitare il bean HotJavaDocumentStack a ricevere notifiche riguardanti i documenti caricati dal browser.
reload()  Ricarica il documento
stopLoading()  Ferma il caricamento del documento se possibile.
stop() Ferma momentaneamente il processo di caricamento del documento delle animazioni e delle immagini. E’ usato quando il browser è momentaneamente nascosto alla vista, per non utilizzare inutilmente le risorse del sistema.
start()  Riprende il processo di caricamento bloccato dal metodo stop().

Gli eventi:

Inteso come sorgente degli eventi il bean supporta le seguenti interfacce estensioni di EventListener:


La prima interfaccia è necessaria a far comunicare questo bean con il bean stack HotJavaDocumentStack che fornisce informazioni sui documenti caricati, e le ultime due comuni a tutti i bean serve per l’intercettamento delle priorità di tipo bound e per impedire il cambiamento del valore delle stesse in particolari condizioni.

Come ascoltatore il bean supporta invece

 La prima interfaccia è necessaria a far comunicare il bean stack HotJavaDocumentStack con questo bean, mentre la seconda serve al bean per intercettare eventi provenienti da vari componenti come bottoni ecc.

 

Il Bean HotJavaSystemStack

Questo bean è invisibile ed è usato per comunicare con il bean HotJavaBrowserBean. Esso fornisce la navigazione indietro e avanti tra i documenti caricati.

Quindi questo bean non fa altro che gestire una collezione di documenti visitati dall’utente.

Tra le possibilità può indicare l’esistenza di un documento precedente e di uno successivo e può azzerare la memoria dai documenti caricati.

L'introspezione. È fornita attraverso la classe che forisce la classe BeanInfo, HotjavaDocumentStackBeanInfo.

Per usare questo bean basta creare una sua istanza, un’istanza di HotJavaBrowserBean e un’istanza di due bottoni rispettivamente con Label "Avanti" e "Indietro". Al verificarsi dell’evento ActionEvent sul bottone con Label "Avanti" si fa eseguire il metodo nextDocument() di questo bean. Analogamente il bottone con label "Indietro" farà eseguire il metodo previousDocument().

L’esecuzione di questi metodi scatena l’evento BrowserHistoryEvent, e quindi connettendo questo bean al bean HotJavaBrowserBean (cioè iscrivendo l’istanza di HotJavaBrowserBean alla lista ascoltatrice BrowserHistoryListener dell’istanza di questo bean) viene eseguito il metodo executeHistoryCommand() associato a HotJavaBrowserBean, e visualizzato il nuovo documento.

Proprietà gestite:
 
int logicalDepth  Numero di documenti caricati
int  contentsDepth  Numero di tipi di oggetti caricati in memoria (applets in esecuzione, oggetti contenuti nella pagina HTML, ecc.)
boolean  nextDocumentAvailable  Indica se il prossimo documento esiste
boolean  previousDocumentAvailable  Indica se il precedente documento esiste

Tra le proprietà solo le ultime due sono di tipo bound

Tra i metodi trattati, oltre che ai metodi get, set e is delle proprietà relative e ai metodi add e remove dalle liste ascoltatrici supportate ci sono:
 
nextDocument() Passa al prossimo documento
previousDocument() Passa al precedente documento
eraseDocumentHistory() Cancella i documenti dalla memoria
executeHistoryCommand() Processa l’evento BrowserHistoryEvent
Inteso come sorgente degli eventi il bean supporta le seguenti interfacce estensioni di EventListener:

PropertyChangeListener
BrowserHistoryListener

La prima interfaccia serve per intercettare l’evento PropertyChangeEvent che viene spedito agli ascoltatori ogni volta che cambiano una delle due proprietà di tipo bound di questo bean.

La seconda interfaccia serve per intercettare il cambiamento del corrente documento nell’esecuzione del metodo nextDocument() o previousDocument()

Inteso come ascoltatore degli eventi il bean supporta invece:

BrowserHistoryListener

Questa interfaccia serve ad intercettare il cambiamento del corrente documento ed ha come conseguenza l’aggiunta del nuovo documento da gestire.
 

Il Bean AuthenticatorBean

Questo bean è un componente JavaBeans invisibile per l’uso del bean HotJavaBrowserBean.

Esso permette connessioni a servers sicuri semplicemente aggiungendolo allo stesso contenitore del bean HotJavaBrowserBean.

Questo bean non supporta alcuna classe BeanInfo per l’introspezione. Ne consegue che l’introspezione è quella di default.

Tra le proprietà supportate (nessuna di tipo bound) abbiamo:
 
String  userName  L’utente corrente
String  password  La password di autorizzazione alla connessione
int requestingPort  La porta utilizzata dal richiedente 
String  requestingScheme   
InetAddress  requestingSite  L’indirizzo internet del sito richiesto 
URL  requestingURL  L’URL richiesto 
Per quanto riguarda i metodi ci sono solo quelli get e set che gestiscono le proprietà mentre non è prevista nessuna interfaccia estensione dell’interfaccia EventListener.

 

Il Bean HotJavaSystemState

Questo bean è un componente JavaBeans invisibile usato per impostare tutte le variabili di sistema necessarie per il corretto funzionamento browser e per impostare le preferenze.

Per quanto riguarda l'introspezione esiste una classe apposita, HotJavaSystemStateBeanInfo, che fornisce esplicitamente informazioni sulle proprietà, eventi e metodi.
 
CookieJar cookies  Una collezione di cookies
URLPool  URLPool La lista degli URL visitati
SystemProperties UserProperties Le proprietà del sistema fornite dall'utente.
SystemProperties SystemPropertyDefaults Le proprietà del sistema che lo sviluppatore può personalizzare.

Le prime 3 sono proprietà di tipo Bound.

Tra i metodi gestiti, oltre che i metodi set e get relativi alla gestione delle proprietà e ai metodi add e remove nelle liste ascoltatrici, c'è il metodo editUserProperties() che apre una finestra di dialogo per la digitazione da parte dell'utente di alcune proprietà di sistema.

Per quanto riguarda gli eventi questo bean supporta come sorgente le sole interfacce PropertyChangeListener e VetoableChangeListener, per il cambiamento delle proprietà bound e le proprietà con condizioni.

Non supporta nulla invece come ascoltatore.

 

Esempio di costruzione Browser entro il contenitore BeanBox

In questo articolo viene utilizzato come contenitore il BeanBox, ma nulla vieta di avere un’applet o un frame come contenitore; il risultato della scelta sarebbe assolutamente identico, salvo la possibilità nel secondo caso di poter intervenire sul codice permettendo più possibilità.

I passi da fare in questo caso sono:
 

  1. Installare il pacchetto BDK (Bean Development Kit)
  2. Copiare i file jar TextBean.jar e HotJavaBean.jar nella directory bdk/jars
  3. Posizionarsi sotto la directory bdk/beanbox e lanciare il beanbox secondo le specifiche dipendenti dal sistema operativo usato.
  4. Come potete vedere dalla figura 1. i beans contenuti nei file .jar sono stati aggiunti alla toolbar.

Figura 1.
Abbiamo quindi

HotjavaSystemState (file HotJavaBean.jar).
AuthenticatorBean (file HotJavaBean.jar).
HotJavaBrowserBean (file HotJavaBean.jar).
HotJavaDocumentStack (file HotJavaBean.jar).
TextBean (file TextBean.jar).

  1. Cliccate sui beans elencati al punto 4 e trascinateli sulla finestra BeanBox. Poi trascinate 5 volte il bottone OrangeButton fino al BeanBox dandogli come label nella fienstra Properties i valori "Indietro", "Avanti", "Ferma", "Ricarica" e "Stampa". Dopo aver dimensionato i beans e la finestra di Beanbox nella maniera più opportuna dovreste vedere ciò che compare nella figura 2.

Figura 2.



Abbiamo quindi
 

  1. Impostate le principali proprietà di sistema.

  2. A tale proposito cliccate sul bean HotjavaSystemState e poi nella finestra Properties sulla voce Edit relativa a SystemPropertyDefault. Apparirà una finestra con le proprietà necessarie a far funzionare il browser. Per la semplice navigazione WEB basta impostare i primi due valori (figura 3).


    Figura 3.



  3. Collegate fra di loro i beans.
A tale proposito

Figura 4.


Selezionate la voce previousDocument e premete OK.
  1. Collegatevi ad Internet, digitate nel TextBean un URL e premete invio. Per esempio digitando l’URL http://www.jia.it, dovreste vedere la figura 6.

Figura 6.
    Provate tutti e bottoni e navigate.
  1. Se volete salvare ciò che avete fatto utilizzate il comando "Save" del menù "File".


Tramite questo browser è possibile navigare anche in locale. Per esempio digitando l’URL file:d:/Acrobat3/Reader, sul mio computer si vede la figura 7.


Figura 7.


Inoltre ci sono un certo numero di pagine html parametrizzate che gestiscono vari servizi o problemi. Per esempio nella figura 8 vediamo una pagina che appare quando il browser incontra un’estensione di file che non riconosce e da’ tre possibilità:


Figura 8.

 Un altro esempio è quando si clicca su un indirizzo di posta elettronica. Per esempio in figura 9 è mostrato cosa compare cliccando sull’indirizzo mailto:webmaster@jia.it: è una pagina per spedire messaggi di posta elettronica.


Figura 9.



Analisi del pacchetto
 

I file .jar sui quali lavora questo pacchetto sono due
 


In particolare il secondo file contiene:
 

  1. I package

  2. sunw.hotjava.applet
    sunw.hotjava.bean
    sunw.hotjava.doc
    sunw.hotjava.forms
    sunw.hotjava.misc
    sunw.hotjava.protocol
    sunw.hotjava.security
    sunw.hotjava.tables
    sunw.hotjava.tags
    sunw.hotjava.ui
    sunw.html

    che contengono tutte le classi per far funzionare il browser

     

  3. La directory lib/hotjava contiene un’unica pagina html che è quella iniziale che viene caricata in fase di costruzione del browser
  4. La directory lib/hotjava/images contiene solo le immagini a cui attinge il browser per rappresentare tipi di file ecc. (per esempio nella figura 7 possiamo vedere accanto ad ogni file una piccola immagine rappreentante il tipo di file).
  5. La directory lib/templates contiene solo i modelli parametrizzati delle pagine html per risolvere ogni tipo di problema. E’ chiaro che queste pagine possono essere riscritte in un'altra grafica e in un altro lingua. Per esempio le figure 8 e 9 sono la realizzazione rispettivamente dei modelli viewer.unknown.html e mailto.html (directory lib/templates/bean).
  6. I file properties. Ce ne sono tre: hotjava.properties, hotjavaBean.properties e hjResourceBundle.properties.
Servono a definire tutte le impostazioni del browser in maniera dinamica.
Per esempio nel file hotjavaBean.properties si possono cambiare i modelli html.

Abbiamo:

#
# HTML Dialog templates
#
template.mailto.html=/lib/templates/bean/mailto.html template.app-launch-error.html=/lib/templates/bean/app-launch-error.html
template.viewer.unknown.html=/lib/templates/bean/viewer.unknown.html
template.socks.open.html=/lib/templates/bean/socks.open.html
template.unknown.host.html=/lib/templates/bean/unknown.host.html
template.unknown.url.html=/lib/templates/bean/unknown.url.html

Come si può vedere per esempio la pagina mailto.html che appare in figura 9., può essere sostituita da un'altra qualsiasi costruita ad hoc per la procedura.

Altro esempio. Nel file hotjavaBean.properties possiamo cambiare le scritte contenute nelle applet delle figure 8. e 9.

Abbiamo:

# Figura 8
button.viewerunknown.save.text=Save...
button.viewerunknown.view.text=View in HotJava
button.viewerunknown.application.text=View in Application...
 

# Figura 9
# MailToApplet
#

mailto.to.text=To:
mailto.subject.text=Subject:
mailto.from.text=From:
mailto.cc.text=CC:
mailto.error.message=Could not deliver mail: {0}
mailto.notoaddr.message=Could not deliver mail: The "To:" address was not specified
mailto.success.message=Your message has been sent.

... # buttons
button.maildoc.send.text=Send
button.maildoc.cancel.text=Clear

# checkboxes
maildoc.formatted.text=Message in HTML
 

Come si può vedere possono essere cambiate tutte le scritte mettendole per esempio in italiano.
 

Conclusione.

Il pacchetto così come si trova in versione try rappresenta una scelta interessante nella costruzione di un browser personalizzato.
Ritengo quindi utile continuare a studiare le successive versioni che saranno depurate dagli inevitabili bugs.

                                                                                                        Daniela Ruggeri

 
 
 
 

MokaByte Web  1998 - www.mokabyte.it 
MokaByte ricerca nuovi collaboratori. Chi volesse mettersi in contatto con noi può farlo scrivendo a mokainfo@mokabyte.it