• Aucun résultat trouvé

Plan. Organisation à 3 niveaux ( three-tier )

N/A
N/A
Protected

Academic year: 2022

Partager "Plan. Organisation à 3 niveaux ( three-tier )"

Copied!
7
0
0

Texte intégral

(1)

Bases de Donn ´ees : Java DataBase Connectivity

St ´ephane Devismes

Universit ´e Grenoble Alpes

26 ao ˆut 2020

S. Devismes (UGA) JDBC 26 ao ˆut 2020 1 / 30

Plan

1

Introduction

2

JDBC

3

Servlets HTTP

S. Devismes (UGA) JDBC 26 ao ˆut 2020 2 / 30

Introduction JDBC ServletsHTTP

Int ´egration SQL

Aujourd’hui, nous allons ´etudier comment utiliser l’application JDBC et les servlets HTTP pour acc ´eder `a une base de donn ´ees SQL `a partir d’une interface web, afin d’interroger la base de donn ´ees ou de modifier ses donn ´ees.

Introduction JDBC ServletsHTTP

Organisation `a 3 niveaux ( three-tier )

En haut

: niveau pr ´esentation. Typiquement, une interface web : un navigateur (HTML) sur la machine client.

En bas

: niveau donn ´ees. La base de donn ´ees sur le serveur de bases de donn ´ees (SGBD : SQL ).

Au milieu

: niveau logique. Traduction entre les 2 autres niveaux.

Client (navigateur HTML )

requ ˆete

Serveur Web (JDBC)

r ´eponse

OO

requ ˆete

HTTP

servlets

JDBC

statements

Serveur de donn ´ees ( SQL )

r ´eponse

OO

(2)

Niveau logique

Traduction entre les 2 autres niveaux sur un serveur web.

La communication entre le client et le serveur web est assur ´ee par le protocole de transfert HTTP .

Des servlets permettent de cr ´eer dynamiquement des donn ´ees au sein du serveur HTTP . Ces donn ´ees sont g ´en ´eralement pr ´esent ´ees au format HTML, ou XML, ou autre.

Une servlet s’ex ´ecute dynamiquement sur le serveur web et permet l’extension des fonctions de ce dernier : acc `es `a des bases de donn ´ees, transactions d’e-commerce, etc.

S. Devismes (UGA) JDBC 26 ao ˆut 2020 6 / 30

Sch ´ema de programmation

JDBC (Java DataBase Connectivity) est une interface de programmation (API, Application Programming Interface) qui permet `a des programmes Java d’acc ´eder `a une base de donn ´ees SQL .

JDBC fournit des m ´ethodes pour interroger et mettre `a jour les donn ´ees. JDBC proc `ede en quatre temps :

1

Connexion `a la base de donn ´ees : Connection conn = ...;

2

Ouverture d’une

instruction

(statement) : Statement st = ...;

...;

3

Interrogation de la base de donn ´ees : ResultSet rs = ...; ...;

puis utilisation des r ´esultats retourn ´es.

