Laboratorio di Sistemi Database a oggetti: db4o Jsp [Java]

Documenti analoghi
Laboratorio di Sistemi Prototipo applicazione Biblioteca Jsp [Java]

Laboratorio di Sistemi Serializzare mediante file Java

Laboratorio di Sistemi DAO JSP (Java)

Laboratorio di Sistemi CRUD con MySQL JSP (Java)

Laboratorio di Sistemi Ordinamento di oggetti Java

Laboratorio di sistemi Information hiding Jsp [Java]

Laboratorio di sistemi Autenticazione utente mediante scriplet Jsp [NetBeans]

Laboratorio di Sistemi Accesso a un database Jsp [NetBeans]

Laboratorio di sistemi Web Application in Php5 Php

// inizializzazione della biblioteca con utenti, libri e prestiti // non richiesta Biblioteca.inizializza();

Laboratorio di Sistemi Accesso a un database MySQL NetBeans [Jsp]

Laboratorio di Sistemi Fattoriale di un numero Jsp [Java]

Laboratorio di Sistemi Serializzazione JSP (Java)

Laboratorio di sistemi ArrayList e file sequenziali Jsp [NetBeans]

Laboratorio di Sistemi Fondamenti di JDBC (parte2) Java. Implementare l'ereditarietà nel modello Relazionale

1 Gestione dell utente connesso in sessione con Java Server Pages, Java Beans, Servlet

Laboratorio di sistemi JSTL e database Jsp [NetBeans]

Laboratorio di sistemi Fortune Java/Jsp

E7 Esercizi sul Capitolo 7 Realizzazione di Classi

Laboratorio di sistemi Tag personalizzati Jsp [NetBeans] Sezione A

Corso di PHP. Prerequisiti. 8.1 PHP e MySQL. Conoscenza MySQL Tecnica della programmazione

Laboratorio di sistemi Prima Web Application JSP [Java]

Laboratorio di sistemi Strutture dati ricorsive (2) Java

hashmap.pdf Pag. 1/6 Cozzetto

Introduzione alle JSP

Introduzione Programmazione Java

Laboratorio di sistemi SELECT e checkbox Jsp [Java]

Fondamenti di informatica T-1 (A K) Esercitazione 8: classi e oggetti

System.out.println("Inserire il cognome del cliente " + k + " : "); cognome = in.readstring();

Laboratorio di sistemi MVC versione 2 Jsp (NetBeans)

Esempio su strutture dati dinamiche: ArrayList

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Laboratorio di Sistemi Autenticazione utente mediante MySQL Jsp [Java]

Creazione, eliminazione, lettura e scrittura di file di testo

Fondamenti di informatica T-1 (A K) Esercitazione 9: array

Laboratorio di sistemi MVC Jsp [NetBeans]

ESERCITAZIONE: AZIENDA

Istruzioni per la creazione delle pagine Contratto e Scheda

Esercitazione n 2. Obiettivi

Tecnologie di Sviluppo per il Web

Creazione, eliminazione, lettura e scrittura di file di testo

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Programmazione ad Oggetti

Implementazione delle classi

Esempio su strutture dati dinamiche: ArrayList

Laboratorio di Sistemi Polimorfismo Java. Prerequisiti: per la comprensione dell'articolo è necessario conoscere il concetto di Ereditarietà in Java.

Prova d Esame Compito A

<html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>jsp Page</title> </head> <body>

E21 Esercizi sulle collezioni in Java

// fase di inizializzazione della redazione. Parte non richiesta. System.out.println("Inserisci i dati del capo redazione: ");

JDBC. Paolo Atzeni. 11 marzo Progettazione di applicazioni, una premessa

LE PRIME ACTIVE SERVICE PAGE: oggetto REQUEST

E18 Esercizi su ereditarietà e polimorfismo

La fase di progetto e realizzazione. PROGETTAZIONE DEL SOFTWARE (Ing. Gestionale) Diagramma delle classi realizzativo

Java: Definire Classi e Creare Oggetti

COMPITO DI LABORATORIO DI PROGRAMMAZIONE Dicembre Alcune Soluzioni

Laboratorio di Sistemi Classi e relazioni Java

