import java.awt.*; // Le classi per il disegno
import java.applet.Applet; // La superclasse
import java.sql.*;
public class query extends Applet {
TextField expr;
Button cerca; // Fa partire il test
TextArea textArea; // Display dei risultati
// Stringhe di configurazione, lette dalla pagina HTML
String server; // URL del server
String database; // nome del database
String user; // utrnte con cui connettersi
String password; // password dell'utente (se presente)
String driver; // driver da caricare
public void init () { // Metodo chiamato all'avvio dell'applet
// Legge i paramentri dal tag <Applet> (per rendere flessibile l'applet)
server = getParameter("server");
database = getParameter("database");
user = getParameter("user");
password = getParameter("password");
driver = getParameter("driver");
// Gestisce il default dei parametriquery.java
if (server == null) {
server="localhst";
}
if (database == null) {
database="test";
}
if (user == null) {
user="www-data";
}
if (password == null) {
password="";
}
if (driver == null) {
driver="org.postgresql.Driver";
}
setBackground (new Color(0,0,128)); // Sfondo applet
setForeground (new Color(255,255,136)); // Scritte applet
setLayout (new BorderLayout ()); // Layout con le cinque posizioni
Panel np = new Panel (); // Un pannello per contenere label e campo
np.setLayout (new FlowLayout ()); // Che mette i compoinenti uno in fianco all'altro
np.add (new Label ("Nome da cercare"));
expr = new TextField (40);
np.add (expr); // Aggiungo il bottone al pannello - avra' la sua dimensione naturale
add ("North", np); // Metto il pannello con label e campo in alto
textArea = new TextArea(11, 80); // Display (11 righe di 80 caratteri)
textArea.setEditable(false); // Il display non deve essere modificabile
add ("Center",textArea); // Aggiungo il display a in centro
Panel sp = new Panel (); // Un pannello per centrare il bottone
sp.setLayout (new FlowLayout ()); // Che mette i compoinenti uno in fianco all'altro
cerca = new Button ("Cerca");
sp.add (cerca); // Aggiungo il bottone al pannello - avra' la sua dimensione naturale
add ("South",sp); // Metto il pannello con il bottone a sud dell'applet
}
// Piccolo metodo di utilita' per gestire gli errori:
// - stampa il messaggio m
// - stampa il codice di errore dell'Exception
void printException (String m, Exception e) {
textArea.setText (m + "\n");
textArea.appendText (e.toString ());
textArea.appendText ("\n");
}
// Carica la driver da utilizzare (parametro 'driver') ed
// apre una connesione al database 'db', con l'utente 'user'
// e la password 'pwd'
// Ritorna la connessione creata
Connection Conn (String db, String user, String pwd, String driver) {
Connection c = null;
String dbUrl;
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
printException ("Non trovo la driver del database", e);
return null;
}
dbUrl = "jdbc:postgresql:" + db;
try {
c = DriverManager.getConnection(dbUrl, user, pwd);
} catch (SQLException e) {
printException ("Non riesco a connettermi con il database " + db,e);
return null;
}
textArea.setText ("Connesso con il database " + db);
return c;
}
// Esegue una query usando la stringa di ricerca passata per parametro
// Estrae le righe (tuple) dal risultato ed i valori dalle tuple
void queryTable (Connection conn, String espressione) {
textArea.setText ("");
try {
Statement dbst = conn.createStatement();
ResultSet rs;
// Questa volta esegue una 'executeQuery' che ritorna i valori
// nel 'ResultSet'.
if (espressione.compareTo ("") != 0) {
rs = dbst.executeQuery("select * from agenda where nome~'" + espressione + "';");
} else {
rs = dbst.executeQuery("select * from agenda;");
}
if(rs!=null) {
// Adesso traversiamo l'insieme dei risultati, stampandoli.
// Dobbiamo chiamare .next() per caricare ogni riga
while(rs.next()) {
String a = rs.getString(1); // Recupera la colonna 'nome'
int b = rs.getInt(2); // Recupera la colonna 'cellulare'
textArea.appendText (a + " : " + b + "\n");
}
rs.close(); // Occorre sempre chiudere quando abbiamo finito
} else { // La query non ha ritornato risultati
textArea.appendText ("Nessun record nella tabella 'agenda'\n");
}
dbst.close (); // Occorre sempre chiudere quando abbiamo finito
conn.close (); // chiude la connessione
} catch (SQLException e) {
printException ("Non riesco a estrarre i dati dalla tabella 'agenda'",e);
return;
}
}
// Esegue la query
void doQuery () {
Connection conn;
String espressione = expr.getText ();
// Crea la connessione al nostro database
conn = Conn ("//" + server + "/" + database, user, password, driver);
if (conn != null) {
queryTable (conn, espressione); // esegue la query
}
}
// Gestione del bottone
public boolean action(Event event, Object arg) {
if (event.target == cerca) {
doQuery (); // ed esegue la query
}
return true;
}
}