(Pour une modification de la base de donn ´ees cette troisi `eme phase est modifi ´ee.)

4

Fermeture et d ´econnection : st.close(); rs.close();

conn.close();

S. Devismes (UGA) JDBC 26 ao ˆut 2020 8 / 30

Introduction JDBC ServletsHTTP

Pilote

Des pilotes (drivers) JDBC sont disponibles pour tous les syst `emes de bases de donn ´ees relationnelles.

Par exemple oracle.jdbc.OracleDriver pour Oracle.

Le pilote est utilis ´e pour cr ´eer une connexion `a la base de donn ´ees.

L’appel `a Class.forName d ´eclenche un chargement dynamique du pilote et l’enregistre dans la classe DriverManager , qui g `ere la connection `a la base de donn ´ee.

Introduction JDBC ServletsHTTP

Pilote : exemple

impo rt java . sql .*;

publ ic class E x e m p l e J D B C {

publ ic stat ic void main ( Str ing [] Args ) {

try {

Class . f o r N a m e (" or acle . jdbc . O r a c l e D r i v e r ");

}

catch ( E x c e p t i o n e ) {

// a f f i c h a g e dans la c o n s o l e

Syst em . err . p r i n t l n (" Pas de pilo te ! ");

}

... c o n n e x i o n et u t i l i s a t i o n de la base ...

} }

(3)

ResultSet

Un objet de la classe ResultSet (ensemble de r ´esultats) permet de r ´ecup ´erer le r ´esultat d’une requ ˆete sous la forme d’une table.

Il y a plusieurs m ´ethodes dans la classe ResultSet pour parcourir un ensemble de r ´esultats, en particulier la m ´ethode next() (un it ´erateur) permet d’acc ´eder `a chaque ligne de la table r ´esultat et retourne

faux

lorsque la fin de la table est atteint.

Pour r ´ecup ´erer les valeurs des attributs on utilise les m ´ethodes getString(p) , getInt(p) , getFloat(p) , etc, de la classe ResultSet , o `u p est la position ( `a partir de 1) de l’attribut dans le SELECT .

S. Devismes (UGA) JDBC 26 ao ˆut 2020 11 / 30

Interrogation : exemple (1/2)

Stri ng url = " jdbc : orac le : thin : @im2ag - ora cle . e . ujf - g r e n o b l e . fr :1 521: t p t o m c a t ";

Stri ng login = " login ", pwd = " mot de passe ";

C o n n e c t i o n conn = D r i v e r M a n a g e r . g e t C o n n e c t i o n ( url , login , pwd );

S t a t e m e n t st = conn . c r e a t e S t a t e m e n t ();

R e s u l t S e t rs = st . e x e c u t e Q u e r y (" SE LECT Nom , Prenom , Age FROM p e r s o n n e ORDER BY age ");

while ( rs . next ()) {

Syst em . out . p r i n t l n (" Nom : " + rs . g e t S t r i n g (1));

Syst em . out . p r i n t l n (" Pr ´e nom : " + rs . g e t S t r i n g (2));

Syst em . out . p r i n t l n (" Age : " + rs . g e t S t r i n g (3));

}

rs . close ();

st . close ();

conn . close ();

S. Devismes (UGA) JDBC 26 ao ˆut 2020 12 / 30

Introduction JDBC ServletsHTTP

Interrogation : exemple (2/2)

C o n n e c t i o n conn ;

Stri ng url = " jdbc : orac le : thin : @im2ag - ora cle . e . ujf - g r e n o b l e . fr :1 521: t p t o m c a t ";

Stri ng login = " login ", pwd = " mot de passe ";

Stri ng R e q u e t e = " sele ct noca ge from L e s G a r d i e n s where nome = ’ Sc holl ’";

conn = D r i v e r M a n a g e r . g e t C o n n e c t i o n ( url , login , pwd );

S t a t e m e n t st = conn . c r e a t e S t a t e m e n t ();

R e s u l t S e t rs = st . e x e c u t e Q u e r y ( R e q u e t e );

Syst em . out . p r i n t l n (" Cages gard ´e es par Scho ll : ");

while( rs . next ())

Syst em . out . p r i n t l n ( rs . g e t S t r i n g (1));

rs . close ();

st . close ();

conn . close ();

Introduction JDBC ServletsHTTP

Interrogation : avec traitement des exceptions

C o n n e c t i o n conn ;

Stri ng url = " jdbc : orac le : thin : @im2ag - ora cle . e . ujf - g r e n o b l e . fr :1 521: t p t o m c a t ";

Stri ng login = " login ", pwd = " mot de passe ";

Stri ng R e q u e t e = " sele ct noca ge from L e s G a r d i e n s where nome = ’ Sc holl ’";

try{

conn = D r i v e r M a n a g e r . g e t C o n n e c t i o n ( url , login , pwd );

S t a t e m e n t st = conn . c r e a t e S t a t e m e n t ();

R e s u l t S e t rs = st . e x e c u t e Q u e r y ( R e q u e t e );

Syst em . out . p r i n t l n (" Cages gard ´e es par Scho ll : ");

while( rs . next ()) {

Syst em . out . p r i n t l n ( rs . g e t S t r i n g (1));

}

rs . close ();

st . close ();

conn . close ();

}

catch( S Q L E x c e p t i o n se ){

Syst em . err . p r i n t l n (" Err eur SQL ");

J D B C T u t o r i a l U t i l i t i e s . p r i n t S Q L E x c e p t i o n ( se );

}

catch( E x c e p t i o n e ){

Syst em . err . p r i n t l n (" M e s s a g e d ’ err eur ");

(4)

Modification

Pour les modifications d’une base de donn ´ees ( INSERT, UPDATE, DELETE ), on utilise la fonction executeUpdate de la classe Statement .

Chaque modification des donn ´ees retourne un entier : c’est le nombre de lignes affect ´ees par la modification.

Utiliser les quotes doubles et le + pour manipuler les chaˆınes en Java . Attention aux quotes : doubles pour Java , simples pour SQL .

Lorsque nom vaut Marie et age vaut 25 , o `u Marie et 25 sont des chaˆınes pour Java , alors la chaˆıne Java

"VALUES (’" + nom + "’, " + age + ")"

est form ´ee de la concat ´enation de VALUES (’ puis Marie puis ’, puis 25 puis ) , ce qui donne le morceau de code SQL :

VALUES (’Marie’, 25)

S. Devismes (UGA) JDBC 26 ao ˆut 2020 15 / 30

Ajout : exemple

Stri ng url = " jdbc : orac le : thin : @im2ag - ora cle . e . ujf - g r e n o b l e . fr :1 521: t p t o m c a t ";

Stri ng login = " login ", pwd = " mot de passe ", Nom = " Marie ", Age = " 25 ";

C o n n e c t i o n conn = D r i v e r M a n a g e r . g e t C o n n e c t i o n ( url , login , pwd );

S t a t e m e n t st = conn . c r e a t e S t a t e m e n t ();

int nb = st . e x e c u t e U p d a t e (" INSER T INTO p e r s o n n e ( Nom , Age ) "

+ " VAL UES ( ’ " + nom + " ’, " + age + " ) ");

Syst em . out . p r i n t l n ( nb + " ligne ( s ) ins ´e r ´e e ( s ) ");

st . close ();

conn . close ();

S. Devismes (UGA) JDBC 26 ao ˆut 2020 16 / 30

Introduction JDBC ServletsHTTP

JDBC et transactions

Par d ´efaut : auto-commit Sinon

Stri ng url = " jdbc : orac le : thin : @im2ag - ora cle . e . ujf - g r e n o b l e . fr :1 521: t p t o m c a t ";

Stri ng login = " login ", pwd = " mot de passe ", Nom = " Marie ", Age = " 25 ";

C o n n e c t i o n conn = D r i v e r M a n a g e r . g e t C o n n e c t i o n ( url , login , pwd );

conn . s e t A u t o C o m m i t (false);

try { ...

conn . com mit ();

}

catch ( S Q L E x c e p t i o n e ) { ...

conn . r o l l b a c k ();

} f i n a l l y {

conn . close ();

}

Introduction JDBC ServletsHTTP

Acc `es `a une base via le Web

Ce qui pr ´ec `ede doit ˆetre utilis ´e avec Java : compilation puis ex ´ecution.

Pour y acc ´eder directement depuis une page web, via des pages HTML, on peut utiliser des servlets HTTP .

Package javax.servlet.http

Les servlets de Java sont utilis ´ees pour le d ´eveloppement de pages

web. Typiquement, elles permettent `a un serveur d’engendrer des

pages HTML en utilisant les r ´eponses `a des requ ˆetes SQL formul ´ees

par un client.

(5)

Post et Get

La communication entre le client et le serveur web utilise les requ ˆetes de lecture GET et POST (identique `a GET mais plus s ˆure) de HTTP . HTTP (HyperText Transfer Protocol) est un protocole de

requ ˆete-r ´eponse entre un client et un serveur. Typiquement, le serveur est un serveur web et le client est un navigateur. Le client soumet des requ ˆetes, auxquelles le serveur r ´epond.

S. Devismes (UGA) JDBC 26 ao ˆut 2020 20 / 30

HttpServlet

Une servlet est une classe Java qui traite des requ ˆetes HTTP .

Une servlet est sous-classe de la classe abstraite HttpServlet cr ´e ´ee pour former une servlet HTTP pour un site Web.

Cette sous-classe implante les m ´ethodes :

doGet(HttpServletRequest req, HttpServletResponse res) pour les requ ˆetes GET de HTTP ,

doPost(HttpServletRequest req, HttpServletResponse res) pour les requ ˆetes POST de HTTP .

S. Devismes (UGA) JDBC 26 ao ˆut 2020 21 / 30

Introduction JDBC ServletsHTTP

Protocole sans ´etat

Le protocole HTTP est un protocole non connect ´e ou protocole

sans

´etats

(stateless protocol), cela signifie que chaque requ ˆete est trait ´ee ind ´ependamment des autres et qu’aucun historique des diff ´erentes requ ˆetes n’est conserv ´e.

Cependant, on peut

passer des param `etres d’une page `a une autre ;

on peut sauvegarder des informations durant toute la dur ´ee de la session.

Introduction JDBC ServletsHTTP

Passage de param `etre via la m ´ethode doPost()

Une requ ˆete POST n’est utilisable qu’avec un formulaire HTML.

<FORM ACTION="Resultat"

METHOD="POST">

<INPUT TYPE="TEXT" NAME="NOM">

<INPUT TYPE="TEXT" NAME="PRENOM">

<Input TYPE="SUBMIT" VALUE="Envoyer">

</FORM>

La m ´ethode doPost() doit g ´en ´eralement recueillir les param `etres pour les traiter et g ´en ´erer la r ´eponse.

Pour obtenir la valeur associ ´ee `a chaque param `etre il faut utiliser la

m ´ethode getParameter() de l’objet HttpServletRequest . Cette

(6)

R ´ecup ´eration des param `etres dans Resultat.java

impo rt javax . s e r v l e t . http .*;

impo rt java . io .*;

publ ic class R e s u l t a t e x t e n d s H t t p S e r v l e t {

publ ic void doP ost ( H t t p S e r v l e t R e q u e s t req , H t t p S e r v l e t R e s p o n s e res ) thro ws S e r v l e t E x c e p t i o n , I O E x c e p t i o n {

// pour l ’ a f f i c h a g e en HTML P r i n t W r i t e r out = res . g e t W r i t e r ();

Stri ng nom = req . g e t P a r a m e t e r (" NOM ");

Stri ng pre nom = req . g e t P a r a m e t e r (" PR ENOM ");

out . p r i n t l n (" Nom : " + nom + " , pr ´e nom : " + pre nom );

} }

S. Devismes (UGA) JDBC 26 ao ˆut 2020 24 / 30

HttpSession

Un objet de la classe HttpSession permet d’identifier un utilisateur et de m ´emoriser des donn ´ees relatives `a cet utilisateur.

Une servlet HTTP utilise un objet de la classe HttpSession pour cr ´eer une session entre un client HTTP et un serveur HTTP .

La session persiste pendant un temps limit ´e (elle expire), elle permet `a la servlet de voir et manipuler l’information concernant la session (identifiant, date de cr ´eation, date du dernier acc `es, ...).

