|
Vediamo adesso la realizzazione del carrello della spesa. Per
realizzarlo utilizziamo una sessione, in modo da mantenere traccia di
tutte le merci selezionate dall'utente. La volta scorsa abbiamo visto
che quando siamo giunti alla pagina di un prodotto da ordinare,
l'utente ha la possibilità di "annotare" il prodotto per l'ordine.
Quando si sceglie di acquistare, viene chiamata la pagina
acquista.jsp, il cui codice è mostrato nel listato
1.
<%@ include file="head.inc" %>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%
String azione = request.getParameter("action");
int totale = 0;
String ordine = new String();
Hashtable cart = (Hashtable)session.getValue("carrello");
if (cart == null) {
cart=new Hashtable();
}
if (azione.equals("aggiungi")) {
String StrIdProdotto = request.getParameter("idProdotto");
String StrNome = request.getParameter("nome");
String StrQuantita = request.getParameter("quantita");
String StrPrezzo = request.getParameter("prezzo");
int prezzoTot = Integer.parseInt(StrQuantita)*Integer.parseInt(StrPrezzo);
String[] cartProd = {
StrNome,StrIdProdotto,StrQuantita,StrPrezzo,""+prezzoTot};
cart.put(StrIdProdotto,cartProd);
session.putValue("carrello",cart);
}
else if (azione.equals("elimina")) {
String StrIdProdotto = request.getParameter("idProdotto");
cart.remove(StrIdProdotto);
session.putValue("carrello",cart);
}
%>
<br>
<center>
<table cellpadding=2>
<%
out.print("<h3 align=\"center\">Ordine</h3>");
out.print("<tr><th>Prodotto</th>\n<th>Codice</th>\n"
+"<th>Quantità</th>\n<th>Prezzo</th>\n"
+"<th>Prezzo totale</th>\n<td>Elimina</th>\n</tr>");
if (cart.size()==0) {
out.print("<tr><td colspan=6 align=center><b>"
+"<font size=4>Il tuo carrello é vuoto</font></b>"
+"</td></tr>");
}
for(Enumeration e = cart.elements();e.hasMoreElements();) {
out.print("<form action=acquista.jsp>\n"
+"<input type=hidden name=action value=elimina>");
String[] cartRow = (String[])e.nextElement();
ordine += "id:"+cartRow[1]+",qt:"+cartRow[2]+",tot:"+cartRow[4]+";";
totale += Integer.parseInt(cartRow[4]);
out.println("<tr>");
out.println(" <td>"+cartRow[0]+"</td>");
out.println(" <td align=right>"+cartRow[1]+"</td>");
out.println(" <td align=right>"+cartRow[2]+"</td>");
out.println(" <td align=right>"+cartRow[3]+"</td>");
out.println(" <td align=right>"+cartRow[4]+"</td>");
out.println(" <td><input type=hidden name=idProdotto"
+" value="+cartRow[1]+">");
out.println(" <input type=submit value=elimina>");
out.println(" </td>\n</tr>");
}
out.println("<tr><td colspan=4 align=right>"
+"<b><font size=4>Totale :</b></td>"
+"<td align=right><b> "
+totale+"</font></b></td></tr>");
// out.println(ordine);
session.putValue("totale",""+totale);
session.putValue("ordine",ordine);
%>
<tr>
<td align=center colspan=6>
<a href=/catalog/form.jsp>Checkout</a><br>
<a href=/catalog/index.jsp>Continua gli acquisti</a>
</td>
</tr>
</table>
<%@ include file="foot.inc" %>
Questa pagina ha due funzioni: la prima è quella di
modificare il carrello della spesa, inserendo o eliminando degli
elementi, e la seconda è quella di visualizzare
l'ordine. Vediamo in dettaglio come questo viene codificato.
Come prima operazione viene esaminato il parametro action,
che viene impostato dalle pagine che chiamano
acquista.jsp. Se il valore di questo parametro è
aggiungi, viene aggiunto un elemento al carrello, mentre se
è elimina, viene tolto un elemento. Come sipuò
notare, viene utilizzato
request.getParameter("action") per estrarre il
parametro action, e
session.getValue("carrello") per estrarre l'intero
carrello della spesa.
Il carrello abbiamo detto è mantenuto nella sessione, sotto forma di
Hashtable. In base all'azione scelta viene eseguita una
operazione di modifica di questa tabella, che, notare bene, è una
struttura dati mantenuta in memoria, non un dato mantenuto nel
database. In questo modo si velocizza la gestione del carrello
risparmiando ad ogni passo una interrogazione del database. In realtà
si risparmia anche memoria perchè le strutture dati necessarie per
gestire la connessione al database generalmente consumano anche molta
più memoria di quanto non ne occorra per mantentere il carrello della
spesa.
Il resto della codice visualizza l'ordine corrente; una schermata è
mostrata in figura 1. Il codice di visualizzazione dell'ordine è
composto essenzialmente da un ciclo di stampa che prende i dati
memorizzati nella sessione e li visualizza in HTML.
Figura 1
L'aspetto più importante da comprendere è il
funzionamento della Hashtable che mantiene il carrello della
spesa. Si tratta sostanzialmente di una tabella che associa ad una
"chiave" (che di solito è una stringa) un valore, che
in questo caso è un array di stringhe. La tabella viene creata
con Hashtable ht = new Hashtable(), e vengono inseriti dei
valori con ht.put("chiave", valore). Per
recuperare il valore inserito basta utilizzare
ht.get("chiave").
La sessione ci permette di preservare la tabella tra una pagina e
l'altra, e la chiave di accesso alla tabella sono i codici che
identificano i vari prodotti. Il valore mantenuto nella tabella
può essere qualunque oggetto Java. Nel nostro caso si tratta di
un array di stringhe che contiene, nell'ordine, il nome del prodotto,
l'id del prodotto, la quantità che si desidera acquistare, il
prezzo unitario e il totale.
La pagina acquista.jsp quando visualizza il carrello
aggiunge anche dei pulsanti che consentono la rimozione di un elemento
dal carrello della spesa. Semplicemente se l'utente preme
"elimina" viene richiamata la pagina stessa con impostata
come azione elimina. Il codice interviene sul carrello,
eliminando il valore associato alla chiave prescelta, e viene
rivisualizzato il carrello.
Se invece si giunge alla pagina acquista.jsp dalla pagina
che seleziona il prodotto (prodotto.jsp, vedere l'articolo
precedente), l'azione viene impostata a "aggiungi", e il
codice interviene sul carrello per associare alla chiave (che è
il codice del prodotto), l'array corrispondente ai vari elementi
del'ordine.
|