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

JAVA ESHOP PARTE TERZA
Un negozio online in Java e Linux - il Carrello
L'HTTP È SENZA STATO
SESSIONI
IL CARRELLO
L'ACQUISTO
CONCLUSIONI
L'AUTORE

<<< IL CARRELLO >>>

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.

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