Aggiungiamo un servizio di gestione del carrello della spesa al negozio. Il nodo principale da sciogliere è come rendere la comunicazione HTTP stateful, ovvero come mantenere uno stato che correli le richieste eseguite da un cliente e ne tenga memoria.
La soluzione sta nelle sessioni. Quando un cliente accede alla
nostra servlet, recuperiamo la sessione con il metodo request.getSession()
.
Nota | |
---|---|
Il metodo |
Nell'oggetto HttpSession
che ci viene restituito possiamo leggere e salvare i dati di navigazione di nostro interesse,
ad esempio gli articoli dell'ordine. Ogni messaggio di risposta inviato al
cliente presenta l'header HTTP Set-Cookie
l'identificativo della sessione.
Il client inserisce questo header nella richiesta successiva
in modo che il web server sia in grado di assegnargli la stessa sessione.
Nota | |
---|---|
Ci sono due modi per un cliente di inviare l'identificativo di sessione:
|
Il nuovo servizio avrà dei nuovi messaggi. Ecco lo schema che li definisce:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:tns="http://www.negozio.org" targetNamespace="http://www.negozio.org"> <xs:element name="carrello"> <xs:complexType> <xs:sequence> <xs:element name="articolo" type="tns:voceOrdine" /> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="voceOrdine"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="quantita" type="xs:positiveInteger" use="required" /> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:schema>
La logica è piuttosto semplice: il cliente invia un elemento carrello
come richiesta, la servlet modifica le quantità in sessione aggiungendo gli articoli
nuovi e aggiornando quelli preesistenti e risponde con il carrello
aggiornato.
Creiamo una nuova servlet al nostro progetto Negozio
chiamata CarrelloServlet
ed implementiamo la logica di gestione. Per velocizzare la codifica, utilizziamo la classe Carrello.java
che fornisce i metodi per la gestione dell'XML e dei dati del carrello:
add(String nome, Integer quantita)
: aggiunge un articolo al carrello.add(InputStream xml, InputStream xsd)
: valida xml con l'xsd fornito ed aggiunge al carrello gli articoli trovati.toDOM()
: genera il DOM corrispondente all'XML del carrello.
Non rimane che implementare la gestione della sessione.
Recuperiamo o creiamo una sessione con il medoto request.getSession(true)
ottenendo un oggetto
HttpSession
su cui usare i metodi getAttribute
e setAttribute
per leggere e scrivere in sessione.
Terminata la codifica della servet, implementare un Client che interagisca con il servizio Carrello popolandolo di articoli inviando richieste in sequenza che condividono la sessione.