S. Devismes (UGA) JDBC 26 ao ˆut 2020 25 / 30

Introduction JDBC ServletsHTTP

HttpSession : utilisation (1/2)

Un objet de type HttpSession s’obtient gr ˆace `a la m ´ethode getSession(boolean) de la classe HttpServletRequest . La m ´ethode getSession(boolean) de la classe

HttpServletRequest , avec l’argument true , permet de cr ´eer une session relative `a l’utilisateur.

La m ´ethode getSession(true) doit ˆetre appel ´ee avant tout envoi de donn ´ees au navigateur.

HttpSession session = req.getSession(true);

Introduction JDBC ServletsHTTP

HttpSession : utilisation (1/2)

La m ´ethode setAttribute(String cle,Object valeur) de la classe HttpSession permet de stocker des informations dans la session.

La m ´ethode getAttribute(String cle) de la classe HttpSession permet de r ´ecup ´erer une valeur (type Object ) qui a ´et ´e

pr ´ec ´edemment stock ´ee dans un objet de type HttpSession .

Il faut donc effectuer un surtypage pour obtenir un type ´el ´ementaire

de donn ´ees (par exemple un entier sera renvoy ´e sous forme d’objet

Integer qu’il faudra convertir en int ).

(7)

HttpSession : exemple ( Index.java )

