Open Community

the Open Community site
 
   

Colombo

PDF
PDF

Introduzione

Mi capita spesso di navigare su Internet alla ricerca di qualche programmino semplice e stimolante che mi consenta di sperimentare tecniche di programmazione o design patterns. Nel caso specifico, ero alla ricerca di un interessante programmino Java avente una GUI Swing a cui poter applicare il pattern Model Control View (MVC) (vedi [1]).

Durante queste scorribande virtuali mi sono imbattuto in un semplice Browser scritto in Java. Inutile dire che il codice era un unico file Java scritto in puro stile "spaghetti code". Ho pensato, quindi, di riscrivere lo stesso programmino strutturando meglio il codice e separando le responsabilità MVC su tre packages separati. Il risultato lo potete vedere nelle successive sezioni.

Il Model

Il model (o engine) del nostro progetto è rappresentato principalmente dalla classe Browser che implementa tutte le logiche di navigazione. Questa classe è implementata come singleton (vedi [2]) e rappresenta un facade (cioè unico punto di entrata, vedi [3]) per tutti i comandi provenienti dall' interfaccia grafica.

Questa classe tiene traccia dell'albero di link attraversati dall'utente durante la navigazione. Essa fornisce la seguente interfaccia.

        public class Browser {
            public void visit(Link link) {
            }

            public Link previous() {
            }

            public Link next() {
            }

            public boolean hasNext() {
            }

            public boolean hasPrev() {
            }
        }
      

Diciamo subito che la classe Link rappresenta un generico URL attraversato dall' utente durante la navigazione. Ogni link tiene traccia del link precedente e successivo.

Il metodo visit consente di registrare un dato URL. I metodi previous e next si occupano della navigazione, mentre i metodi hasNext e hasPrev controllano se il link corrente ha un precedente o un successivo.

Vediamo un esempio tipico di navigazione. Supponiamo di avere un sito web con la struttura riportata in Fig. 1 e che un utente navighi attraverso i link A, D e E. In tal caso la classe browser costruirà in memoria una sequenza di link A, D e E. Supponiamo ora che l'utente prema il tasto Back e poi selezioni il link F. E'chiaro che in memoria la nuova sequenza di link sarà A, D e F.

Site Example

A questo punto, qualsiasi client, utilizzando questa semplice interfaccia, potrà tener traccia dei link navigati e ottenere gli URL necessari a seconda che l'utente prema Back, Next o Search.

L'Interfaccia Grafica (View)

L'interfaccia grafica del nostro mini browser è un semplice frame swing avente un'area che conterrà i siti navigati e la Navigation Bar. La Navigation Bar contiene i classici tasti Back, Next e Search di un browser, e il text field per inserire l'URL.

La GUI è composta da tre classi: Colombo, BrowserFrame e NavigatorBar. La classe Colombo contiene il solo metodo main. La classe BrowserFrame, che è un singleton (vedi [1]), si occupa di creare l'interfaccia grafica e aggiornarla dopo la gestione di qualsiasi evento da parte del controller. Questa classe associa anche l'handler HyperlinkActionListener all'evento di click su un link nell'area di navigazione. Praticamente se sto su un dato sito e premo un link, viene attivata questo listener.

La classe NavigatorBar crea l'interfaccia della navigation bar composta, come già detto, dai 3 pulsanti di navigazione e dal text field utilizzato per inserire gli URLs da visitare. Questa classe gestisce tre eventi: pressione tasto Search, pressione tasto Back e pressione tasto Next; a cui associa, rispettivamente i seguenti handler SearchActionListener, BackActionListener e NextActionListener

Dopo l'esecuzione di uno qualsiasi dei listener citati sopra, è chiaro che il link corrente del browser può cambiare, per cui bisogna aggiornare l'interfaccia grafica.

Il Controller

Nella sezione precedente abbiamo visto che la GUI può generare solo 5 tipi di eventi:

- pressione tasto Back;
- pressione tasto Next;
- pressione tasto Search;
- pressione di un link;

Secondo il modello MVC gli eventi di GUI devono essere gestiti da un Controller che effettua delle operazioni sul Model e poi aggiorna la GUI. Nel modello di delegation di Swing, il Controller viene realizzato attraverso l'implementazione di specifici listeners. Per ciascun evento sopra citato esiste un relativo listener che ora andremo ad elencare e a spiegare:

- BackActionListener: prende il link precedentemente navigato dal model e lo visualizza sulla GUI;
- NextActionListener: prende il link successivo (se esiste) dal model e lo visualizza sulla GUI;
- SearchActionListener: registra il nuovo link sul model e lo visualizza sulla GUI;
- HyperlinkActionListener: registra il nuovo link sul model e lo visualizza sulla GUI;

Conclusioni

Il progettino presentato in questo articolo penso sia un valido esempio di programmazione Swing in Java, che potrà essere utile a chi muove i primi passi nel fantastico mondo di questo linguaggio. E' ovvio che questo piccolo programmino può essere ulteriormente esteso, aggiungendo ad esempio un menù, un bookmark e molto altro ancora.

Download source code

Clicca qui per scaricare il codice.

Bibliografia

by Salvatore D'Angelo