J0 1 Marco Ronchetti - [email protected] [email protected] Basi di Dati Web e Distribuite –...

25
J0 1 Marco Ronchetti - ronchet @ dit . unitn .it “Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento Java Sql package

Transcript of J0 1 Marco Ronchetti - [email protected] [email protected] Basi di Dati Web e Distribuite –...

Page 1: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J01

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento

Java

Sql package

Page 2: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J02

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento

JDBC

Un’applicazione per la quale sia fondamentale l’indipendenzadal Database può essere scritta in Java usando le specifiche JDBC.

(Package java.sql)Non devono essere usate chiamate specifiche del database:

Si deve usare SOLO la parte di SQL definita da ANSI SQL-2 standard.

Non si deve fare ALCUN riferimento alla parte specifica di JDBC.

Page 3: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J03

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento

Strati SW per l’accesso a un DB

Page 4: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J04

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento

Type 1 – JDBC-ODBC Bridge

Javaapplication

JDBCAPI

JDBC-ODBCBridge

Datasource

ODBCAPI

The standard JDK includes sun.jdbc.odbc.JdbcOdbcDriver

Page 5: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J05

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento

Type 2 – Part Java, Part Native

Javaapplication

JDBCAPI

JDBCDriver

Datasource

VendorAPI

Page 6: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J06

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento

Type 3 – Intermediate DB Access Server

Javaapplication

JDBCAPI

JDBCDriver

Datasource

NativeDriver

JDBCDriverServer

See http://industry.java.com/products/jdbc/drivers

Page 7: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J07

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento

Type 4 – Pure Java

Javaapplication

JDBCAPI

JDBCDriver

Datasource

Page 8: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J08

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di TrentoThe JDBC object model: the

Manager.

L’oggetto centrale: java.sql.DriverManager.

Ha la responsabilita’ di tenere traccia delle varieimplementazioni JDBC che possono esistere per una applicazione.

Se, per esempio, un sistema possedesse una implementazione JDBC Sybase e una Oracle, il DriverManager sarebbe responsabile di tenere traccia di queste

implementazioni. Quando una applicazione vuole connettersi ad un database, chiede al DriverManager di darle una database connection,

usando una database URL attraverso il metodo DriverManager.getConnection().

Basandosi su questa URL, il DriverManager cerca una implementazione di Driver che accetti la URL. Ottiene quindi una implementazione di Connection

da quel Driver e la restituisce all’applicazione.

Page 9: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J09

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento

The JDBC object model: the URL.

Per permettere ad un’applicazione di definire con quale DB vuole interagire, JDBC

usa il sistema standard Internet “Uniform Resource Locator”. Una JDBC URL (Database URL) consiste delle seguenti parti:

jdbc:<subprotocol>:<subname>

Come per tutte le URL, il primo elemento e’ la specifica del protocollo – in questo caso una sorgente di dati JDBC.

Il sottoprotocollo e’ specifico della implementazione JDBC. In molti casi, e’ il nome e versione DBMS name; per esempio, syb10 indica Sybase System 10. L’elemento

subname e’ qualunque informazione specifica del DBMS che specifica dove deve connettersi. Per mSQL, la JDBC URL e’ nella forma:

jdbc:msql://hostname:port/database

A JDBC non importa che aspetto ha la URL. La sola cosa importante e’ che la implementazione desiderata di JDBC possa riconoscere la URL e avere le

informazioni di cui abbisogna per collegarsi al DB tramite la URL.

Page 10: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J010

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di TrentoThe JDBC object model: the

Driver.

Il DriverManager e’ la sola classe istanziata che JDBC 1.1 procura, a parte alcune

sottoclassi specializzate di java.util.Date e alcuni oggetti Exception.Le altre chiamate fatte dall’applicazione sono scritte in ossequio alle JDBC interfaces

che sono implementate per gli specifici DBMSs.

The java.sql.Driver Interface

Un Driver e’ essenzialmente una Connection factory. Il DriverManager usa un Driver per determinare se e’ in grado di trattare una data URL. Se uno dei Driver

nella sua lista puo’ gestire la URL, quel Driver deve creare un Connection object e restituirlo al DriverManager. Poiche’ un applicazione referenzia solo indirettamente un Driver attraverso il DriverManager, le applicazioni in genere non si preoccupano