impo rt java . sql .*;

impo rt javax . s e r v l e t .*;

impo rt javax . s e r v l e t . http .*;

impo rt java . io .*;

publ ic class Index e x t e n d s H t t p S e r v l e t {

publ ic void doGet ( H t t p S e r v l e t R e q u e s t req , H t t p S e r v l e t R e s p o n s e res ) thro ws S e r v l e t E x c e p t i o n , I O E x c e p t i o n {

P r i n t W r i t e r out = res . g e t W r i t e r ();

out . p r i n t l n (" < FORM METH OD =\" POST \" ACTI ON =\" I n d e x A c t i o n \" > ");

out . p r i n t l n (" Login : ");

out . p r i n t l n (" < INPUT TYPE =\" text \" NAME =\" login \" > ");

out . p r i n t l n (" P a s s w o r d : ");

out . p r i n t l n (" < INPUT TYPE =\" p a s s w o r d \" NAME =\" pwd \" > ");

out . p r i n t l n (" < INPUT TYPE =\" su bmit \" VALUE =\" C o n n e c t i o n \" > ");

out . p r i n t l n (" < input type =\" reset \" value =\" Reset \" > ");

out . p r i n t l n (" </ FORM > ");

} }

S. Devismes (UGA) JDBC 26 ao ˆut 2020 28 / 30

