ePrometeusCorsoJavaJava
testi articoli
Testi Articoli  Download
Home | Eshop | Java | Tools | Web | 
CorsoJava è ora Video! Free for all!
Clicca Qui!

FRAMEWORK SERVLET JAVA
Un framework per applicazioni Web in Java
Usare le Servlet
Interfaccia delle HttpServlet
Un compilatore di HTML
Semplificare le query
L'Agenda Web
Conclusioni
Bibliografia e Listati
L'autore

<<< L'Agenda Web >>>

Nel listato 3 possiamo vedere tutto quanto visto finora riassunto in una miniapplicazione completa: una Agenda Web. È semplice perché coninvolge una sola tabella ma è emblematica delle tipiche applicazioni Web, ed esemplifica un po' tutte le problematiche che abbiamo affrontato: separazione di HTML e Java, connessione a database, esecuzione di SELECT, INSERT, UPDATE e DELETE, caricamento di dati da una form e inserimento nel database, eccetera. Notare dunque che viene usata HttpServlet come base, che il metodo principale è select che seleziona il da farsi in base al parametro op e che prende i dati da elaborare da una HttpData.


////////////////////////////////////////////////////
//FILE: agenda/Agenda.java
////////////////////////////////////////////////////
package agenda;

import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Agenda extends HttpServlet
{
  /// Parametri di default
  public static String driver    = "interbase.interclient.Driver";
  public static String dburl     = "jdbc:interbase://127.0.0.1/C:/AGENDA.GDB";
  public static String username  = "SYSDBA";
  public static String password  = "masterkey";

  Connection con = null;
  Statement stat = null;
  PreparedStatement select = null;
  String select_sql = "select Id, Nome, Societa, Indirizzo, Telefono, Fax, Email, Nota from Indirizzi order by Nome ASCENDING";
  PreparedStatement select_one = null;
  String select_one_sql = "select Id, Nome, Societa, Indirizzo, Telefono, Fax, Email, Nota from Indirizzi where id=?";
  PreparedStatement delete = null;
  MarkedStatement insert = null;
  MarkedStatement update = null;

  private void initConnection()
  {
    try
    {
      if(con!= null)
        con.close();
        
      Class.forName(driver);
      con = DriverManager.getConnection(dburl, username, password);
      stat = con.createStatement();
      select = con.prepareStatement(select_sql);
      select_one = con.prepareStatement(select_one_sql);
      insert = new MarkedStatement(con,
          "INSERT INTO Indirizzi(Nome, Societa, Indirizzo, Telefono, Fax, Email, Nota ) "+
          "VALUES ($Nome, $Societa, $Indirizzo, $Telefono, $Fax, $Email, $Nota );");
      update = new MarkedStatement(con,
        "UPDATE Indirizzi set Nome=$Nome, Societa=$Societa, Indirizzo=$Indirizzo, Telefono=$Telefono, Fax=$Fax, Email=$Email, Nota=$Nota where Id=%Id ;");
      delete = con.prepareStatement("DELETE from Indirizzi where id=?");
    } catch(Exception ex) {
      System.err.println("Agenda.initConnection: exception "+ex.getMessage());
    }
   }
   
  AgendaList list = new AgendaList();
  AgendaEdit edit = new AgendaEdit();

  public void init(ServletConfig cfg)
  {
    String s;
    initConnection();
  }

  public void select(HttpData data, String op) throws SQLException
  {
    if(op==null)                 doDefault(data);
    else if(op.equals("NEW"))    doNEW(data);
    else if(op.equals("EDIT"))   doEDIT(data);
    else if(op.equals("INSERT")) doINSERT(data);
    else if(op.equals("DEL"))    doDEL(data);
    else if(op.equals("UPDATE")) doUPDATE(data);
    else doDefault(data);
  }


  public void doException(HttpData data) {
    initConnection(); // può essere utile resettare la connection
    super.doException(data);
  }


  public void doDefault(HttpData data) throws SQLException {
      data.setResult(select.executeQuery());
      list.expand(data);
  }


  public void doNEW(HttpData data) throws SQLException
  {
    data.set("op", "INSERT");
    edit.expand(data);
  }

  public void doEDIT(HttpData data) throws SQLException
  {
    if(data.isNull("Select"))
      doDefault(data);
    else {
      int id = data.getInt("Select");
      select_one.setInt(1, id);
      data.set("op", "UPDATE");
      data.set("Id", ""+id);
      data.setResult(select_one.executeQuery());
      edit.expand(data);
    }
  }

  public void doINSERT(HttpData data) throws SQLException
  {
    insert.copyFrom(data);
    insert.executeUpdate();
    doDefault(data);
  }

  public void doDEL(HttpData data) throws SQLException
  {
    if(!data.isNull("Select"))
    {
      delete.setInt(1, data.getInt("Select"));
      delete.executeUpdate();
    }
    doDefault(data);
  }

  public void doUPDATE(HttpData data) throws SQLException
  {
      update.copyFrom(data);
      update.executeUpdate();
      doDefault(data);
  }


  public static void main(String args[])throws Exception {
    // Test
    //new Agenda().doDefault(new HttpData(""));
    //new Demo().doINSERT(data = new HttpData("op=INSERT&id=&Nome=a&Societa=b&Indirizzo=c&Telefono=d&Fax=e&Email=f&nota=g"));
    //new Demo().doEDIT(data = new HttpData("op=EDIT&Select=4"));
    //new Demo().select(data = new HttpData("Select=3&op=DEL"), "DEL");
  }
}
////////////////////////////////////////////////////
//FILE: agenda/Agenda.java
////////////////////////////////////////////////////
<%%package agenda%>
<%%expand(HttpData data)%>
<H1 align='center'>Address Book</H1>
<FORM METHOD="GET" ACTION="/servlet/agenda.Agenda" >
<TABLE BORDER WIDTH="100%">
<TR>
 <TH><FONT SIZE=-2 FACE="Courier">*</FONT></TH>
 <TH>Name</TH>
 <TH>Company</TH>
 <TH>Address</TH>
 <TH>Phone</TH>
 <TH>Fax</TH>
 <TH>Email</TH>