di questa interfaccia.

Page 11: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J011

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di TrentoThe JDBC Object Model:

Statement.

The java.sql.Statement Interface

Uno Statement e’ una chiamata SQL non legata al database. It In generale e’ una semplice UPDATE, DELETE, INSERT, or SELECT in cui le colonne non sono legate a dei dati Java. Uno Statement fornisce metodi per fare le chiamate SQL e

restituisce all’applicazione il risultato di un SELECT statement il numero di righe toccate da un UPDATE, DELETE, o INSERT statement.

PreparedStatement e’ sottoclasse di Statement. E’ una chiamata precompilata al DB che richiede di legare alcuni parametri. Se la query deve essere ripetuta più volte, la

precompilazione migliora l’efficienza.

Per chiamare stored procedures, una applicazione deve usare la CallableStatement sottoclasse di PreparedStatement.

ATTENZIONE: le stored procedures spostano la logica di business ENTRO il DB!

Page 12: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J012

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento

The JDBCom: Connection & ResultSet.

The java.sql.Connection Interface

Una Connection e’ una semplice sessione di database. Come tale immagazzina informazioni di stato concernenti la sessione di DB che gestisce e fornisce alla

applicazione oggetti di tipo Statement, PreparedStatement, o CallableStatement per fare chiamate durante la sessione.

The java.sql.ResultSet Interface

Una applicazione ottiene I dati restituiti da una query SELECT attraverso l’implementazione dell’interfaccia java.sql.ResultSet interface. Specificatamente, l’oggetto ResultSet permette all’applicazione di ottenere sequenze di righe di dati

restituite dalla precedente SELECT. Il ResultSet fornisce una moltitudine di metodi che permettono di ottenere una data riga in qualunque tipo di dati java abbia senso.

Per esempio, se nel DB c’e’ una data memorizzata come datetime, la si puo’ ottenere tramite il metodo getString() e usarla come una String.

Page 13: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J013

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento

The JDBC object model: the MetaData.

The Meta-Data Interfaces

Meta data sono dati che riguardano i dati. In particolare, sono I dati che danno informazioni concernenti il DB e i dati ottenibili dal DB. Java fornisce due meta-data

interfaces: java.sql.ResultSetMetaData e java.sql.DatabaseMetaData.

La ResultSetMetaData interface da’ modo di ottenere informazioni su un particolare ResultSet. Per esempio, tra altre cose, ResultSetMetaData dà informazioni sul

numero di colonne nel result set, il nome di una colonna, e il suo tipo.

La DatabaseMetaData interface, d’altra parte, fornisce all’applicazione informazioni sul database in generale, come quale livello di supporto ha, il suo nome, versione

ecc.

La classe DatabaseMetaData e’ usata ad esempio da strumenti di sviluppo come JBuilder.

Page 14: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J014

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento

Relazioni tra le classi di java.sql

Applicazione

PreparedStatement

CallableStatement

Connection

getConnection()creates

createStatement()

executeQuery()

Result Set creates

getString()

Result SetMetadata

DB MetaData

loadsDriverManager

Driver

creates

Statement

creates

Page 15: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J015

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento

Simple Database Access Using the JDBC Interfaces

Scrivere una applicazione di Database usando solo chiamate JDBC comporta i seguenti passi:

1.Chiedi al DriverManager una implementazione di Connection. 2.Chiedi alla Connection uno Statement o una sottoclasse Statement per eseguire il tuo SQL. 3.Per le sottoclassi di Statement, lega i parametri da passare alla prepared statement. 4.Esegui lo statement. 5.Per le queries, processa il result set ritornato dalla query. Ripetilo per tutti i result set finche’ ce ne sono.6.Per gli altri other statements, leggi il numero di righe toccate. 7.Chiudi lo statement. 8.Processa cosi’ tutti gli statement che servono e poi chiudi la connessione.

Page 16: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J016

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento

Setting del Control Panel ODBC

Page 17: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J017

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento

Primo esempio

package first;import java.lang.*;import java.util.*;import java.sql.*;import sun.jdbc.odbc.*;import java.io.*;

