In questo articolo vedremo come poter recuperare dei record da un database SQL (utilizziamo PostgreSQL) da una Web Application Java utilizzando le JavaServer Pages (JSP) come tecnologia Web. Per poter accedere ad un Database SQL da codice Java è necessario ottenere un driver JDBC.
In questo articolo vedremo come poter recuperare dei record da un database relazionale SQL (utilizziamo PostgreSQL) da una Web Application Java utilizzando le JavaServer Pages (JSP) come tecnologia Web. Per poter accedere ad un Database SQL da una applicazione Java è necessario ottenere un driver JDBC. Le API Java JDBC consentono alle applicazioni Java di connettersi ad un database relazionale tramite un’API standard, rendendo le applicazioni Java indipendenti (o quasi) dall’implementazione di database scelta per l’applicazione.
In particolare JDBC standardizza come una applicazione Java può connettersi ad un database, come eseguire query su di esso, come navigare il risultato di una query, e come eseguire gli update del database, mentre non standardizza la sintassi SQL inviata al database. Questa può variare da database a database.
Scarichiamo i driver JDBC per il nostro database
Per PostgreSQL possiamo scaricare i driver JDBC andando al seguente indirizzo:
https://jdbc.postgresql.org/download.html
Nella pagina di download sono presenti i driver (con estensione .jar) per tutte le versioni di PostgreSQL e di Java per i driver JDBC versione 4 (ad esempio se abbiamo Java 8 e PostgreSQL 9.4 scarichiamo il driver 9.4.1211 JDBC 42). Potrebbero esservi delle minime differenze in base alla versione di PostgreSQL e Java utilizzate. Questa libreria verrà poi inclusa nel nostro progetto Web come vedremo in seguito.
Creiamo un database PostgresSQL di esempio
Per prima cosa creiamo un database di esempio su PostgresSQL; possiamo utilizzare il tool di amministrazione pgAdmin (PostgreSQL administration and management tools), e diamo il seguente comando:
create database appuntisoftware
successivamente creiamo una tabella anagrafica di esempio:
CREATE TABLE anagrafica
(
id serial NOT NULL,
nome character varying(50),
cognome character varying(50),
eta integer
),
CONSTRAINT anagrafica_pkey PRIMARY KEY (id)
Inseriamo dei dati di esempio all’interno della tabella anagrafica:
insert into anagrafica (nome, cognome, eta) values ('mario','rossi',33);
insert into anagrafica (nome, cognome, eta) values ('paolo','bianchi',31);
insert into anagrafica (nome, cognome, eta) values ('gianluca','verdi',19);
Creiamo l’applicazione Java di esempio in Eclipse
Creiamo ora la nostra applicazione Java. Utilizziamo l’IDE Eclipse e creiamo un Dynamic Web Project, facendo tasto destro nel Project Explorer e selezionando la voce New:
oppure, se non dovesse comparire nel menù a tendina, clicchiamo sulla voce Other…:
Inseriamo il nome del nostro progetto, abbiamo scelto TestDBConnection e lasciamo invariate le altre scelte (Apache Tomcat 8 e Specifica Servlet 3.1):
Clicchiamo su Next e proseguiamo finché non ci chiede di generare il file web.xml e spuntiamo la casella:
Una volta generato il progetto, otteniamo il seguente albero di directory:
Configuriamo il DataSource
Per poter accedere al database PostgreSQL dichiariamo una risorsa JNDI di tipo DataSource utilizzando un elemento XML di tipo Resource. Questo elemento XML contenuto a sua volta in un elemento Context andrà salvato in un file di nome context.xml. Questo file può essere creato in due differenti path a seconda degli utilizzi:
- sotto la cartella WebContent/META-INF dell’applicazione web creata e sarà disponibile solo per questa;
- sotto la cartella $CATALINA_BASE/conf, dove $CATALINA_BASE rappresenta il path (tipicamente C:\Program Files\Apache Tomcat\) dove abbiamo installato Tomcat (coincide con $CATALINA_HOME nel caso in cui non utilizziamo istanze multiple di Tomcat), rendendolo disponibile per tutte le applicazioni web che girano sotto l’istanza Tomcat.
Nel file context.xml inseriremo i parametri di configurazione del database PostgreSQL e del pool di connessioni. Tipicamente nelle applicazioni Web si utilizza un pool di connessioni in modo da velocizzare l’accesso al database, ciò perché stabilire una connessione con un database è un’operazione molto complessa. Infatti, è necessario caricare il driver del database, stabilire una comunicazione bidirezionale sicura fra l’applicazione che deve accedere ai dati e il database stesso, eseguire una procedura di autenticazione e allocare le risorse necessarie per gestire le query successive. Allora anziché creare una nuova connessione ad ogni richiesta, quando un Client non ha più bisogno dell’accesso al Database rilascia la connessione in una coda in modo da poter poi essere recuperata da un altro Client. Il DataSource di default supportato in Tomcat è basato sul DBCP connection pool del progetto Commons. In particolare dobbiamo specificare i seguenti attributi:
- name: l’identificativo della risorsa che andremo a richiamare nelle nostre pagine JSP;
- auth: dove specifichiamo il meccanismo di autenticazione, può essere Container o Application;
- driverClassName: il nome della classe del Driver JDBC specifica per ogni vendor di database (org.postgresql.Driver per PostgreSQL);
- url: la url di connessione al database, comprensiva di ip, porta e nome database;
- username e password: le credenziali di accesso al database;
- maxTotal: massimo numero di connessioni al database nel pool di connessioni. Settiamo a -1 per non porre limiti;
- maxIdle: massimo numero di connessioni in idle al database da ritenere nel pool di connessioni. Settiamo a -1 per non porre limiti;
- maxWaitMillis: massimo tempo di attesa per una connessione al database affinchè diventi disponibile in millisecondi. Una eccezione è lanciata se questo timeout è superato. Settiamo a -1 per aspettare in modo indefinito.
Un esempio di file context.xml è il seguente:
<Context>
<Resource name="jdbc/postgres" auth="Container"
type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://127.0.0.1:5433/appuntisoftware"
username="postgres" password="postgres" maxTotal="20" maxIdle="10"
maxWaitMillis="-1"/>
</Context>
Nella seconda parte dell’articolo mostriamo due esempi di pagine JSP che utilizzano il DataSource appena definito.
COMMENTS
Spiegazione molto utile, grazie!
Articolo interessante e molto esaustivo! Grazie mille!
Anche per me che sono una mezza schiappa con la tcnologia, ci ho capito quaalccosa! Quindi l’articolo è stato davvero esaustivo!