Esercitazione Sessioni


1. Carrello della spesa

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] Nota

Il metodo request.getSession() restituisce la sessione se ne esiste una, altrimenti ne crea una nuova.

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] Nota

Ci sono due modi per un cliente di inviare l'identificativo di sessione:

  • URL-rewiting, ovvero inserendolo nella url di richiesta: nella URL di richiesta: http://host/resource;jsessionid=123456789

  • Via header HTTP: Cookie: JSESSIONID=123456789

2. Messaggi scambiati

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.

3. Implementazione

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.

Footer BGFooter BG
Tito Flagella - © 2007-2015