Vous êtes sur la page 1sur 17

Application web de gestion de comptes en banques

Objectif
Raliser une application Web permettant un client de grer ses comptes en banque

Diagramme de cas d'utilisation

Philippe GENOUD UJF Grenoble janvier 2009

Les cas d'utilisation


Connexion au systme
L'utilisateur fourni son code client (entier, identifiant unique) et son mot de passe Si le ces informations sont correctes il est accde une page listant l'ensemble de ses comptes Sinon, il reste sur la page de login et un message d'erreur est affich

Lister ses comptes


L'utilisateur est connect La liste des comptes accessibles au client apparat Pour chaque compte on a :
Le numro du compte (entier identifiant) L'intitul (livret A, compte Dpt, .) Le nom du titulaire du compte Le solde du compte
2

Philippe GENOUD UJF Grenoble janvier 2009

Les cas d'utilisation


Effectuer un transfert
L'utilisateur est connect L'utilisateur slectionne un compte de dpart, un compte d'arrive L'utilisateur fournit le montant transfrer L'utilisateur demande le transfert (possible que si les donnes ncessaires au transfert ont t fournies) Le transfert est effectu
Il n'est possible que si le montant du transfert respecte le dbit maximum autoris et le dcouvert maximum autoris pour le compte dbiter. En cas d'impossibilit un message le signale l'utilisateur

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

Interface et fonctionnement de l'application


Retour la page de login en indiquant la cause de l'chec Page d'accueil chec 1 Page liste des comptes

Annexe 3 : interface de l'application Banque IMA on line

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

2 Page de dconnexion 1 Ralisation du transfert

Page affichage des rsultats du transfert

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

Composants Java de l'application


prsentation mtier Accs aux donnes

Client

ClientDAO

Pages JSP

Compte

CompteDAO

JDBC

Servlets

Navigateur Serveur d'application Java

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)

Philippe GENOUD UJF Grenoble janvier 2009

Travail faire
Dfinir la couche mtier
Les classes Java Client et Compte

Dfinir la couche persistante


Les tables de la base de donnes

Dfinir la couche DAO


Oprations CRUD (Create, Retrieve, Update, Delete) lies aux objets mtier

Philippe GENOUD UJF Grenoble janvier 2009

Modle conceptuel des donnes

Philippe GENOUD UJF Grenoble janvier 2009

Traduction en modle relationnel

PK
CODE_CLIENT

CLIENTS
NOM PRENOM ADRESSE

PK
NUMERO SOLDE

COMPTES
DEBITMAX DECOUVERTMAX INTITULE

FK
TITULAIRE

1234 1567

DUPONT DURAND

JEAN ANNE

12 RUE MACHIN GRENOBLE 2 IMPASSE TRUC ANNECY

56787 57890 47891

2567,90 -107,50 3000,50

1000 1500 1500

500 1000 1000

COMPTE DEPOT COMPTE DEPOT COMPTE DEPOT

1234 1567 1567

...
PROCURATIONS
FK
CODE_CLIENT NUMERO

...
FK
1234 1567 1234 57891 56787 47891

...
Philippe GENOUD UJF Grenoble janvier 2009 8

Traduction en modle relationnel

Une autre modlisation possible.


PK
CODE_CLIENT

CLIENTS
NOM PRENOM ADRESSE

PK
NUMERO SOLDE

COMPTES
DEBITMAX DECOUVERTMAX INTITULE

FK
TITULAIRE

1234 1567

DUPONT DURAND

JEAN ANNE

12 RUE MACHIN GRENOBLE 2 IMPASSE TRUC ANNECY

56787 57890 47891

2567,90 -107,50 3000,50

1000 1500 1500

500 1000 1000

COMPTE DEPOT COMPTE DEPOT COMPTE DEPOT

1234 1567 1567

...
ACCES_COMPTES
FK
CODE_CLIENT

...
FK
NUMERO TITULAIRE

1234 1234 1567 1234

56787 57891 56787 47891

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

Code SQL de cration de la base


CREATE TABLE CLIENTS (CODE_CLIENT INTEGER NOT NULL, NOM VARCHAR2(32) NOT NULL, PRENOM VARCHAR2(32) NOT NULL, ADRESSE VARCHAR2(50), PASSWD VARCHAR2(8), PRIMARY KEY (CODE_CLIENT)); CREATE TABLE COMPTES (NUMERO INTEGER NOT NULL, SOLDE FLOAT NOT NULL, DEBITMAX FLOAT NOT NULL, DECOUVERTMAX FLOAT NOT NULL, INTITULE VARCHAR2(32) NOT NULL, TITULAIRE FLOAT NOT NULL, PRIMARY KEY (NUMERO)); ALTER TABLE COMPTES ADD FOREIGN KEY (TITULAIRE) REFERENCES CLIENTS(CODE_CLIENT);

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

Objets mtier : la classe Compte


Modlisation sans tenir compte l'association avec Client

Accesseurs et modifieurs (getters et setters)

Oprations "mtier"

Certaines oprations peuvent lever des exceptions. Dfinition d'une classe d'exception sur les comptes

Philippe GENOUD UJF Grenoble janvier 2009

11

Objets mtier : la classe Compte


Prise en compte de l'association avec Client

Ajout d'un attribut ? private Client titulaire

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

Objets mtier : la classe Compte


