18. Applicazione Web MVC in un'architettura a 3 livelli – Esempio 4, Postgres
18.1. Il database Postgres
In questa versione, memorizzeremo l'elenco delle persone in una tabella del database Postgres 8.x [http://www.postgres.org]. Di seguito, le schermate sono state acquisite dal client EMS PostgreSQL Manager Lite [http://www.sqlmanager.net/fr/products/postgresql/manager], un client di amministrazione gratuito per il DBMS Postgres.
Il database si chiama [dbpersonnes]. Contiene una tabella denominata [PERSONNES]:

La tabella [PERSONNES] conterrà l'elenco delle persone gestite dall'applicazione web. È stata creata utilizzando le seguenti istruzioni SQL:
Non ci soffermeremo su questa tabella, che è analoga alla tabella [PERSONNES] di Firebird discussa in precedenza. Si noti, tuttavia, che i nomi delle colonne e delle tabelle sono racchiusi tra virgolette. Inoltre, questi nomi distinguono tra maiuscole e minuscole. È possibile che questo comportamento in Postgres 8.x sia configurabile. Non ho approfondito ulteriormente la questione.
La tabella [PERSONNES] potrebbe avere il seguente contenuto:

Oltre alla tabella [PERSONNES], il database [dbpersonnes] contiene un oggetto chiamato sequenza denominato [SEQ_ID]. Questo generatore produce numeri interi successivi che useremo per popolare la chiave primaria [ID] della classe [PERSONNES]. Facciamo un esempio per illustrare come funziona:
![]() |
![]() |
Possiamo vedere che il [Valore successivo] della sequenza [SEQ_ID] è cambiato (fare doppio clic su di esso + F5 per aggiornare):
![]() |
L'istruzione SQL
ci permette quindi di recuperare il valore successivo nella sequenza [SEQ_ID]. La useremo nel file [people-postgres.xml], che contiene le istruzioni SQL eseguite sul DBMS.
18.2. Il progetto Eclipse per i livelli [dao] e [service]
Per sviluppare i livelli [dao] e [service] della nostra applicazione con il database Postgres 8.x, utilizzeremo il seguente progetto Eclipse [spring-mvc-39]:

Il progetto è un semplice progetto Java, non un progetto web Tomcat.
Cartella [src]
Questa cartella contiene il codice sorgente per i livelli [dao] e [service]:

Tutti i file con [postgres] nel nome potrebbero essere stati modificati o meno rispetto alla versione Firebird. Di seguito descriviamo i file modificati.
Cartella [database]
Questa cartella contiene lo script per la creazione del database Postgres per gli utenti:
![]()
cartella [lib]
Questa cartella contiene gli archivi richiesti dall'applicazione:
![]() |
Si noti la presenza del driver JDBC del DBMS Postgres 8.x. Tutti questi file fanno parte del classpath del progetto Eclipse.
18.3. Il livello [dao]
Il livello [dao] è il seguente:

Presentiamo solo le modifiche rispetto alla versione [Firebird].
Il file di mappatura [personne-postgres.xml] è il seguente:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<!-- warning - Postgresql 8 requires exact spelling of column names
et des tables ainsi que des guillemets autour de ces noms -->
<sqlMap>
<!-- alias class [Person] -->
<typeAlias alias="Personne.classe"
type="istia.st.mvc.personnes.entites.Personne"/>
<!-- mapping table [PERSONNES] - object [Person] -->
<resultMap id="Personne.map"
class="istia.st.mvc.personnes.entites.Personne">
<result property="id" column="ID" />
<result property="version" column="VERSION" />
<result property="nom" column="NOM"/>
<result property="prenom" column="PRENOM"/>
<result property="dateNaissance" column="DATENAISSANCE"/>
<result property="marie" column="MARIE"/>
<result property="nbEnfants" column="NBENFANTS"/>
</resultMap>
<!-- list of all persons -->
<select id="Personne.getAll" resultMap="Personne.map" > select "ID",
"VERSION", "NOM", "PRENOM", "DATENAISSANCE", "MARIE", "NBENFANTS" FROM
"PERSONNES"</select>
<!-- get a specific person -->
<select id="Personne.getOne" resultMap="Personne.map" >select "ID",
"VERSION", "NOM", "PRENOM", "DATENAISSANCE", "MARIE", "NBENFANTS" FROM
"PERSONNES" WHERE "ID"=#value#</select>
<!-- add a person -->
<insert id="Personne.insertOne" parameterClass="Personne.classe">
<selectKey keyProperty="id">
SELECT nextval('"SEQ_ID"') as value
</selectKey>
insert into "PERSONNES"("ID", "VERSION",
"NOM", "PRENOM", "DATENAISSANCE", "MARIE", "NBENFANTS") VALUES(#id#,
#version#, #nom#, #prenom#, #dateNaissance#, #marie#, #nbEnfants#)
</insert>
<!-- update a person -->
<update id="Personne.updateOne" parameterClass="Personne.classe"> update
"PERSONNES" set "VERSION"=#version#+1, "NOM"=#nom#, "PRENOM"=#prenom#,
"DATENAISSANCE"=#dateNaissance#, "MARIE"=#marie#, "NBENFANTS"=#nbEnfants#
WHERE "ID"=#id# and "VERSION"=#version#</update>
<!-- delete a person -->
<delete id="Personne.deleteOne" parameterClass="int"> delete FROM
"PERSONNES" WHERE "ID"=#value# </delete>
</sqlMap>
Questo è lo stesso contenuto di [people-firebird.xml] con le seguenti piccole differenze:
- i nomi delle colonne e delle tabelle sono racchiusi tra virgolette e distinguono tra maiuscole e minuscole
- l'istruzione SQL "Person.insertOne" è stata modificata nelle righe 34–41. Il modo in cui viene generata la chiave primaria con Postgres differisce da quello utilizzato con Firebird:
- riga 36: l'istruzione SQL [SELECT nextval('"SEQ_ID"')] fornisce la chiave primaria. La sintassi [as value] è obbligatoria. [value] rappresenta la chiave ottenuta. Questo valore verrà assegnato al campo dell'oggetto [Person] designato dall'attributo [keyProperty] (riga 35), in questo caso il campo [id].
- Le istruzioni SQL all'interno del tag <insert> vengono eseguite nell'ordine in cui appaiono. Pertanto, il SELECT viene eseguito prima dell'INSERT. Al momento dell'operazione di inserimento, il campo [id] dell'oggetto [Person] sarà stato aggiornato dall'istruzione SQL SELECT.
- Righe 38–40: inserimento dell'oggetto [Person]
La classe di implementazione [DaoImplCommon] del livello [dao] è quella studiata nella versione [Firebird].
La configurazione del livello [dao] è stata adattata al DBMS [Postgres]. Pertanto, il file di configurazione [spring-config-test-dao-postgres.xml] è il seguente:
<?xml version="1.0" encoding="ISO_8859-1"?>
<!DOCTYPE beans SYSTEM "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- data source DBCP -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>org.postgresql.Driver</value>
</property>
<property name="url">
<value>jdbc:postgresql:dbpersonnes</value>
</property>
<property name="username">
<value>postgres</value>
</property>
<property name="password">
<value>postgres</value>
</property>
</bean>
<!-- SqlMapCllient -->
<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource">
<ref local="dataSource"/>
</property>
<property name="configLocation">
<value>classpath:sql-map-config-postgres.xml</value>
</property>
</bean>
<!-- the [dao] layer access classes -->
<bean id="dao" class="istia.st.mvc.personnes.dao.DaoImplCommon">
<property name="sqlMapClient">
<ref local="sqlMapClient"/>
</property>
</bean>
</beans>
- righe 5–19: il bean [dataSource] ora fa riferimento al database [Postgres] [dbpersonnes], il cui amministratore è [postgres] con la password [postgres]. Il lettore dovrebbe modificare questa configurazione in base al proprio ambiente.
- riga 31: la classe [DaoImplCommon] è la classe di implementazione per il livello [dao]
Una volta apportate queste modifiche, possiamo passare ai test.
18.4. Test per i livelli [dao] e [service]
I test per i livelli [dao] e [service] sono gli stessi della versione [Firebird]. Avviamo il DBMS Postgres e poi eseguiamo i test di Eclipse. I risultati ottenuti sono i seguenti:
![]() |
Possiamo vedere che i test sono stati superati con successo con l'implementazione [DaoImplCommon]. Non sarà necessario derivare questa classe come abbiamo dovuto fare con il DBMS [Firebird].
18.5. Test dell'applicazione [Web]
Per testare l'applicazione web con il DBMS [Postgres], creiamo un progetto Eclipse [mvc-personnes-04B] in modo analogo a quello utilizzato per creare il progetto [mvc-personnes-03B] con il database Firebird (vedere la Sezione 17.7). Tuttavia, non è necessario ricreare gli archivi [personnes-dao.jar] e [personnes-service.jar]. Infatti, non abbiamo modificato alcuna classe rispetto al progetto [mvc-personnes-03B]. L'archivio [personnes-dao.jar] contiene semplicemente la classe [DaoImplFirebird], che non è più necessaria.

Distribuiamo il progetto web [mvc-personnes-04B] all'interno di Tomcat:
![]() | ![]() |
Siamo pronti per i test s. Il contenuto della tabella [PERSONNES] è ora il seguente:

Tomcat è in esecuzione. Utilizzando un browser, inviamo una richiesta all'URL [http://localhost:8080/mvc-personnes-04B]:

Aggiungiamo una nuova persona utilizzando il link [Aggiungi]:
![]() | ![]() |
Verifichiamo l'aggiunta nel database:

Il lettore è invitato a eseguire ulteriori test [aggiornamento, eliminazione].