public class first{

public static void main(String arg[]) { int id; float amount; java.sql.Date dt; String companyName; String result; String item_desc;

try {//connect to ODBC database

Class.forName( sun.jdbc.odbc.JdbcOdbcDriver");

String url = "jdbc:odbc:cityzoo"; // connect Properties p = new Properties(); p.put("user", ""); p.put("password",""); Connection con = DriverManager.getConnection(url,p);

// create Statement object Statement stmt = con.createStatement(); String sqlselect = "Select item_nbr, wholesale_cost, " + " item_desc, company_name” +” from retail_item,company" + " where wholesale_cost<9 and” + " company.company_id=retail_item.company_id" + " order by wholesale_cost";// run query ResultSet rs = stmt.executeQuery(sqlselect);// process results while(rs.next()) { result = ""; id = rs.getInt(1); amount = rs.getFloat(2); //dt = rs.getDate(2); item_desc = rs.getString(3); companyName = rs.getString(4); result = "#"+result.valueOf(id) + " $"; result+= result.valueOf(amount) + " <"; result+= item_desc+"> <"+companyName+">"; System.out.println("Values are: " + result); }//close connection con.close(); } catch(Exception e) { System.out.println(e.getMessage()); } try { Thread.sleep(20*1000); } catch (Exception e) {} }}

Page 18: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J018

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento Applet per effettuare

interrogazioni-1

import java.applet.*;import java.awt.*;import java.awt.event.*;import java.sql.*;import sun.jdbc.odbc.*;public class AppletQuery extends Applet implements ActionListener{ Choice colorChoice; Choice sizeChoice; Button searchButton; TextArea resultsTextArea; ResultSet rs; Statement stmt; Connection con;

public void init(){

Panel layout_area; Panel search_area; Panel result_area; String stringSelect; // set background to white setBackground(new

Color(255,255,255));

// create border layout as default setLayout(new BorderLayout()); layout_area = new Panel(); layout_area.setLayout(new BorderLayout());

// add layout_area to top of background panel add("North",layout_area);

// add top label to layout setFont(new Font("Helvetica",Font.BOLD,12)); layout_area.add("North",new Label ("Enter value(s) to search on:")); setFont(new Font("Helvetica",Font.PLAIN,12));

// create gridlayout search panel// add to background layout { search_area = new Panel(); search_area.setLayout(new FlowLayout(1,5,5)); layout_area.add("Center",search_area); // create color Choice object // add to layout with label // create Choice object colorChoice // add colors to Choice object colorChoice = new Choice(); search_area.add(colorChoice); search_area.add(new Label("Color:"));

Page 19: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J019

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento Applet per effettuare

interrogazioni -2

// create size Choice object// add to layout with Label// create Choice object sizeChoice// add sizes to Choice object sizeChoice = new Choice(); search_area.add(sizeChoice); stringSelect = "Select Distinct retail_item.color" + " from retail_item "; colorChoice.addItem(""); rs = processRequest(stringSelect); try { while (rs.next()) { String color=rs.getString(1); System.out.println(color); colorChoice.addItem(color); } } catch (Exception e) {}

sizeChoice.addItem(""); stringSelect = "Select Distinct size" + " from retail_item "; rs = processRequest(stringSelect); try { while (rs.next()) { String size=rs.getString(1); System.out.println(size); sizeChoice.addItem(size); } } catch (Exception e) {} search_area.add(new Label("Size:")); search_area.add(new Label(" ")); searchButton = new Button(" Search "); searchButton.addActionListener(this); search_area.add(searchButton);}

Page 20: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J020

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento Applet per effettuare

interrogazioni -3

// create another panel for the result set// make the type of layout GridBagLayout { result_area = new Panel(); // add results label setFont(new Font("Helvetica",Font.BOLD,12)); add("Center", new Label("Results:")); setFont(new Font("Courier",Font.PLAIN,12)); add("South",result_area); GridBagLayout gridbag = new GridBagLayout(); result_area.setLayout(gridbag); GridBagConstraints Constraints = new GridBagConstraints(); Constraints.weightx=1.0; Constraints.weighty=1.0; Constraints.anchor=GridBagConstraints.CENTER; Constraints.fill = GridBagConstraints.BOTH; Constraints.gridwidth = GridBagConstraints.REMAINDER;

// create results text area resultsTextArea = new TextArea(15,60);

// add with constraints to layout gridbag.setConstraints(resultsTextArea,Constraints); result_area.add(resultsTextArea);

resultsTextArea.setEditable(false); }}

Page 21: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J021

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento Applet per effettuare

interrogazioni-4

// check to see if event was search button being pressed;// if so// connect to database// create query// send statement// process results// else// disregard// public void actionPerformed(ActionEvent event) { if (event.getSource() == searchButton) { String whereString = buildWhere();

// execute statement String stringSelect = "Select retail_item.item_nbr," + "retail_item.item_desc,retail_item.qty_per_pkg," + "retail_item.color," + "retail_item.size,retail_item.retail_cost " + "from retail_item" + whereString; resultsTextArea.setText("working..."); showResults(processRequest(stringSelect));

} }