HttpSession : exemple ( IndexAction.java )

publ ic class I n d e x A c t i o n e x t e n d s H t t p S e r v l e t { Stri ng pwd , login ;

publ ic void doP ost ( H t t p S e r v l e t R e q u e s t req , H t t p S e r v l e t R e s p o n s e res ) thro ws S e r v l e t E x c e p t i o n , I O E x c e p t i o n {

login = req . g e t P a r a m e t e r (" login ");

pwd = req . g e t P a r a m e t e r (" pwd ");

H t t p S e s s i o n s e s s i o n = req . g e t S e s s i o n (true);

s e s s i o n . s e t A t t r i b u t e (" login ", login );

s e s s i o n . s e t A t t r i b u t e (" pwd ", pwd );

/* suite du code */

} }

S. Devismes (UGA) JDBC 26 ao ˆut 2020 29 / 30

Introduction JDBC ServletsHTTP

HttpSession : exemple ( Scholl.java )

publ ic class Scho ll e x t e n d s H t t p S e r v l e t {

publ ic void doP ost ( H t t p S e r v l e t R e q u e s t req , H t t p S e r v l e t R e s p o n s e res ) thro ws S e r v l e t E x c e p t i o n , I O E x c e p t i o n {

C o n n e c t i o n conn ;

Stri ng url = " jdbc : orac le : thin : @im2ag - ora cle . e . ujf - g r e n o b l e . fr :1 521: t p t o m c a t ";

H t t p S e s s i o n s e s s i o n = req . g e t S e s s i o n (true);

Stri ng login =( Stri ng ) s e s s i o n . g e t A t t r i b u t e (" login ");

Stri ng pwd =( Stri ng ) s e s s i o n . g e t A t t r i b u t e (" pwd ");

Stri ng R e q u e t e = " sele ct noca ge from L e s G a r d i e n s where nome = ’ Sc holl ’";

// pour l ’ a f f i c h a g e en HTML P r i n t W r i t e r out = res . g e t W r i t e r ();

conn = D r i v e r M a n a g e r . g e t C o n n e c t i o n ( url , login , pwd );

S t a t e m e n t st = conn . c r e a t e S t a t e m e n t ();

R e s u l t S e t rs = st . e x e c u t e Q u e r y ( R e q u e t e );

// l ’ a f f i c h a g e est s i m p l i f i ´e : on peut y i n c l u r e du HTML out . p r i n t l n (" Cages gard ´e es par Scho ll : ");

while( rs . next ())

out . p r i n t l n ( rs . g e t S t r i n g (1));

rs . close ();

st . close ();

conn . close ();

}

Références

Documents relatifs

La construction doit être faite en fonction des consignes, et tu dois écrire précisément le programme de construction.. Construction 1 : A partir du centre

[r]

En effet l’auteur en parlant des bombardements « deux paquet de quatre bombes, huit éclatement suivis d’une sourde clameur, », décrit leurs

  Introduction: Présentation HTTP;.   Installation et

L’inconv´enient essentiel des SSI est que le serveur HTTP doit lire ligne ` a ligne le code HTML de toute page `a renvoyer (tout au moins celles d’un suffixe d´etermin´e tel que

Puisque la valeur de l’attribut ACTION se trouve dans le r´epertoire cgi-bin, les renseignements du formulaire sont transmis au serveur qui a communiqu´e le fichier HTML,

Actuellement, le serveur Apache est configuré pour n’utiliser qu’un seul fichier de log pour tous les hôtes virtuels (ce qu’on pourrait changer en intégrant des directives

Pour cela nous voulons qu’il puisse : Consulter l’état du cache (nombre de fichiers, noms des fichiers, mémoire occupée, taux d’utilisation des fichiers et statistiques du cache)