Java Gli array. Array

Esempio su strutture dati dinamiche: ArrayList

Esempio su strutture dati dinamiche: ArrayList

Gestione delle eccezioni

Verso l architettura MVC-2 Java Server Pages (JSP)

Verso l architettura MVC-2 Java Server Pages (JSP)

Visualizzazione ordini in MyShopDB

Programmazione. Cognome... Nome... Matricola... Prova scritta del 20 febbraio 2012

NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) E N G I N E = I

Le JavaServer Pages - Lezione 7 I JavaBean

Corso sul linguaggio Java

Trasformare una Java (Console) Application in una Web Application (con utilizzo di un database MySQL)

ESERCIZIO 1 ESERCIZIO 1

Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

Programmazione in Java. Indipendenza dalla piattaforma. Indipendenza dalla piattaforma. Autore: Roberto Fabbrica Diapo 1.

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Alberi Binario in Java

A. Ferrari Object Oriented Design

Verso l architettura MVC-2 Java Server Pages (JSP)

D B M G Il linguaggio HTML

Programmazione Web D B M G. Il linguaggio HTML

Liberamente adattato da Java dai fondamenti alla programmazione avanzata JS2E versione 1.5 di Karsten Samaschke, Apogeo editrice

Il sito della MultisalaOz [ dispone di un archivio dei film già proiettati.

Java Gli array. Array

@2011 Politecnico di Torino 1

Laboratorio di sistemi Verifica del 29 marzo V Java

GESTIONE DEGLI ERRORI

GESTIONE DEGLI ERRORI

Collezioni, mappe e iteratori (a cura del Prof. Marco Patella)

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Esempio: Tombola! Vogliamo progettare una applicazione che realizza il gioco della tombola Versione semplificata: un banco, un

Laboratorio di Basi di Dati

Classi ed Oggetti. Fondamenti di Informatica A-K

Verso l architettura MVC-2 i JavaBeans

Prova scritta del 13 luglio 2010

Laboratorio di Sistemi Prototipo autenticazione utente Jsp [Java]

Prova d Esame Compito A

Esercitazione n 2. Obiettivi

A. Ferrari Object Oriented Design

Siti web centrati sui dati Architettura MVC-2: JSP

MyShopDB = MyShop + MySQL

Transcript:

(liberamente adattato da www.db4o.com) db4o (database for objects) db4o (www.db4o.com) è un database open source che consente agli sviluppatori Java e.net di rendere persistenti gli oggetti (cioè salvarne lo stato su un supporto esterno) di un applicativo con una sola riga di codice, non importa quanto complessa sia la struttura degli oggetti, perchè li memorizza esattamente nel modo in cui sono definiti dall'applicazione, eliminando la necessità di definire e mantenere un modello dati rigido e separato (come accade in un database relazionale). Il modello a oggetti infatti è creato e aggiornato on demand da db4o stesso durante la transazione. Primi passi L'utilizzo di db4o è piuttosto semplice: si scarica una singola libreria disponibile all'indirizzo http://developer.db4o.com/files/default.aspx#db4o_database_engine (una dll o un file jar, nel nostro caso il file jar db4o-6.4.14.8131-java5.jar, contenuto nel file db4-6.4-java.zip), si crea un file di database vuoto e si memorizza qualsiasi oggetto mediante chiamate a metodi. Se intendiamo realizzare un'applicazione console, possiamo mettere il file jar db4o-6.4.14.8131-java5.jar in un package e importare il package o, se dobbiamo realizzare un'applicazione web, è sufficiente copiare il file jar all'interno della cartella lib, sottocartella di WEB-INF. Cominciamo col creare una classe di supporto di prova che modella un pilota di Formula 1 (F1). Questa classe come si può notare non contiene nessuna istruzione db4o. Gli attributi sono semplicemente il nome del pilota e il suo punteggio. public class Pilot { private String name; private int points; public Pilot(String name,int points) { this.name=name; this.points=points; public int getpoints() { return points; public void addpoints(int points) { this.points+=points; public String getname() { return name; public String tostring() { return name+"/"+points; // fine classe Pilot db4o.pdf Pag. 1/13 Cozzetto

Apertura del database Per accedere o creare il database, chiamiamo il metodo Db4o.openFile( percorso/nomedb ) e otteniamo una istanza di tipo ObjectContainer. ObjectContainer db = Db4o.openFile( f1.yap ); Se il file di database non esiste, ne verrà creato uno nuovo, se il file di database esiste, verrà aperto. Possiamo comunque gestire con try/catch tutte le situazioni di errore. Memorizzazione degli oggetti Per memorizzare un oggetto, usiamo il metodo set() dell'oggetto db, come nel seguente esempio: // memorizza il primo pilota Pilot pilot1=new Pilot("Michael Schumacher",100); db.set(pilot1); System.out.println("Stored "+pilot1.tostring()); Stored Michael Schumacher/100 // memorizza il secondo pilota Pilot pilot2=new Pilot("Rubens Barrichello",99); db.set(pilot2); System.out.println("Stored "+pilot2.tostring()); Stored Rubens Barrichello/99 Recupero degli oggetti db4o supporta tre differenti tipi di query: Query by Example (QBE), Native Queries (NQ) e SODA Query API (SODA). Useremo una QBE e il metodo statico listresult(). I risultati vengono restituiti come oggetti di tipo ObjectSet. public static void listresult (ObjectSet result){ System.out.println(result.size()); while(result.hasnext()) { System.out.println(result.next()); // fine while // fine metodo listresult Per recuperare i due piloti, forniamo un prototipo vuoto: // ritrova tutti i piloti mediante QBE // lo 0 non significa i piloti con punteggio 0 Pilot proto=new Pilot(null,0); ObjectSet result=db.get(proto); listresult(result); 2 Michael Schumacher/100 Rubens Barrichello/99 db4o.pdf Pag. 2/13 Cozzetto

db4o fornisce anche una scorciatoia per ottenere tutte le istanze di una classe: // recupera la lista dei piloti ObjectSet result=db.get(pilot.class); listresult(result); 2 Michael Schumacher/100 Rubens Barrichello/99 oppure per il JDK 5 usando il metodo query: List <pilots> = db.query(pilot.class); Se vogliamo trovare un pilota mediante il nome: // ritorna il pilota conoscendo il nome Pilot proto=new Pilot("Michael Schumacher",0); ObjectSet result=db.get(proto); listresult(result); 1 Michael Schumacher/100 oppure i piloti con un determinato numero di punti: // ritorna l'elenco dei piloti con un determinato punteggio Pilot proto=new Pilot(null,100); ObjectSet result=db.get(proto); listresult(result); 1 Michael Schumacher/100 Aggiornamento Per aggiornare un oggetto, si ha a disposizione lo stesso metodo set() che si usa per salvare; dopo aver modificato l'oggetto basta richiamare ancora il metodo set(): // aggiorna il punteggio di un pilota ObjectSet result=db.get(new Pilot("Michael Schumacher",0)); Pilot found=(pilot)result.next(); found.addpoints(11); db.set(found); System.out.println("Added 11 points for "+found); retrieveallpilots(db); dove retrieveallpilots() è il metodo public static void retrieveallpilots(objectcontainer db) { ObjectSet result=db.get(pilot.class); listresult(result); db4o.pdf Pag. 3/13 Cozzetto

Added 11 points for Michael Schumacher/111 2 Michael Schumacher/111 Rubens Barrichello/99 Cancellazione Gli oggetti sono rimossi mediante il metodo delete() // cancella un pilota mediante il nome ObjectSet result=db.get(new Pilot("Michael Schumacher",0)); Pilot found=(pilot)result.next(); db.delete(found); System.out.println("Deleted "+found); retrieveallpilots(db); Deleted Michael Schumacher/111 1 Rubens Barrichello/99 L'esercitazione 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), come mostrato nelle figure seguenti: db4o.pdf Pag. 4/13 Cozzetto

Per semplicità supponiamo la relazione Libro->Autore sia di tipo molti a uno. / Libro.java Created on 7 aprile 2008, 20.38 / package it.mauriziocozzetto.classipkg; / @author maurizio / public class Libro { private String isbn; private String titolo; private Autore autore; / Creates a new instance of Libro / public Libro() { public Libro(String isbn, String titolo) { this.setisbn(isbn); this.settitolo(titolo); public Libro(String isbn, String titolo, Autore autore) { this.setisbn(isbn); this.settitolo(titolo); this.setautore(autore); public String getisbn() { return isbn; public void setisbn(string isbn) { this.isbn = isbn; public String gettitolo() { return titolo; public void settitolo(string titolo) { this.titolo = titolo; db4o.pdf Pag. 5/13 Cozzetto

public Autore getautore() { return autore; public void setautore(autore autore) { this.autore = autore; // fine classe Libro / Autore.java Created on 7 aprile 2008, 20.39 / package it.mauriziocozzetto.classipkg; / @author maurizio / public class Autore { private int idautore; 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(); // seguono setter e getter public int getidautore() { return idautore; public void setidautore(int idautore) { this.idautore = idautore; db4o.pdf Pag. 6/13 Cozzetto

public String getcognome() { return cognome; public void setcognome(string cognome) { this.cognome = cognome; public String getnome() { return nome; public void setnome(string nome) { this.nome = nome; public boolean equals(string anagrafica) { return this.getanagrafica().equals(anagrafica); // fine classe Autore Ora con la classe CreaElenchiDB4o creiamo la base di dati a oggetti (package it.mauriziocozzetto.db, file biblioteca.dat) inserendo dei dati di esempio: / CreaElenchiDB4o.java Created on 12 aprile 2008, 17.45 / package it.mauriziocozzetto.classipkg; import com.db4o.db4o; import com.db4o.objectcontainer; import com.db4o.objectset; import java.util.list; / @author maurizio / public class CreaElenchiDB4o { // reference al database static ObjectContainer db; / Creates a new instance of CreaElencoAutoriDB4o / public CreaElenchiDB4o() { apri(); creaelencoautori(); creaelencolibri(); db4o.pdf Pag. 7/13 Cozzetto

List<Autore> elencoautori = trovaautori(); stampaautori(elencoautori); List<Libro> elencolibri = trovalibri(); stampalibri(elencolibri); db.close(); // fine metodo costruttore public static void main(string[] args) { CreaElenchiDB4o elenchidb4o = new CreaElenchiDB4o(); public static void stampaautori(list<autore> autori) { for (Autore a : autori) System.out.println(a.getAnagrafica()); public static void stampalibri(list<libro> libri) { for (Libro l : libri) System.out.println(l.getTitolo()); public static void chiudi() { db.close(); public static void apri() { db = Db4o.openFile("src/java/it/mauriziocozzetto/db/biblioteca.dat"); public static List<Autore> trovaautori() { List<Autore> autori = db.query(autore.class); return autori; public static List<Libro> trovalibri() { List<Libro> libri = db.query(libro.class); return libri; public static void salvaautore(autore a) { db.set(a); public static void salvalibro(libro l) { db.set(l); public static void creaelencoautori() { 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 db4o.pdf Pag. 8/13 Cozzetto

public static void creaelencolibri() { Autore a = new Autore(5,"Ferrari","Fabrizio"); salvaautore(a); salvalibro(new Libro("123-2345-221-3","Java: dalle basi alla programmazione avanzata",a)); salvalibro(new Libro("321-2314-211-4","Java J2EE",a)); salvalibro(new Libro("278-8483-288-2","2001, a space odissey",a)); salvalibro(new Libro("829-903-6261-3","JavaServer Pages e Servlet",a)); salvalibro(new Libro("785-4567-897-8","C#: la Bibbia",a)); Autore b = new Autore(6,"Gosling","James"); salvaautore(b); salvalibro(new Libro("876-5789-866-8","Java2, il Manuale Ufficiale",b)); salvalibro(new Libro("567-8767-455-7","Java, la grande Guida",b)); salvalibro(new Libro("727-8383-772-3","2010, l'anno del contatto",b)); salvalibro(new Libro("732-4388-432-3","JavaServer Pages: basi di J2EE",b)); salvalibro(new Libro("377-4899-329-2","C++: il manuale che non c'è",b)); // fine metodo creaelencolibri // fine classe CreaElenchiDB4o Possiamo osservare il contenuto della nostra base di dati a oggetti usando l'object Manager disponibile all'indirizzo http://developer.db4o.com/files/folders/objectmanager_61/default.aspx db4o.pdf Pag. 9/13 Cozzetto

A questo punto progettiamo la classe DAO (data access object). Essa conterrà tutte le interrogazioni alla base dati e fornirà i ResultSet (ma sarebbe meglio dire gli ObjectSet) richiesti. / DAO.java Created on 7 aprile 2008, 21.20 / package it.mauriziocozzetto.classipkg; import java.io.file; import java.net.urisyntaxexception; import java.util.list; import com.db4o.db4o; import com.db4o.query.predicate; import com.db4o.objectcontainer; import com.db4o.objectset; import it.mauriziocozzetto.classipkg.autore; import it.mauriziocozzetto.classipkg.libro; / @author maurizio / public class DAO { // reference al database private ObjectContainer db; / Creates a new instance of DAO / public DAO() { db4o.pdf Pag. 10/13 Cozzetto

// restituisce i titoli dei libri (come valori stringa) public String[] getelencotitoli() { List<Libro> libri = getlibri(); int numlibri = libri.size(); String s[] = new String[numLibri]; int i = 0; for (Libro l : libri) { s[i] = l.gettitolo(); i++; return s; // restituisce la lista dei libri public List<Libro> getlibri() { return db.query(libro.class); // resituisce la collection dei libri scritti da un determinato autore public List<Libro> getelencolibriautore(final String anagrafica) { // è una NQ, Native Query, query "nativa" // consulta il sito www.db4o.com // restituisce l'elenco dei libri di un certo autore List <Libro> elencolibri = db.query(new Predicate<Libro>() { public boolean match(libro libro) { // se l'anagrafica dell'autore del libro coincide con il parametro allora true return libro.getautore().equals(anagrafica); ); return elencolibri; // fine metodo getelencolibriautore() // ritorna la collection degli autori public List<Autore> getautori() { return db.query(autore.class); // restituisce le anagrafiche degli autori public String[] getelencoautori() { List<Autore> autori = getautori(); 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 getelencoautori db4o.pdf Pag. 11/13 Cozzetto

public void close() { db.close(); public void open() { File file=null; try { file = new File(getClass().getResource("/it/mauriziocozzetto/db/biblioteca.dat").toURI()); catch (URISyntaxException ex) { ex.printstacktrace(); return; String path = file.getpath(); db = Db4o.openFile(path); // fine metodo open // fine classe ElencoLibri L'applicativo vero e proprio è fatto dalla sola pagina web index.jsp: File index.jsp <%@page contenttype="text/html"%> <%@page pageencoding="utf-8"%> <%@page import="java.util.list"%> <%@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>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"/> <% // apro la base dati a oggetti dao.open(); String[] anagraficheautori = dao.getelencoautori(); %> db4o.pdf Pag. 12/13 Cozzetto

<form name="provafrm" action="${request.requesturi" method="post"> <p><select name="mnuautore"> <% for (int i = 0; i<anagraficheautori.length; i++) { %> <option><%=anagraficheautori[i]%></option> <% // fine for %> </select> <input type="submit" name="inviabtn" value="invia"/></p> </form> <% // se l'utente ha premuto sul tasto Invia if (request.getparameter("inviabtn")!=null) { // mi faccio dare l'anagrafica dell'autore String anagraficaautore = request.getparameter("mnuautore"); // trovo la lista dei libri scritti da quell'autore List<Libro> listalibri = dao.getelencolibriautore(anagraficaautore); // se non ci sono libri if (listalibri.size()==0) out.println("non ci sono libri scritti da "+anagraficaautore); else { // visualizziamo l'elenco dei libri di quell'autore for (Libro l : listalibri) out.println(l.getisbn()+" "+l.gettitolo()+" "+l.getautore().getanagrafica() +"<br/>"); // fine if %> // fine if request // chiusura della base dati dao.close(); </body> </html> db4o.pdf Pag. 13/13 Cozzetto