Page 22: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J022

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento Applet per effettuare

interrogazioni-5

// process_request // // connect to database // build where clause // retrieve data // output results public ResultSet processRequest(String stringSelect) { try { //connect to database Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String url = "jdbc:odbc:cityzoo";

// connect con = DriverManager.getConnection(url, "", "");

// create Statement stmt = con.createStatement();

rs = stmt.executeQuery(stringSelect); } catch (Exception e) { // resultsTextArea.setText(e.getMessage()); }

return rs; }

Page 23: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J023

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento Applet per effettuare

interrogazioni-6

public void showResults(ResultSet rs) { String tempString = ""; String stringResult = ""; resultsTextArea.setText("Processing Results..."); try { while (rs.next()) { tempString = rs.getString(1) + "\t";// get item number stringResult+=tempString;

tempString=rs.getString(2) + "\t";// get description stringResult+=tempString; tempString = rs.getString(3) + "\t";// get qty stringResult+=tempString;

tempString = rs.getString(4) + "\t";// get color if (rs.wasNull()) {

tempString = "\t\t"; } stringResult+=tempString;

tempString= rs.getString(5) + "\t";// get size if (rs.wasNull()) { tempString = "\t\t"; } stringResult+=tempString; // get retail cost

tempString="$" + rs.getString(6) + "\n"; stringResult+=tempString; }

if (stringResult == "") { stringResult = "No Data Found \n"; } resultsTextArea.setText(stringResult); stmt.close(); rs.close(); } catch (Exception e) { resultsTextArea.setText(e.getMessage()); }}

Page 24: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J024

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento Applet per effettuare

interrogazioni-7

if (colorString != null) { whereString = " Where "; whereString = whereString +

" retail_item.color = '" + colorString + "'";

} if (sizeString != null) { if (whereString == null) { whereString = " Where "; } else { whereString = whereString + " and "; } whereString = whereString +

" retail_item.size = '" + sizeString + "'";

} if (whereString == null) { whereString = ""; } return whereString; }}

// buildWhere//// check Choice components// if an item is selected and is not//the one at position 0, access the selected item//// if choice is category, access the category code// return generated where clause public String buildWhere() { String colorString = null; String sizeString = null; String whereString = null; int colorInt = colorChoice.getSelectedIndex(); if (colorInt > 0) { colorString = colorChoice.getSelectedItem(); }

int sizeInt = sizeChoice.getSelectedIndex(); if (sizeInt > 0) { sizeString = sizeChoice.getSelectedItem(); }

Page 25: J0 1 Marco Ronchetti - ronchet@dit.unitn.it ronchet@dit.unitn.it Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.

J025

Marc

o R

onch

ett

i

-

ronch

et@

dit

.unit

n.it

“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento

Esercizio

Creare nel DB una tabella contenente i campi:

ID nome cognome

Costruire una pagina Welcome.html che dice“Benvenuto, clicca qui per proseguire”.

Cliccando si invoca una servlet che verifica l’esistenza di un cookie con la proprieta’ ID. • Se il cookie esiste, la servlet cerca nel DB nome e cognome e genera

una pagina che dice “Ciao nome cognome, sei un vecchio cliente”.• Se invece il cookie non esiste, la servlet restituisce una pagina HTML

contenente una Form che chiede Nome e cognome, in risposta alla qualeSi genera un ID, si registrano I dati nel DB e si risponde “Ciao nome cognome, sei stato registrato come nuovo cliente”.

Per ragioni di debugging e’ anche utile scrivere una pagina che invoca unaServlet che cancella il cookie e rimuove il record corrispondente del DB.