Prise en compte de l'association avec Client

Ne pas conserver l'association Compte Client au niveau du modle objet

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()

Philippe GENOUD UJF Grenoble janvier 2009

13

Objets mtier : la classe Client

Philippe GENOUD UJF Grenoble janvier 2009

14

Objet DAO pour les Comptes


Dfinir une interface ICompteDAO On pourra avoir ensuite plusieurs implmentations
OracleCompteDAO pourr SGB Oracle MySQLCompteDAO pour SGBD MySQL

Le code qui utilise les objets DAO utilise l'interface


il ne dpend pas des implmentations

Philippe GENOUD UJF Grenoble janvier 2009

15

Objet DAO pour les Comptes


interface ICompteDAO
oprations CRUD (Create, Retrieve, Update, Delete) pour l'application Banque IMA seules des oprations Retrieve et Update sont ncessaires

charger un compte partir de son numro


public Compte retreive(int numero)

enregistrer le solde d'un compte


public Compte updateSolde(Compte cpt)

Philippe GENOUD UJF Grenoble janvier 2009

16

Objet DAO pour les Comptes


interface ICompteDAO
les mthodes du DAO effectuent des entres/sorties (dans notre cas accs la BD) elles peuvent donc lancer des exceptions (SQLException)

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

Objet DAO pour les Comptes


interface ICompteDAO
cration d'une classe d'exception indpendante du type de DAO (DAOException) les mthodes d'implmentation des DAO attrapent les exceptions particulires (par exemple SQLException) et relancent des DAOException les exceptions d'origine sont chanes aux DAOException

Philippe GENOUD UJF Grenoble janvier 2009

18

Objet DAO pour les Comptes


Gestion des connexions JDBC
Un attribut connexion cr (et donc ouvert) la cration de l'objet DAO ?
Possibles problmes de timeout. La connexion peut tre ferme automatiquement. Risques d'incohrences si multithreading (par exemple si il y a des transactions).

Une connexion ouverte au dbut de chaque mthode du DAO et ferme la fin de chaque mthode ?
Ouverture d'une connexion opration trs coteuse.

Une solution : utilisation d'un pool de connexions.


19

Philippe GENOUD UJF Grenoble janvier 2009

Objet DAO pour les Comptes


La classe d'implmentation aura un attribut DataSource que cette mthode permet d'initialiser

Philippe GENOUD UJF Grenoble janvier 2009

20

Objet DAO pour les Comptes


interface ICompteDAO suite

Philippe GENOUD UJF Grenoble janvier 2009

21

L'API des objets DAO

API publique package bima.dao

implmentation prive package bima.dao.oracle

Philippe GENOUD UJF Grenoble janvier 2009

22

L'API des objets DAO

Fabrique abstraite package bima.dao

implmentations packages bima.dao.oracle et

bima.dao.mysql

Philippe GENOUD UJF Grenoble janvier 2009

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

Philippe GENOUD UJF Grenoble janvier 2009

24

Travail effectuer
Ralisez une classe OracleCompteDAO qui implmente l'interface ICompteDAO Testez cette classe
rflchir sur la manire de procder pour la tester

Si du temps rflchir aux problmes soulevs par l'opration de Transfert ?


l'API ICompteDAO est-elle adapte pour celle-ci ? Quel enrichissement proposez vous ? Implmenter et tester votre nouvelle API.

Philippe GENOUD UJF Grenoble janvier 2009

25

Travail a effectuer
Une fois votre classe CompteDAO teste indpendamment la tester dans un serveur Tomcat
1) Crer une application Web sous NetBeans

Philippe GENOUD UJF Grenoble janvier 2009

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>

Pour en savoir plus voir le document

<resource-ref> <res-ref-name>jdbc/BIMA</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>


...

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

Philippe GENOUD UJF Grenoble janvier 2009

28

Travail effectuer

modifier le code de la servlet de manire ce que :


son initialisation elle rcupre dans un variable d'instance la rfrence de la data source correspondant votre base de donnes pour la banque IMA. dans sa mthode de traitement de la requte HTTP
elle rcupre un paramtre : un numro de compte en banque elle construit l'aide de la classe OracleCompteDAO un objet Compte correspondant au numro rcupr dans la requte HTTP elle renvoie une page HTML prsentant les diffrentes infos lies ce compte

Philippe GENOUD UJF Grenoble janvier 2009

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

Philippe GENOUD UJF Grenoble janvier 2009

30

Structure du projet BIMA_V0

pages HTML (statiques) correspondant une maquette de l'application fichiers de configuration de l'application Web

package bima.dao : classes et interfaces publiques pour les DAO

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

Affiche la liste des comptes accessibles par le client

<JSP >

redirection vers la page d'accueil redirection vers la page d'accueil chec Authentification de l'utilisateur ok

3 2

redirection vers listeComptes.jsp redirection vers listeComptes.jsp

<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

Rcuprer les paramtres Rcuprer les paramtres de la requte de la requte

Client

Philippe GENOUD UJF Grenoble janvier 2009

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

<JSP <JSP > >

Bye.jsp

Philippe GENOUD UJF Grenoble janvier 2009

33

Enrichir l'application Web


rcuprer la maquette HTML de l'application mettre en uvre le dbut de l'application
login et accs liste des comptes du client

Philippe GENOUD UJF Grenoble janvier 2009

34