|
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¬a=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
|