Esempio di costruzione Browser entro il contenitore BeanBox
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:
- HotJavaBrowserBean visualizzatore pagine HTML
- AuthenticatorBean che permette la connessione a siti sicuri.
- HotjavaDocumentStack che permette la navigazione al documento successivo (metodo forward()) e precedente (metodo back()),
- HotJavaSystemState fornisce un’interfaccia mediante il quale si permette all’utente di impostare proprietà di sistema legate al browser come per esempio il server proxy e la sua porta, il server ftp e la sua porta, ecc..
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: <br> <br> Documento in caricamento 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:
- BrowserHistoryListener
- PropertyChangeListener
- VetoableChangeListener
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
- BrowserHistoryListener
- ComponentListener
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.
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.
Abbiamo quindi
- il bean invisibile AuthenticatorBean la cui sola presenza basta a permettere la connessione a siti sicuri.
- il bean invisibile HotjavaSystemState per l’impostazione delle proprietà di sistema da parte dello sviluppatore e da parte dell’utente
- il bean invisibile HotJavaDocumentStack la navigazione tra un documento e l’altro di quelli caricati in memoria
- il bean HotJavaBrowserBean che rappresenta la finestra del browser dove verrà caricato il documento
- il bean TextBean dove poter digitare gli URL dei vari siti.
- i 5 bottoni che rappresentano le maggiori funzionalità dei beans.
Impostate le principali proprietà di sistema.
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).
Collegate fra di loro i beans.
A tale proposito
- Collegate il bottone "Indietro" al bean HotJavaDocumentStack. Questa operazione avrà l’effetto di caricare il documento precedente a quello corrente (se presente) non appena si clicca sul bottone.
Corrisponde ad iscrivere il bean alla lista ascoltatrice java.awt.event.ActionListener associata al bottone.
Si effettua selezionando il bottone e poi cliccando sulla voce di menù Edit-\>Events-\>button push-\>actionPerformed.
Successivamente si presenterà una linea rossa che partirà dal bottone, allora cliccate sul bean HotJavaDocumentStack. Apparirà la finestra di figura 4.
Selezionate la voce previousDocument e premete OK.
- Collegate il bottone "Avanti" al bean HotJavaDocumentStack. Questa operazione avrà l’effetto di caricare il documento successivo a quello corrente (se presente) non appena si clicca sul bottone. Le operazioni sono identiche al punto precedente tranne la voce da selezionare che deve essere nextDocument.
- Collegate il bean HotJavaDocumentStack al bean HotJavaBrowserBean. Questa operazione avrà l’effetto di visualizzare nella finestra browser il documento caricato precedentemente da un operazione "Avanti" o "Indietro".
Corrisponde ad iscrivere il secondo bean alla lista ascoltatrice suw.hotjava.bean.BrowserHistoryListener associata al primo.
Si effettua selezionando HotJavaDocumentStack e poi cliccando sulla voce di menù Edit-\>Events-\>browser history commands-\>executeHistoryCommand. Successivamente si presenterà una linea rossa, allora cliccate sul bean HotJavaBrowserBean. Apparirà una finestra dove dovrete selezionate la voce executeHistoryCommand e premere OK.
- Collegate il bean HotJavaBrowserBean al bean TextBean. Questa operazione avrà l’effetto di caricare il nuovo URL appartenente al nuovo documento caricato nella finestra browser.
Corrisponde ad iscrivere il secondo bean alla lista ascoltatrice suw.hotjava.bean.BrowserHistoryListener associata al primo.
Si effettua selezionando HotJavaBrowserBean e poi cliccando sulla voce di menù Edit-\> bind property….
Successivamente apparirà una finestra nella quale dovrete selezionare la voce documentString e premere OK; poi si presenterà una linea rossa, allora dovrete cliccare sul bean HotJavaBrowserBean. Apparirà una finestra dove dovrete selezionate la voce text e premere OK.
- Collegate il bean TextBean al bean HotJavaBrowserBean. Questa operazione avrà l’effetto di caricare il nuovo documento nella finestra browser corrispondente all’URL digitato nel TextBean.
Corrisponde ad iscrivere il secondo bean alla lista ascoltatrice java.beans.PropertyChangeListener associata al primo.
Si effettua selezionando HotJavaBrowserBean e poi cliccando sulla voce di menù Edit-\>bind property….
Successivamente apparirà una finestra nella quale dovrete selezionare la voce text (cambiamento del testo) e premere OK; poi si presenterà una linea rossa, allora dovrete cliccare sul bean HotJavaBrowserBean. Apparirà una finestra dove dovrete selezionate la voce documentString e premere OK.
Attivate gli altri bottoni "Ferma", "Ricarica" e Stampa". A tale scopo collegate i bottoni al bean HotJavaBrowserBean. Questa operazione avrà l’effetto di eseguire il comando associato non appena si clicca sul bottone.
Corrisponde ad iscrivere il bean alla lista ascoltatrice java.awt.event.ActionListener associata al bottone.
Si effettua selezionando il bottone e poi cliccando sulla voce di menù Edit-\>Events-\>button push-\>actionPerformed.
Successivamente si presenterà una linea rossa che partirà dal bottone, allora cliccate sul bean HotJavaBrowserBean. Apparirà la finestra di figura 5.
Selezionate la voce Print se avete cliccato su "Stampa", Reload se avete cliccato su "Ricarica" e Stoploading se avete cliccato su "Stampa", 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.
1. Provate tutti e bottoni e navigate. 2. 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.
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à:
- Save . Salva il file su disco
- View in HotJava. Carica il contenuto del file direttamente nel browser.
- View in Application. Carica un’applicazione da disco per poter caricare il file e visualizzarlo (per esempio si potrebbe selezionare winword.exe per visualizzare il contenuto di un file con estensione .doc
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.
Analisi del pacchetto
I file .jar sui quali lavora questo pacchetto sono due
- TextBean.jar contenente il bean TextBean
- HotJavaBean.jar tutto il necessario per far funzionare il browser.
In particolare il secondo file contiene:
I package
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
La directory lib/hotjava contiene un’unica pagina html che è quella iniziale che viene caricata in fase di costruzione del browser
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).
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).
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