</TR>

<%if(data.initRSLoop()) while(data.RSLoop()) {%>
<TR>
  <TD><INPUT TYPE=RADIO NAME="Select" VALUE="%!Id%"></TD>
  <TD WIDTH=20%><b>%!Nome%</b></TD>
  <TD WIDTH=20%>%!Societa%</TD>
  <TD WIDTH=30%><i>%!Indirizzo%</i></TD>
  <TD WIDTH=10%>%!Telefono%</TD>
  <TD WIDTH=10%>%!Fax%</TD>
  <TD WIDTH=10%><tt>%!Email%</tt></TD>
</TR>

<%if(data.fget("Nota").length()>0) { %>
  <TR>
    <TD COLSPAN=7><font size=-1><i>%!Nota%</i></font></TD>
  </TR>
<%}%>

<%}%>

<TR>
 <TD ALIGN=CENTER COLSPAN="7">
  <INPUT type=submit name=op value="NEW">
  <INPUT type=submit name=op value="EDIT">
  <INPUT type=submit name=op value="DEL">
 </TD>
</TR>
</TABLE>
</FORM>

////////////////////////////////////////////////////
//FILE: agenda/AgendaEdit.shtml
////////////////////////////////////////////////////
<%%package agenda%>
<%%expand(HttpData data)%>
<h1>Contact</h1>
<%if(data.initRSLoop()) while(data.RSLoop()) {%>
<table>
<form  action="/servlet/agenda.Agenda" method="GET">
<input type='hidden' name='op' value='%op%'>
<input type='hidden' name='id' value='%!Id%'>
<tr><th align=right>Name
    <td><input name="Nome" type=text size=40 value='%!Nome%' >
</tr>
<tr><th align=right>Company
    <td><input name="Societa" type=text size=40 value='%!Societa%' >
<tr><th align=right>Address
    <td><input name="Indirizzo" type=text size=40 value='%!Indirizzo%' >
<tr><th align=right>Phone
    <td><input name="Telefono" type=text size=20 value='%!Telefono%' >
<tr><th align=right>Fax
    <td><input name="Fax" type=text size=20 value='%!Fax%' >
<tr><th align=right>Email
    <td><input name="Email" type=text size=20 value='%!Email%' >
<tr><th align=right>Notes
    <td>
      <textarea name="nota" rows=4 cols=20>%!nota%</textarea>
<tr><td colspan=2 align=center><input type=submit value="     OK     ">
</form>
  <form action="/servlet/agenda.Demo">
  <input type=submit value="ANNULLA">
</form>
</table>
<%}%>


A questo punto il flusso le azioni da eseguire dipendono dalle azioni che si fanno. Di default si ottiene tutta l'agenda come una tabella: notare nella doDefault come venga eseguita una query preparata, e come il risultato venga stampato in una tabella sfruttando la capacità di memorizzare un ResultSet di HttpData, l'embedding di Java in HTML e la feature delle variabili che accedono ai campi del result set. La doNew e la doEdit accedono alla stessa pagina, una form. La differenza è che mentre la doNew non prepara alcun result set, la doEdit seleziona un record (in base ad un id del record da modificare ottenuto dalla form). Premendo NEW , l'azione successiva da eseguire è INSERT mentre dopo la doEdit occorre eseguire una UPDATE. Quindi viene impostata l'azione successiva usando un campo op di tipo hidden. Infine doInsert e doUpdate salvano i dati della form sfruttando il MarkedStatement: ovviamente per sfruttarlo a fondo occorre dare ai nomi dei campi della form lo stesso nome dei campi corrispondenti nel database

ePrometeus s.r.l. - Web Software House & Open Source System Integrator
MILANO - SAN BENEDETTO DEL TRONTO(AP)
Contatti: info@eprometeus.com