Beruflich Dokumente
Kultur Dokumente
Objectif
Raliser une application Web permettant un client de grer ses comptes en banque
Deconnexion
L'utilisateur quitte le systme, il doit repasser par la phase de connexion pour lister ses comptes o effectuer un virement
Philippe GENOUD UJF Grenoble janvier 2009 3
Authentification de l'utilisateur
ok
Affiche la liste des comptes accessibles par le client Permet de slectionner le compte source et le compte destination et le montant du transfert Page pour effectuer un transfert L'utilisateur n'a plus accs l'application moins de repasser par la phase d'authentification
Dconnexion
1 Page indiquant si le transfert a russi ou non Et en cas d'chec la raison de ce dernier 2 Philippe GENOUD UJF Grenoble janvier 2009 4
Client
ClientDAO
Pages JSP
Compte
CompteDAO
JDBC
Servlets
SGBD Relationnel
Les objets DAO (Data Access Object) isolent tout le code li la persistance des donnes
Quand l'application a besoin d'effectuer une opration li la persistance elle fait appel un objet DAO
L'interface des objets DAO est indpendante du support de persistance Le reste de l'application utilise les DAO uniquement au travers de leur interface abstraite
Par exemple si on change d'implmentation de DAO pour passer d'une base Oracle des fichiers XML le reste de l'application demeure inchang. Le mme objet DAO peut tre utilis pour les objets d'une mme classe d'objet mtier
Chaque classe d'objet mtier a son propre type de DAO (ClientDAO, CompteDAO)
Travail faire
Dfinir la couche mtier
Les classes Java Client et Compte
PK
CODE_CLIENT
CLIENTS
NOM PRENOM ADRESSE
PK
NUMERO SOLDE
COMPTES
DEBITMAX DECOUVERTMAX INTITULE
FK
TITULAIRE
1234 1567
DUPONT DURAND
JEAN ANNE
...
PROCURATIONS
FK
CODE_CLIENT NUMERO
...
FK
1234 1567 1234 57891 56787 47891
...
Philippe GENOUD UJF Grenoble janvier 2009 8
CLIENTS
NOM PRENOM ADRESSE
PK
NUMERO SOLDE
COMPTES
DEBITMAX DECOUVERTMAX INTITULE
FK
TITULAIRE
1234 1567
DUPONT DURAND
JEAN ANNE
...
ACCES_COMPTES
FK
CODE_CLIENT
...
FK
NUMERO TITULAIRE
V F F F
Mais la premire semble plus facile pour garantir la contrainte qu'un compte un titulaire et un seul premire solution retenue
9
...
Philippe GENOUD UJF Grenoble janvier 2009
CREATE TABLE PROCURATIONS (CODE_CLIENT INTEGER NOT NULL, NUMERO INTEGER NOT NULL); ALTER TABLE PROCURATIONS ADD FOREIGN KEY (CODE_CLIENT) REFERENCES CLIENTS(CODE_CLIENT); ALTER TABLE PROCURATIONS ADD FOREIGN KEY (NUMERO) REFERENCES COMPTES(NUMERO);
INSERT INTO CLIENTS (CODE_CLIENT, NOM, PRENOM, ADRESSE, PASSWD) VALUES ('1003', 'LEHERO', 'Toto', '234 Rue Machin GRENOBLE', 'toto1003'); INSERT INTO CLIENTS (CODE_CLIENT, NOM, PRENOM, ADRESSE, PASSWD) VALUES ('1001', 'DUPOND', 'Jean', '23 Rue du Lac GRENOBLE', 'toto1001'); INSERT INTO CLIENTS (CODE_CLIENT, NOM, PRENOM, ADRESSE, PASSWD) VALUES ('1002', 'DURAND', 'Sophie', NULL, 'toto1002');
INSERT INTO COMPTES (NUMERO, SOLDE, DEBITMAX, DECOUVERTMAX, INTITULE, TITULAIRE) VALUES ('5203', '2320', '1000', '1000', 'Compte de dpot', '1002'); INSERT INTO COMPTES (NUMERO, SOLDE, DEBITMAX, DECOUVERTMAX, INTITULE, TITULAIRE) VALUES ('5204', '2199', '1000', '500', 'Livret A', '1002'); INSERT INTO COMPTES (NUMERO, SOLDE, DEBITMAX, DECOUVERTMAX, INTITULE, TITULAIRE) VALUES ('5205', '5500', '1000', '1000', 'Compte de dpot', '1003'); INSERT INTO COMPTES (NUMERO, SOLDE, DEBITMAX, DECOUVERTMAX, INTITULE, TITULAIRE) VALUES ('5201', '1600', '500', '500', 'Compte de dpot', '1001'); INSERT INTO COMPTES (NUMERO, SOLDE, DEBITMAX, DECOUVERTMAX, INTITULE, TITULAIRE) VALUES ('5202', '3100', '1000', '700', 'Livret A', '1001'); INSERT INTO PROCURATIONS (CODE_CLIENT, NUMERO) VALUES ('1002', '5202'); INSERT INTO PROCURATIONS (CODE_CLIENT, NUMERO) VALUES ('1001', '5204'); INSERT INTO PROCURATIONS (CODE_CLIENT, NUMERO) VALUES ('1001', '5205');
Philippe GENOUD UJF Grenoble janvier 2009 10
Oprations "mtier"
Certaines oprations peuvent lever des exceptions. Dfinition d'une classe d'exception sur les comptes
11
Ajout d'un paramtres au constructeur ? Client titulaire Ajout d'un accesseur ? Client getTitulaire()
Quand un Compte est charg son titulaire doit-il tre charg ? Quand un Client est charg tous les Comptes auxquels il a accs doiventils tre chargs ? Risque de crer en cascade beaucoup d'objets inutiles
Philippe GENOUD UJF Grenoble janvier 2009 12
Ajout de deux attributs private int idTitulaire private String nomTitulaire Ajout de deux paramtres au constructeur int idTitulaire String nomTitulaire Ajout de deux accesseurs int getIdTitulaire() String getNomTitulaire()
13
14
15
16
public Compte retreive(int numero) throws SQLEXception ? public Compte updateSolde(Compte cpt) throws SQLEXception ? pas une bonne ide : si on veut pouvoir changer facilement de DAO il ne faut pas lier les exceptions un type de DAO particulier
Philippe GENOUD UJF Grenoble janvier 2009 17
18
Une connexion ouverte au dbut de chaque mthode du DAO et ferme la fin de chaque mthode ?
Ouverture d'une connexion opration trs coteuse.
20
21
22
bima.dao.mysql
23
La DataSource
javax.sql.DataSource est une interface. Pas d'implmentation dans JSE
typiquement gre et cre par un conteneur d'application JEE (exemple conteneur web TOMCAT)
Comment faire pour tester simplement nos DAO sans dployer un serveur d'application ?
utilisation d'une classe simulant une DataSource (c.a.d. qui implmente l'interface javax.sql.DataSource) classe DataSourceDeTest
24
Travail effectuer
Ralisez une classe OracleCompteDAO qui implmente l'interface ICompteDAO Testez cette classe
rflchir sur la manire de procder pour la tester
25
Travail a effectuer
Une fois votre classe CompteDAO teste indpendamment la tester dans un serveur Tomcat
1) Crer une application Web sous NetBeans
26
Travail a effectuer
2) configurer cette application de manire ce qu'elle dfinisse une source de donnes JDBC (javax.sql.DataSource) qui sera gre par Tomcat
<Context path="/BIMA"> <Context path="/BIMA"> <Resource name="jdbc/BIMA" <Resource name="jdbc/BIMA" auth="Container" auth="Container" type="javax.sql.DataSource" type="javax.sql.DataSource" maxActive="10" maxActive="10" maxIdle="3" maxIdle="3" maxWait="10000" maxWait="10000" username="genoud" username="genoud" password="xxxxxxx" password="xxxxxxx" driverClassName="oracle.jdbc.OracleDriver" driverClassName="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@hopper.e.ujf-grenoble.fr:1521:ufrima"/> url="jdbc:oracle:thin:@hopper.e.ujf-grenoble.fr:1521:ufrima"/> </Context> </Context>
... <servlet-mapping> ... </servlet-mapping>
http://www.inrialpes.fr/helix/people/genoud/ENSJAVA/cours/supportsPDF/DataSource_2pp.pdf
Philippe GENOUD UJF Grenoble janvier 2009 27
Travail a effectuer
2) dans cette application crer une servlet
28
Travail effectuer
29
L'application BIMA_V0
PO nu ST me ro _
co mp te
=5 2
01
Compte CompteServlet 2
cration d'un objet Compte partir des donnes contenues dans la base
3
construction et renvoi d'un page HTML partir des donnes de l'objet
Compte
30
pages HTML (statiques) correspondant une maquette de l'application fichiers de configuration de l'application Web
package bima.dao.mysql : implmentation (prive) des DAO pour une base MySQL (non termine) package bima.dao.oracle : implmentation (prive) des DAO pour une base Oracle package bima.model : objets "mtier" pour les Clients et Comtpes package bima.servlets : servlets de l'application Web
Philippe GENOUD UJF Grenoble janvier 2009 31
Enrichissement de BIMA_V0
Retour la page de login en indiquant la cause de l'chec Page d'accueil chec 1 Page liste des comptes
Authentification de l'utilisateur
ok
<JSP >
redirection vers la page d'accueil redirection vers la page d'accueil chec Authentification de l'utilisateur ok
3 2
<JSP >
accueil.html
1
POST client_id="5000" passwd="monMotDePasse"
LoginServlet.java
Cration partir de client_id et passwd listeComptes.jsp Cration partir de client_id et passwd d'un objet Client d'un objet Client Enregistrement de ce Client dans la session Enregistrement de ce Client dans la session
Client
32
Enrichissement de BIMA_V0
Dconnexion L'utilisateur n'a plus accs l'application moins de repasser par la phase d'authentification Rediriger vers la page Bye.jsp en plaant le nom et Rediriger vers la page Bye.jsp en plaant le nom et prnom de l'utilisateur comme attributs de la prnom de l'utilisateur comme attributs de la requte requte Terminer la session Terminer la session
LogoutServlet
nom="DUPONT" prenom="Jean"
Page de dconnexion
Bye.jsp
33
34