Il problema - mauriziocozzetto.net · Diagramma E-R Fig. 3 – Diagramma E-R (Entity-Relationship)...

18
Laboratorio di Sistemi DAO JSP (Java) Il problema Vogliamo progettare una piccola web application che ci consenta di ottenere, scegliendo un autore da una combo box, l'elenco dei libri scritti da quell'autore (è un esempio già trattato in altre esercitazioni, in particolare si veda l'articolo “Database a oggetti: db4o” e l'esercitazione Prototipo applicazione Biblioteca”), come mostrato nelle figure seguenti: Fig. 1 – I libri (in questo caso solo uno) scritti da Michael Bowers Fig. 2 – Dettaglio del libro con immagine di copertina e introduzione Ipotizziamo che gli autori, i libri e le case editrici debbano essere memorizzati in un database MySQL (biblio_db) e che per semplicità un libro possa essere scritto da un solo autore (un autore può scrivere più libri), mentre una casa editrice può pubblicare più libri. DAO_MySQL.pdf Pag. 1/18 Cozzetto ©

Transcript of Il problema - mauriziocozzetto.net · Diagramma E-R Fig. 3 – Diagramma E-R (Entity-Relationship)...

Page 1: Il problema - mauriziocozzetto.net · Diagramma E-R Fig. 3 – Diagramma E-R (Entity-Relationship) Il modello a oggetti ... Useremo la classe CreaElenchiDAO (il cui diagramma UML

Laboratorio di Sistemi DAO JSP (Java)

Il problemaVogliamo progettare una piccola web application che ci consenta di ottenere, scegliendo un autore da una combo box, l'elenco dei libri scritti da quell'autore (è un esempio già trattato in altre esercitazioni, in particolare si veda l'articolo “Database a oggetti: db4o” e l'esercitazione “Prototipo applicazione Biblioteca”), come mostrato nelle figure seguenti:

Fig. 1 – I libri (in questo caso solo uno) scritti da Michael Bowers

Fig. 2 – Dettaglio del libro con immagine di copertina e introduzione

Ipotizziamo che gli autori, i libri e le case editrici debbano essere memorizzati in un database MySQL (biblio_db) e che per semplicità un libro possa essere scritto da un solo autore (un autore può scrivere più libri), mentre una casa editrice può pubblicare più libri.

DAO_MySQL.pdf Pag. 1/18 Cozzetto ©

Page 2: Il problema - mauriziocozzetto.net · Diagramma E-R Fig. 3 – Diagramma E-R (Entity-Relationship) Il modello a oggetti ... Useremo la classe CreaElenchiDAO (il cui diagramma UML

Laboratorio di Sistemi DAO JSP (Java)

Il modello dei datiDiagramma E-R

Fig. 3 – Diagramma E-R (Entity-Relationship)

Il modello a oggettiLa classe DAO (Data Access Object) fungerà da strato software di accesso al database.Le tre classi fondamentali Autore, Libro ed Editore “mapperanno” le tre tabelle autori_tbl, libri_tbl ed editori_tbl.

Fig. 4 – Struttura delle classi di base dell'esercitazione

Preparazione dell'ambiente di lavoro Xampp (Windows/Linux)

Xampp è un ottimo tool che fornisce allo sviluppatore in un unico pacchetto un server web (Apache2) dotato dell'estensione per il Php e un server MySQL, oltre ad altri strumenti come PhpMyAdmin, Mercury (un server di posta) ecc. Possiamo installarlo sia in ambiente Windows che Linux: maggiori dettagli per l'installazione, sono reperibili sul sito http://www.xampp.org.

DAO_MySQL.pdf Pag. 2/18 Cozzetto ©

Page 3: Il problema - mauriziocozzetto.net · Diagramma E-R Fig. 3 – Diagramma E-R (Entity-Relationship) Il modello a oggetti ... Useremo la classe CreaElenchiDAO (il cui diagramma UML

Laboratorio di Sistemi DAO JSP (Java)

Per attivarlo possiamo usare in ambiente Windows l'apposita icona presente sul Desktop o lanciare il demone (in ambiente Linux Ubuntu) mediante il comando

sudo /opt/lampp/lampp start

Per arrestare il servizio procediamo in maniera analoga cliccando due volte sull'icona di arresto del servizio (Windows) o mediante il comando

sudo /opt/lampp/lampp stop

(Linux Ubuntu). In alternativa possiamo sempre decidere di installare e configurare sulla nostra macchina i 3 servizi in maniera distinta, facendo attenzione a configurare correttamente i 3 programmi e l'ambiente di lavoro nel suo complesso. Ricordiamo che una volta attivo, il server Web Apache2 rimane in ascolto sulla porta 80 della nostra macchina e che MySQL rimane invece in ascolto sulla porta 3306. Xampp è ottimo per il test delle applicazioni web ma è sconsigliato in produzione (ad esempio MySQL dispone del solo utente root senza password).

I Driver Java Una volta costruito il database, dobbiamo procurarci i driver nativi Java MySQL, chiamati

MySQL Connector/J

(http://dev.mysql.com/downloads/connector/j/5.1.html). Dal pacchetto scaricato

mysql- connector-java-5.1.6.tar.gz

preleviamo il file

mysql-connector-java-5.1.6-bin.jar

e copiamolo (o spostiamolo) nella cartella lib di WEB-INF del nostro progetto (nel nostro caso BibliotecaDAOWebApp2), come spiegato precedentemente in altri articoli. Ricordiamo tuttavia che nelle versioni più recenti di NetBeans, questi driver si trovano già installati nel pacchetto: occorre solo aggiungerli al progetto (tasto destro del mouse sul progetto > Properties > Libraries > Add Library ... > MySQL JDBC Driver)

Le immagini Carichiamo le immagini delle copertine dei libri nella cartella web/img e inseriamo i nomi dei file immagine come contenuto della colonna imgUrl.

Access (Windows)In alternativa a Xampp, possiamo sempre preparare un database in Access e costruire mediante il Pannello di Controllo una origine dati JDBC/ODBC (per esempio chiamiamola biblio_db). Dovremo poi sostituire i driver di tipo 4 di MySQL con i driver di tipo 1 Jdbc/Odbc e la url di accesso al database nel seguente modo:

Al posto del driver

MySQL com.mysql.jdbc.Driver

di MySQL (Driver è un file .class), scriviamo

sun.jdbc.odbc.JdbcOdbcDriver

e al posto di

DAO_MySQL.pdf Pag. 3/18 Cozzetto ©

Page 4: Il problema - mauriziocozzetto.net · Diagramma E-R Fig. 3 – Diagramma E-R (Entity-Relationship) Il modello a oggetti ... Useremo la classe CreaElenchiDAO (il cui diagramma UML

Laboratorio di Sistemi DAO JSP (Java)

jdbc:mysql://localhost:3306/biblio_db?user=root&password= scriviamo

jdbc:odbc:biblio_db

dove biblio_db è il nome della nostra origine dati JDBC/ODBC.

PhpMyAdmin (Xampp)Prepariamo, usando l'utility PhpMyAdmin, la struttura delle tre tabelle autori_tbl, editori_tbl e libri_tbl (nell'ordine in figura).

Fig. 5 – Struttura delle 3 tabelle autori_tbl, editori_tbl e libri_tbl

In quest'ultima tabella (libri_tbl) , i campi idAutore e idEditore fungono da chiavi esterne. Inizialmente le tre tabelle libri_tbl, autori_tbl ed editori_tbl non contengono dati.

Le classiUseremo la classe CreaElenchiDAO (il cui diagramma UML non è rappresentato per brevità) per inserire dei dati di esempio nelle tre tabelle, ma possiamo sempre decidere di inserirli manualmente o in altro modo.

DAO_MySQL.pdf Pag. 4/18 Cozzetto ©

Page 5: Il problema - mauriziocozzetto.net · Diagramma E-R Fig. 3 – Diagramma E-R (Entity-Relationship) Il modello a oggetti ... Useremo la classe CreaElenchiDAO (il cui diagramma UML

Laboratorio di Sistemi DAO JSP (Java)

/** * Autore.java */package it.mauriziocozzetto.classiPkg;

public class Autore { private int idAutore; // PK private String cognome; private String nome; /** Creates a new instance of Autore */ public Autore() { } // costruttore con 3 argomenti public Autore(int idAutore, String cognome, String nome) { this.setIdAutore(idAutore); this.setCognome(cognome); this.setNome(nome); }

// restituisce l'anagrafica di un autore public String getAnagrafica() { return getNome() + " " + getCognome(); } // getter e setter // omessi per brevità

public boolean equals(String anagrafica) { return this.getAnagrafica().equals(anagrafica); } } // fine classe Autore

/** * Libro.java */

package it.mauriziocozzetto.classiPkg;

public class Libro { private String isbn; // PK private String titolo; private String imgUrl; private String intro; private Autore autore; // FK private Editore editore; // FK /** Creates a new instance of Libro */ public Libro() { }

DAO_MySQL.pdf Pag. 5/18 Cozzetto ©

Page 6: Il problema - mauriziocozzetto.net · Diagramma E-R Fig. 3 – Diagramma E-R (Entity-Relationship) Il modello a oggetti ... Useremo la classe CreaElenchiDAO (il cui diagramma UML

Laboratorio di Sistemi DAO JSP (Java)

public Libro(String isbn, String titolo) { this.setIsbn(isbn); this.setTitolo(titolo); } // overloading del costruttore public Libro(String isbn, String titolo, Autore autore) { this(isbn, titolo); this.setAutore(autore); } public Libro(String isbn, String titolo, Autore autore, Editore editore) { this(isbn, titolo, autore); this.setEditore(editore); }

public Libro(String isbn, String titolo, String imgUrl, String intro, Autore autore, Editore editore) { this(isbn, titolo, autore); this.setImgUrl(imgUrl); this.setIntro(intro); this.setEditore(editore); } // getter e setter omessi per brevità } // fine Libro

/** * Editore.java */package it.mauriziocozzetto.classiPkg;public class Editore { private int idEditore; // PK private String nomeEditore; private String indirizzoEditore; private String cittaEditore; public Editore( int idEditore, String nomeEditore) { this.idEditore = idEditore; this.nomeEditore = nomeEditore; } public Editore( int idEditore, String nomeEditore, String indirizzoEditore, String cittaEditore) { this.idEditore = idEditore; this.nomeEditore = nomeEditore; this.indirizzoEditore = indirizzoEditore; this.cittaEditore = cittaEditore; }

// getter e setter // omessi per brevità

} // fine classe Editore

DAO_MySQL.pdf Pag. 6/18 Cozzetto ©

Page 7: Il problema - mauriziocozzetto.net · Diagramma E-R Fig. 3 – Diagramma E-R (Entity-Relationship) Il modello a oggetti ... Useremo la classe CreaElenchiDAO (il cui diagramma UML

Laboratorio di Sistemi DAO JSP (Java)

Segue la classe CreaElenchiDAO

/** * CreaElenchiDAO.java */

package it.mauriziocozzetto.classiPkg;import java.sql.*;import java.util.ArrayList;import java.util.List;

public class CreaElenchiDAO { // reference al database MySQL static Connection conn; // costruttore public CreaElenchiDAO() throws ClassNotFoundException, SQLException { apri(); creaElencoAutori(); creaElencoEditori(); creaElencoLibri();

// per brevità non abbiamo scritto i metodi trovaEditori(), stampaEditori(), // trovaAutori() e stampaAutori() List<Libro> elencoLibri = trovaLibri(); stampaLibri(elencoLibri); chiudi(); } // fine costruttore public static void main(String[] args) throws ClassNotFoundException, SQLException { CreaElenchiDAO elenchiDAO = new CreaElenchiDAO(); }

// restituisce tutti i libri public static List<Libro> trovaLibri() throws SQLException { Statement st = conn.createStatement(); List<Libro> libri = new ArrayList<Libro>(); ResultSet rs = st.executeQuery("SELECT * FROM libri_tbl"); while (rs.next()) { String isbn = rs.getString("isbn"); String titolo = rs.getString("titolo"); //int idAutore = rs.getInt("idAutore"); Libro l = new Libro(isbn, titolo); libri.add(l); } rs.close(); st.close(); return libri; } // fine metodo trovaLibri()

DAO_MySQL.pdf Pag. 7/18 Cozzetto ©

Page 8: Il problema - mauriziocozzetto.net · Diagramma E-R Fig. 3 – Diagramma E-R (Entity-Relationship) Il modello a oggetti ... Useremo la classe CreaElenchiDAO (il cui diagramma UML

Laboratorio di Sistemi DAO JSP (Java)

public static void stampaLibri(List<Libro> libri) { for (Libro l : libri) System.out.println(l.getTitolo()); } // chiusura della connessione public static void chiudi() throws SQLException { conn.close(); }

// caricamento dei driver e apertura della connessione public static void apri() throws ClassNotFoundException, SQLException { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/biblio_db?user=root&password="); }

// registra nel database un autore public static void salvaAutore(Autore a) throws SQLException { String cognome = a.getCognome(); String nome = a.getNome(); int idAutore = a.getIdAutore(); Statement st = conn.createStatement(); String sql = "INSERT INTO autori_tbl(idAutore,cognome,nome) VALUES ("+idAutore+",'"+cognome+"','"+nome+"')"; st.executeUpdate(sql); st.close(); } // fine metodo salvaAutore // registra nel database un editore public static void salvaEditore(Editore e) throws SQLException { int idEditore = e.getIdEditore(); String nomeEditore = e.getNomeEditore(); String indirizzoEditore = e.getIndirizzoEditore(); String cittaEditore = e.getCittaEditore(); Statement st = conn.createStatement(); String sql = "INSERT INTO editori_tbl(idEditore, nomeEditore, indirizzoEditore, cittaEditore) VALUES ("+idEditore+",'"+nomeEditore+"','"+indirizzoEditore+"','"+cittaEditore+"')"; st.executeUpdate(sql); st.close(); } // fine metodo salvaEditore // registra nel database un libro public static void salvaLibro(Libro l) throws SQLException { String isbn = l.getIsbn(); String titolo = l.getTitolo(); int idAutore = l.getAutore().getIdAutore(); int idEditore = l.getEditore().getIdEditore(); Statement st = conn.createStatement(); String sql = "INSERT INTO libri_tbl(isbn,titolo,idAutore,idEditore) VALUES ('"+isbn+"','"+titolo+"',"+idAutore+","+idEditore+")"; st.executeUpdate(sql);

DAO_MySQL.pdf Pag. 8/18 Cozzetto ©

Page 9: Il problema - mauriziocozzetto.net · Diagramma E-R Fig. 3 – Diagramma E-R (Entity-Relationship) Il modello a oggetti ... Useremo la classe CreaElenchiDAO (il cui diagramma UML

Laboratorio di Sistemi DAO JSP (Java)

st.close(); } // fine metodo salvaLibro

// memorizziamo alcuni autori nel database public static void creaElencoAutori() throws SQLException { salvaAutore(new Autore(1,"Cozzetto","Maurizio")); salvaAutore(new Autore(2,"Cozzetto","Martina")); salvaAutore(new Autore(3,"Gardner","Martin")); salvaAutore(new Autore(4,"Pighizzini","Giovanni")); } // fine metodo creaElencoAutori // memorizziamo alcuni autori nel database public static void creaElencoEditori() throws SQLException { salvaEditore(new Editore(400,"Tecniche Nuove","Via Rossini 70","Novara")); } // fine metodo creaElencoEditori // memorizziamo alcuni libri scritti da 2 autori nel database public static void creaElencoLibri() throws SQLException { Autore a = new Autore(5,"Ferrari","Fabrizio"); salvaAutore(a); // crea elenco editori Editore e = new Editore(100,"Apogeo","Via Milano 50","Milano"); salvaEditore(e); Editore f = new Editore(200,"Mondadori","Via Torino 43","Milano"); salvaEditore(f); Editore g = new Editore(300,"Loescher","Via Banzai 29","Brescia"); salvaEditore(g); salvaLibro(new Libro("123-2345-221-3","Java: dalle basi alla programmazione avanzata",a,g)); salvaLibro(new Libro("321-2314-211-4","Java J2EE",a,g)); salvaLibro(new Libro("278-8483-288-2","2001, a space odissey",a,f)); salvaLibro(new Libro("829-903-6261-3","JavaServer Pages e Servlet",a,f)); salvaLibro(new Libro("785-4567-897-8","C#: la Bibbia",a,e)); Autore b = new Autore(6,"Gosling","James"); salvaAutore(b); salvaLibro(new Libro("876-5789-866-8","Java2, il Manuale Ufficiale",b,f)); salvaLibro(new Libro("567-8767-455-7","Java, la grande Guida",b,e)); salvaLibro(new Libro("727-8383-772-3","2010, lanno del contatto",b,e)); salvaLibro(new Libro("732-4388-432-3","JavaServer Pages: basi di J2EE",b,e)); salvaLibro(new Libro("377-4899-329-2","C++: il manuale che non cè",b,g)); } // fine metodo creaElencoLibri } // fine classe CreaElenchiDAO

Dopo l'esecuzione del metodo main della classe, nelle tre tabelle avremo i seguenti dati:

DAO_MySQL.pdf Pag. 9/18 Cozzetto ©

Page 10: Il problema - mauriziocozzetto.net · Diagramma E-R Fig. 3 – Diagramma E-R (Entity-Relationship) Il modello a oggetti ... Useremo la classe CreaElenchiDAO (il cui diagramma UML

Laboratorio di Sistemi DAO JSP (Java)

Fig. 6 – Dati delle tabelle autori_tbl, libri_tbl ed editori_tbl

La classe DAOLa classe DAO provvede a interfacciarsi col database e fornisce i metodi che risolvono il problema.

/* * DAO.java * * Created on 7 aprile 2008, 21.20 * */

package it.mauriziocozzetto.classiPkg;

import java.util.List;import java.sql.*;import java.util.ArrayList;

DAO_MySQL.pdf Pag. 10/18 Cozzetto ©

Page 11: Il problema - mauriziocozzetto.net · Diagramma E-R Fig. 3 – Diagramma E-R (Entity-Relationship) Il modello a oggetti ... Useremo la classe CreaElenchiDAO (il cui diagramma UML

Laboratorio di Sistemi DAO JSP (Java)

/** * * @author maurizio */public class DAO { // reference al database static Connection conn; /** Creates a new instance of DAO */ public DAO() { // } // restituisce i titoli dei libri (come valori stringa) public String[] getArrayTitoli() throws SQLException { List<Libro> libri = getListaLibri(); int numLibri = libri.size(); String s[] = new String[numLibri]; int i = 0; for (Libro l : libri) { s[i] = l.getTitolo(); i++; } return s; } // fine metodo getArrayLibri()

// restituisce la lista dei libri public List<Libro> getListaLibri() throws SQLException { Statement st = conn.createStatement(); List<Libro> libri = new ArrayList<Libro>(); ResultSet rs = st.executeQuery("SELECT * FROM libri_tbl, autori_tbl, editori_tbl WHERE autori_tbl.idAutore = libri_tbl.idAutore AND editori_tbl.idEditore = libri_tbl.idEditore"); // ciclo di lettura su tutto il RecordSet while (rs.next()) { String isbn = rs.getString("isbn"); String titolo = rs.getString("titolo"); int idAutore = rs.getInt("idAutore"); String cognome = rs.getString("cognome"); String nome = rs.getString("nome"); String nomeEditore = rs.getString("nomeEditore"); int idEditore = rs.getInt("idEditore"); // istanza di un oggetto di tipo Autore Autore a = new Autore(idAutore, cognome, nome); // istanza di un oggetto Editore Editore e = new Editore(idEditore, nomeEditore); // istanza di un oggetto di tipo Libro // (scritto dall'autore a e pubblicato dalla casa editrice e)

DAO_MySQL.pdf Pag. 11/18 Cozzetto ©

Page 12: Il problema - mauriziocozzetto.net · Diagramma E-R Fig. 3 – Diagramma E-R (Entity-Relationship) Il modello a oggetti ... Useremo la classe CreaElenchiDAO (il cui diagramma UML

Laboratorio di Sistemi DAO JSP (Java)

Libro l = new Libro(isbn, titolo, a, e); // caricamento nella lista libri.add(l); } rs.close(); st.close(); return libri; } // fine metodo getListaLibri() public Libro[] getArrayLibri() throws SQLException { List<Libro> elencoLibri = this.getListaLibri(); Libro[] arrayLibri = new Libro[elencoLibri.size()]; arrayLibri = elencoLibri.toArray(arrayLibri); return arrayLibri; } // fine metodo getArrayLibri() // restituisce la "collection" dei libri scritti da un determinato autore public List<Libro> getListaLibriPerAnagraficaAutore(String anagrafica) throws SQLException { Statement st = conn.createStatement(); List<Libro> libri = new ArrayList<Libro>(); ResultSet rs = st.executeQuery("SELECT * FROM libri_tbl, autori_tbl, editori_tbl WHERE autori_tbl.idAutore = libri_tbl.idAutore AND editori_tbl.idEditore = libri_tbl.idEditore AND Concat(RTrim(autori_tbl.nome),' ',RTrim(autori_tbl.cognome)) = '"+anagrafica+"'"); // ciclo di lettura su tutto il RecordSet while (rs.next()) { String isbn = rs.getString("isbn"); String titolo = rs.getString("titolo"); int idAutore = rs.getInt("idAutore"); String cognome = rs.getString("cognome"); String nome = rs.getString("nome"); String nomeEditore = rs.getString("nomeEditore"); int idEditore = rs.getInt("idEditore"); // istanza di un oggetto di tipo Autore Autore a = new Autore(idAutore, cognome, nome); // istanza di un oggetto Editore Editore e = new Editore(idEditore, nomeEditore); // istanza di un oggetto di tipo Libro (scritto dall'autore a e pubblicato dalla casa editrice e) Libro l = new Libro(isbn, titolo, a, e); // caricamento nella lista

DAO_MySQL.pdf Pag. 12/18 Cozzetto ©

Page 13: Il problema - mauriziocozzetto.net · Diagramma E-R Fig. 3 – Diagramma E-R (Entity-Relationship) Il modello a oggetti ... Useremo la classe CreaElenchiDAO (il cui diagramma UML

Laboratorio di Sistemi DAO JSP (Java)

libri.add(l); } rs.close(); st.close(); return libri; } // fine metodo getListaLibriPerAnagraficaAutore // ritorna la collection degli autori public List<Autore> getListaAutori() throws SQLException { Statement st = conn.createStatement(); List<Autore> autori = new ArrayList<Autore>(); ResultSet rs = st.executeQuery("SELECT * FROM autori_tbl"); while (rs.next()) { int idAutore = rs.getInt("idAutore"); String cognome = rs.getString("cognome"); String nome = rs.getString("nome"); Autore a = new Autore(idAutore, cognome, nome); autori.add(a); } rs.close(); st.close(); return autori; } // fine metodo getListaAutori() // restituisce le anagrafiche degli autori public String[] getArrayAnagraficheAutori() throws SQLException { List<Autore> autori = getListaAutori(); int numAutori = autori.size(); String s[] = new String[numAutori]; int i = 0; for (Autore a : autori) { s[i] = a.getAnagrafica(); i++; } return s; } // fine metodo getListaAnagrafiche() public Libro getLibro(String isbn) throws SQLException { Libro l = null; // creo lo statement che rappresenta l'istruzione SQL Statement st = conn.createStatement(); // trovo gli autori dei libri ResultSet rs = st.executeQuery("SELECT * FROM libri_tbl, autori_tbl, editori_tbl WHERE autori_tbl.idAutore = libri_tbl.idAutore AND editori_tbl.idEditore = libri_tbl.idEditore AND libri_tbl.isbn = '"+isbn+"'");

DAO_MySQL.pdf Pag. 13/18 Cozzetto ©

Page 14: Il problema - mauriziocozzetto.net · Diagramma E-R Fig. 3 – Diagramma E-R (Entity-Relationship) Il modello a oggetti ... Useremo la classe CreaElenchiDAO (il cui diagramma UML

Laboratorio di Sistemi DAO JSP (Java)

if (rs.next()) { String ISBN = rs.getString("isbn"); String titolo = rs.getString("titolo"); int idEditore = rs.getInt("idEditore"); String nomeEditore = rs.getString("nomeEditore"); int idAutore = rs.getInt("idAutore"); String cognome = rs.getString("cognome"); String nome = rs.getString("nome"); //String anagrafica = rs.getString("anagrafica"); String imgUrl = rs.getString("imgUrl"); String intro = rs.getString("intro"); // istanza di un oggetto di tipo Autore Autore a = new Autore(idAutore, cognome, nome); // istanza di un oggetto Editore Editore e = new Editore(idEditore, nomeEditore); // istanza di un oggetto di tipo Libro (scritto dall'autore a e pubblicato dalla casa editrice e) l = new Libro(ISBN, titolo, imgUrl, intro, a, e); } // fine if // chiudo il ResultSet e lo statement rs.close(); st.close(); return l; } // fine metodo getLibro() // chiusura della connessione public void closeConn() throws SQLException { conn.close(); } // fine metodo closeConn() // caricamento dei driver e apertura della connessione al database public void openConn() throws ClassNotFoundException, SQLException { Class.forName("com.mysql.jdbc.Driver"); System.out.println("Driver caricati."); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/biblio_db?user=root&password="); System.out.println("Connessione stabilita."); } // fine metodo openConn() } // fine classe DAO

DAO_MySQL.pdf Pag. 14/18 Cozzetto ©

Page 15: Il problema - mauriziocozzetto.net · Diagramma E-R Fig. 3 – Diagramma E-R (Entity-Relationship) Il modello a oggetti ... Useremo la classe CreaElenchiDAO (il cui diagramma UML

Laboratorio di Sistemi DAO JSP (Java)

Le pagine webEcco la pagina web index.jsp

<%@page contentType="text/html"%><%@page pageEncoding="UTF-8"%><%@page import="java.util.List"%><%@page import="it.mauriziocozzetto.classiPkg.*"%><%@page errorPage = "gestioneErrori.jsp" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Libri scritti da un certo autore</title> <style type="text/css"> body,td,th { font-family: Trebuchet MS; font-size: 16px; } </style> </head> <body>

<h3>Libri scritti da un certo autore</h3> <jsp:useBean id="dao" class="it.mauriziocozzetto.classiPkg.DAO"/> <% // apertura del database dao.openConn(); // caricamento delle anagrafiche String[] anagraficheAutori = dao.getArrayAnagraficheAutori(); %> <form name="provaFrm" action="${request.requestURI}" method="post"> <p> <select name="autoreMnu"> <% for (int i = 0; i<anagraficheAutori.length; i++) { %> <!-- caricamento delle anagrafiche nella combobox mnuAutore --> <option><%=anagraficheAutori[i]%></option> <% } // fine for %> </select> <input type="submit" name="inviaBtn" value="Invia"/> </p> </form>

DAO_MySQL.pdf Pag. 15/18 Cozzetto ©

Page 16: Il problema - mauriziocozzetto.net · Diagramma E-R Fig. 3 – Diagramma E-R (Entity-Relationship) Il modello a oggetti ... Useremo la classe CreaElenchiDAO (il cui diagramma UML

Laboratorio di Sistemi DAO JSP (Java)

<% // se l'utente ha premuto il tasto Invia if (request.getParameter("inviaBtn")!=null) { // lettura dell'anagrafica dell'autore String anagraficaAutore = request.getParameter("autoreMnu"); // elenco dei libri scritti da quell'autore List<Libro> listaLibri = dao.getListaLibriPerAnagraficaAutore(anagraficaAutore); // se la lista non contiene elementi if (listaLibri.size()==0) out.println("Non ci sono libri scritti da "+anagraficaAutore); else { // stampa dell'isbn e del titolo del libro e dell'autore (come conferma) for (Libro l : listaLibri) out.println(l.getIsbn()+" | "+l.getTitolo()+" | "+l.getAutore().getAnagrafica()+" | "+l.getEditore().getNomeEditore()+" | "+"<a href='index2.jsp?isbn="+l.getIsbn()+"'>Dettagli libro</a><br/>"); } // fine if } // fine if // chiusura del database dao.closeConn(); %> </body></html>

Segue la pagina index2.jsp

<%@page contentType="text/html"%><%@page pageEncoding="UTF-8"%><%@page errorPage = "gestioneErrori.jsp" %><%@page import = "it.mauriziocozzetto.classiPkg.*" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Accesso al database biblio_db</title> <style type="text/css"> body,td,th { font-family: Verdana; font-size: 16px; border: 0px; } .sinistra { float: left; margin-right: 9px; margin-bottom: 9px; }

DAO_MySQL.pdf Pag. 16/18 Cozzetto ©

Page 17: Il problema - mauriziocozzetto.net · Diagramma E-R Fig. 3 – Diagramma E-R (Entity-Relationship) Il modello a oggetti ... Useremo la classe CreaElenchiDAO (il cui diagramma UML

Laboratorio di Sistemi DAO JSP (Java)

.testoGrandeCorsivo { font-style: italic; font-size: 16px; } </style> </head> <body>

<h3>Dettagli libro</h3> <% // se l'utente ha cliccato sul link "Dettagli libro" nella pagina index_5.jsp if (request.getParameter("isbn") != null) { %> <!-- istanzio un javabean cioè un oggetto di tipo DAO --> <!-- equivale al codice --> <!-- DAO dao = new DAO(); --> <jsp:useBean id="dao" class="it.mauriziocozzetto.classiPkg.DAO"/> <% dao.openConn(); // recupero book_id String isbn = request.getParameter("isbn"); // carico in memoria i libri dell'autore con id noto Libro l = dao.getLibro(isbn); // se c'è il ibro if (l != null) { // visualizziamo i dati della scheda del libro out.println("<img src='img/"+l.getImgUrl()+"' class='sinistra'/>"); out.println("Isbn: "+l.getIsbn()+"<br/>Autore: <i>"+l.getAutore().getAnagrafica()+"</i><br/>Titolo: <span class='testoGrandeCorsivo'>"+l.getTitolo()+"</span><br/>Editore: "+l.getEditore().getNomeEditore()+"<br/><br/><br/><i>Introduzione:</i> "+l.getIntro()); } else { out.println("Non esiste un libro con isbn="+isbn); out.println("<br/><br/>Attendi..."); response.setHeader("Refresh","5; URL=index.jsp"); } // fine if numLibri // chiudo la connessione dao.closeConn(); } else { // se si tenta di accedere a questa pagina senza aver selezionato il link "Dettagli libro" vieniamo rediretti alla pagina index_5.jsp response.sendRedirect("index.jsp"); } // fine if request %> </body></html>

DAO_MySQL.pdf Pag. 17/18 Cozzetto ©

Page 18: Il problema - mauriziocozzetto.net · Diagramma E-R Fig. 3 – Diagramma E-R (Entity-Relationship) Il modello a oggetti ... Useremo la classe CreaElenchiDAO (il cui diagramma UML

Laboratorio di Sistemi DAO JSP (Java)

Segue pagina di gestione degli errori gestioneErrori.jsp

<%@page contentType="text/html"%><%@page pageEncoding="UTF-8"%><%@page isErrorPage = "true" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Gestione errori</title> <style type="text/css"> body,td,th { font-family: Trebuchet MS; font-size: 16px; } </style> </head> <body>

<h3>Gestione errori</h3>

Siamo spiacenti, si è verificato un errore durante l'esecuzione:<br/> <%= exception.getMessage()%> </body></html>

DAO_MySQL.pdf Pag. 18/18 Cozzetto ©