|
|||||||||||||||||||||||||||||||||
Eccoci arrivata all’ultimo articolo dedicato all’interrogazione di database via web. Nel primo articolo abbiamo posto le basi teoriche per implementare un’architettura di comunicazione client-server, nel secondo abbiamo implementato la struttura di base per il server. In quest’ultimo articolo vedremo invece come creare un applet di interrogazione, cioè il client. Le informazioni fornite nei tre articoli dovrebbero essere sufficienti per poter estendere le caratteristiche a seconda delle proprie necessità. In realtà, come già accennato, la serie di articoli è stata concepita in modo da mostrare una metodologia aperta, nel nostro caso applicata ad un sistema di interrogazione di database, ma virtualmente adattabile ad un qualsiasi sistema client server. |
|||||||||||||||||||||||||||||||||
L’applet
Il nostro semplicissimo applet sarà composto da un campo di testo per l’inserimento dei comandi da inviare al server, un bottone per confermare l’invio del comando e una textArea per la visualizzazione dei dati di ritorno. Ci siamo quindi limitati al minimo indispensabile per avere un applet utilizzabile, semplice ma allo stesso tempo implementando il tutto in modo che sia estremamente facile estenderne le funzionalità a proprio piacimento/necessità. Per
rendere la lettura dell’articolo il più scorrevole possibile, commenteremo
il codice pezzo per pezzo. Come vedrete il tutto è molto semplice
e comunque risulta perfettamente speculare al codice scritto per la parte
server. Infatti tutta la parte di comunicazione è esattamente la
stessa. In realtà, l’unica differenza sta nel fatto che il client
ha necessità di visualizzazione che il server può invece
trascurare.
10
import java.applet.Applet;
e fin
qui tutto chiaro; Applet è il tipo di applicativo che scriviamo,
awt.* ed awt.event .* servono per la gestione dell’interfaccia grafica
e le sue interazioni, net.* per la comunicazione con il server e
io.* per l’input/output.
60
public class JDBCClient extends Applet implements ActionListener,Runnable
{
Implementiamo
il metodo init(), proprio dell’oggetto Applet, che è il metodo richiamato
all’inizializzazione dell’applet stesso. Per funzionare, il nostro applet
ha necessità di sapere l’indirizzo del server al quale connettersi
(riga 200, anche se sappiamo che per ragioni di sicurezza, per default
un applet può solo connettersi al server dal quale sia stato scaricato).
190
public void init() {
Il metodo start(), così come stop() e run(), appartengono invece all’interfacca Runnable, e sono quindi legati all’oggetto Thread. In particolare, start() nel nostro caso si occupa di creare il socket di connessione al server ( riga 490), aprire gli strema- di input/output con il server stesso (righe 500-510) e di creare e lanciare un thread dell’applet stesso. 470
public void start() {
Il
metodo stop() viene eseguito se per qualche motivo viene stoppato il thread,
e si occupa di chiudere il socket.
600
public void stop () {
Il
metodo run() è il cuore dell’applet, in quanto si occupa di stare
in ascolto sul socket creato precedentemente e di interpretare i dati che
arrivano dal server. Questo è il punto in cui si nota di più
la somiglianza con il codice del server; infatti la tecnica utilizzata
è la stessa. Il formato di dati accettato è : “comando:dati”.
Nella stringa ricevuta dal server si cerca il separatore (“:”),ponendo
nella variabile “what” il comando e in “data” i dati. Nel nostro caso è
riconosciuto solo il comando “getString” che segnala la richiesta del valore
di un campo dal recordset creato in base alla query fatta in precedenza
( per dettagli sui comandi riconosciuti dal server è consigliabile
vedere il precedente articolo della serie).
670
public void run () {
Avendo implementato un solo commando riconosciuto abbiamo utilizzato un “if “( riga 760). Naturalmente, avendo un ventaglio di comandi più ampio sarà invece meglio utilizzare una struttura “switch”. Nel caso del comando “getString”, l’applet si limita a mostrare sulla textArea il valore del campo richiesto. 760
if (what.equals("getString")) {
Il
metodo actionPerfomed deve essere implementato in quanto nella creazione
della classe si è specificata come clausola “implements ActionListener”.
Questo metodo viene richiamato in seguito al verificarsi di eventi da parte
di quegli oggetti per i quali sia stato definito ActionListener l’applet
(righe 380 e 440 per bottone4 e textField rispettivamente). In questo caso
l’ “if” alla riga 870 è superfluo perché il metodo viene
chiamato solo nel caso in cui l’evento sia lanciato da uno di questi due
oggetti, ma è stata inserita ugualmente in previsione di espansioni
che riguardino il lancio di eventi da parte di altri oggetti all’interno
dell’applet ( anche qui, se il numero di oggetti diventa alto sarebbe meglio
sostituire l’”if” con un “switch”). Anche qui, è
bene rileggere l’articolo precedente per vedere quali comandi siano riconosciuti
dal server , oppure implementarli ...............
860
public void actionPerformed(ActionEvent e) {
Conclusioni
|
|||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
|