inserisci.java

import java.awt.*;         // Le classi per il disegno
import java.applet.Applet; // La superclasse
import java.sql.*;

public class inserisci extends Applet {
  TextField nome;
  TextField cellulare;
  Button inserisci;// Inserisce i dati
  Label messaggio; // 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
  Panel p; // Pannello per gestire la disposizione degli elementi
    // 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 parametri
    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 GridLayout (4,1)); // Tabella con quattro righe


    p = new Panel ();           // Un pannello per contenere label e campo
    p.setLayout  (new FlowLayout ()); // Che mette i compoinenti uno in fianco all'altro
    p.add (new Label ("Nome"));
    nome = new TextField (40);
    p.add (nome); // Aggiungo il bottone al pannello - avra' la sua dimensione naturale
    add (p); // Metto il pannello con label e campo nella prima riga

    p = new Panel ();           // Un pannello per contenere label e campo
    p.setLayout  (new FlowLayout ()); // Che mette i compoinenti uno in fianco all'altro
    p.add (new Label ("Numero di Cellulare"));
    cellulare = new TextField (20);
    p.add (cellulare); // Aggiungo il bottone al pannello - avra' la sua dimensione naturale
    add (p); // Metto il pannello con label e campo nella seconda riga

    p = new Panel ();           // Un pannello per centrare il bottone
    p.setLayout  (new FlowLayout ()); // Che mette i compoinenti uno in fianco all'altro
    inserisci = new Button ("Inserisci");
    p.add (inserisci); // Aggiungo il bottone al pannello - avra' la sua dimensione naturale
    add (p); // Metto il pannello con il bottone nella terza riga

    messaggio = new Label ("Ok");     // Messaggio
    add (messaggio);          // Aggiungo il display nella quarta riga

  }

  // 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) {
      messaggio.setText (m + e.toString ());
  }

  // 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;
    }

    messaggio.setText ("Connesso con il database " + db);
    return c;
  }

  // Inserisce il record nella tabella 'agenda'
  // Utilizza 'PreparedStatement' (come esempio)
  void fillTable (Connection conn, String vNome, int nNumero) {
    try {
      // Crea la 'prepareStatement' con la query per l'inserimento
      PreparedStatement ps = conn.prepareStatement("insert into agenda values (?,?)");
      // Associa i valori ai '?' della query generica
      ps.setString(1,vNome);	// colonna "nome" = vNome
      ps.setInt(2,nNumero);	// colonna "cellulare" = nNumero
      ps.executeUpdate();	// executeUpdate perche' insert non ritorna dati
      ps.close();               // Occorre sempre chiudere quando abbiamo finito
      conn.close ();             // chiude la connessione
    } catch (SQLException e) {
      printException ("Non riesco inserire il record nella tabella 'agenda'",e);
      return;
    }
    messaggio.setText ("Record inserito con successo");
  }

  // Verifica i parametri e inserisce il record
  void inserisciDato () {
  Connection conn;
  String vNome = nome.getText ();
  String sNumero = cellulare.getText ();
  int nNumero;
    try {
      nNumero = Integer.parseInt (sNumero);
    } catch (NumberFormatException e) {
      messaggio.setText ("Il numero di cellulare deve essere un numero");
      return;
    }
    if (vNome.compareTo ("") == 0) {
      messaggio.setText ("Devi inserire un nome");
      return;
    }
    if (nNumero <= 0) {
      messaggio.setText ("Devi inserire un numero di cellulare (positivo)");
      return;
    }
    conn = Conn ("//" + server + "/" + database, user, password, driver);
    if (conn != null) {
      fillTable (conn, vNome, nNumero);   // Inserisce il record
    }
  }

  // Gestione del bottone
  public boolean action(Event event, Object arg) {
    if (event.target == inserisci) {
      inserisciDato ();             // ed esegue il test del database
    }
    return true;
  }
	
}