���������� ������������������ ���������� ��� � �������������������������� © Groupe Eyrolles, 2004, ISBN : 2-212-11532-6 3646_09_Ch05 Page 186 Mercredi, 4. août 2004 1:49 13 > Apogee FrameMaker Couleur partie n° 2 Concepts avancés Figure 5-3 La table Livres enregistrée sous MySQL. Enrichir une base de données avec JSP Pour enregistrer les données à l’intérieur d’une table, il « suffit » d’utiliser la commande INSERT en y plaçant les valeurs relatives aux attributs définis dans la table. Nous imaginons maintenant, pour reprendre notre exemple, qu’un fonds de bibliothèque (c’està-dire le nombre de livres) correspond en moyenne à 150 000 livres, que le nombre d’adhérents peut atteindre les 20 000 et qu’en moyenne 500 livres sont empruntés par jour. Pour enregistrer 186 © Éditions Eyrolles 3646_09_Ch05 Page 187 Mercredi, 4. août 2004 1:49 13 > Apogee FrameMaker Couleur chapitre n° 5 Interroger une base de données l’ensemble de ces données, il nous faut taper 295 000 fois la commande INSERT (150 000 livres + 20 000 lecteurs + 500 livres × 250 jours), en faisant bien attention aux virgules, parenthèses et autres guillemets. Ce travail est démesuré et ne peut être réalisé tel quel. Un autre exemple, très parlant, est celui des sites éditoriaux (journaux en ligne). Chaque jour, les gros titres, les articles et les photos sont modifiés. Chaque jour, les précédents titres, articles et photos sont archivés. Toutes ces informations sont bien entendues enregistrées dans une base de données qui permet la mise en ligne automatique de l’information. Compte tenu du nombre d’articles et des délais très courts pour les mises à jour, l’enrichissement de ce type de base de données ne peut être effectué à l’aide de la simple commande INSERT. Un composant JavaBean communique avec MySQL En réalité, les commandes CREATE, INSERT, SELECT, etc. sont indispensables pour les concepteurs (éditeurs ou administrateurs) de bases de données mais elles ne le sont pas pour les utilisateurs finaux. Pour enrichir une base de données, il convient de construire une interface simple et conviviale, proche du mode de fonctionnement de l’utilisateur. Cette interface est constituée, pour l’essentiel, de formulaires dont les champs à remplir correspondent aux différents attributs des tables créées par le concepteur de la base de données. Après validation des données saisies via le formulaire, ces dernières sont vérifiées puis enregistrées dans la base de données. Architecture 3-tiers L’enregistrement de données dans une table s’effectue selon le modèle 3-tiers, présenté à la figure 5-4. Figure 5-4 Architecture 3-tiers. Tiers est un terme anglais qui se traduit par le mot « étage » et non par « un tiers ». © Éditions Eyrolles 187 3646_09_Ch05 Page 188 Mercredi, 4. août 2004 1:49 13 partie n° 2 > Apogee FrameMaker Couleur Concepts avancés Les données sont saisies par l’utilisateur grâce à un formulaire HTML/JSP (premier étage, figure 5-4-➊). Lorsque l’utilisateur valide le formulaire, les données sont transmises au serveur Tomcat (deuxième étage, figure 5-4-➋) à l’aide d’une requête JSP. Les données sont alors traitées par un composant JavaBean. Après vérification de la validité des données, un composant JavaBean se connecte à la base de données et lui transmet les données (troisième étage, figure 5-4-➌) pour enregistrement. Ainsi, de la saisie à l’aide de formulaires HTML à l’enregistrement dans une base de données MySQL, les données réalisent un parcours électronique qui nécessite la mise en place de connexions permettant la transformation et la transmission des données d’un environnement à l’autre. En effet, chaque environnement (JSP, JavaBean, MySQL) code et interprète les données d’une façon qui lui est propre. L’étude du chapitre 4 « Utiliser un objet Java dans un script » montre comment établir une communication entre un script JSP et un composant JavaBean. Nous allons maintenant examiner comment les informations stockées dans un composant sont transmises à une base de données MySQL. Plusieurs étapes sont nécessaires pour réaliser cette transmission, elles se résument de la façon suivante : 1. Reconnaissance de la base de données et création d’un objet Connection. 2. Mise en place d’un tube de communication à partir de l’objet Connection. 3. Transmission de requêtes entre un JSP et une base de données via le tube. Reconnaître la base de données et créer un objet Connection Pour qu’un composant JavaBean interroge une base de données ou lui transmette une information, il doit au préalable se connecter à la base de données. Pour réaliser cette connexion, le composant doit connaître le moyen de communiquer avec la base de données. Il lui faut pour cela faire appel à des fonctions spécifiques qui ont été écrites par les concepteurs de la base de données. Ces fonctions spécifiques sont rassemblées dans une bibliothèque de programmes appelée « pilote » (en anglais, driver). Il existe autant de pilotes que de types de bases de données. Pour notre cas, nous utilisons les pilotes fournis par MySQL et enregistrés dans la bibliothèque mysql-connector-java-3.0.11-stable-bin.jar. L’installation du pilote mysql-connector-java est décrite en annexe « Contenu et exploitation du CD-Rom » de cet ouvrage, à la section « Autres installations ». Création du composant JavaBean DBConnexion Notre objectif est d’écrire un composant JavaBean nommé DBConnexion qui se connecte à une base de données MySQL. Nous devons pour cela définir les propriétés et les méthodes uti- 188 © Éditions Eyrolles 3646_09_Ch05 Page 189 Mercredi, 4. août 2004 1:49 13 chapitre n° 5 > Apogee FrameMaker Couleur Interroger une base de données les à la mise en place de cette connexion. À cette fin, examinons étape par étape comment réaliser une telle connexion. Avant tout, nous devons charger en mémoire le pilote que nous souhaitons utiliser pour établir la connexion. Par défaut, pour des raisons d’optimisation, aucun pilote de connexion à une base de données n’est chargé en mémoire de la JVM. Pour réaliser cette opération, il convient d’utiliser l’instruction : Class.forName("com.mysql.jdbc.Driver") ; Grâce à cette instruction, le pilote (ou driver) JDBC (Java DataBase Connector) relatif à la base de données MySQL est chargé en mémoire. Ensuite, pour réaliser une connexion, le pilote propose la méthode getConnection() dont la syntaxe d’utilisation se présente ainsi : Connection cnx = DriverManager.getConnection(urlJdbc); Examinons chacun des termes de cette instruction. La méthode getConnection() est appelée via la classe DriverManager. Cette dernière regroupe toutes les méthodes permettant la détection des pilotes appropriés pour établir une connexion. La méthode getConnection() demande qu’on lui indique en paramètre où se trouve la base de données, ainsi que le nom d’utilisateur et son mot de passe. Cette information est stockée sous la forme d’une chaîne de caractères nommée urlJdbc. La façon dont est construite cette chaîne est décrite ci-après. Lorsque la connexion est enfin réalisée, la méthode getConnection() retourne en résultat une valeur de type Connection, enregistrée dans un objet appelé cnx. Cet objet est essentiel, puisque c’est ensuite à travers lui que va s’effectuer la communication entre JSP et MySQL. Construction de l’URL Jdbc Pour établir une connexion, il est nécessaire d’indiquer les informations telles que le protocole utilisé, le lieu où se trouve la base de données, le nom d’utilisateur et son mot de passe. Le protocole ainsi que le lieu où se trouve la base de données s’écrivent sous la forme d’une URL (Uniform Resource Locator), appelée communément URL Jdbc. Elle s’écrit comme suit : "jdbc:mysql://" + hostname + ":" + port + "/" + nomDeLaBase ; où : ● hostname est une variable de type String qui contient soit le nom réseau de la machine hébergeant la base de données, soit l’adresse IP de cette machine. ● port est une variable de type String qui contient le numéro de port d’écoute du serveur MySQL. © Éditions Eyrolles 189 3646_09_Ch05 Page 190 Mercredi, 4. août 2004 1:49 13 partie n° 2 > Apogee FrameMaker Couleur Concepts avancés nomDeLaBase est une variable de type String qui contient le nom de la base de don- ● nées sur le serveur. L’ensemble de ces informations est stocké à l’intérieur d’une chaîne de caractères, nommée urlJdbc, comme suit : urlJdbc = "jdbc:mysql://" + hostname + ":" + port + "/" + nomDeLaBase ; Le nom d’utilisateur ainsi que le mot de passe sont nécessaires à la mise en place d’une connexion. En effet, il existe différents types d’utilisateurs allant du simple consultant à l’administrateur en passant par le gestionnaire. Pour distinguer chaque utilisateur et déterminer son droit d’accès, l’administrateur de la base crée des comptes utilisateur caractérisés par un login et un mot de passe. Le login et le mot de passe sont envoyés lors de la demande de connexion, en tant que paramètres de l’URL Jdbc, à laquelle ils sont ajoutés de la façon suivante : urlJdbc = urlJdbc + "?user=" + login + "&password=" + password ; où : login correspond au nom du compte de l’utilisateur désirant travailler sur la base de don- ● nées. password correspond au mot de passe associé au compte utilisateur. ● Toutes ces données (URL, compte utilisateur et mot de passe) sont établies par l’administrateur de la base de données, lors de sa mise en place. Pour notre cas, reportez-vous à la procédure d’installation de MySQL en annexe « Contenu et exploitation du CD-Rom », à la section « Installation de MySQL sous Windows ou Linux ». La mise en place de l’URL s’effectue par l’intermédiaire d’une méthode métier dont la structure est la suivante : private String construireUrlJdbc() { String urlJdbc ; urlJdbc = "jdbc:mysql://" + hostname + ":" + port + "/" + nomDeLaBase ; urlJdbc = urlJdbc + "?user=" + login + "&password=" + password ; return urlJdbc ; } Cette méthode construit et renvoie l’URL Jdbc à partir des cinq informations nécessaires à la connexion host, port, nomDeLaBase, login et passwd. Ces valeurs sont définies comme propriétés du composant JavaBean. 190 © Éditions Eyrolles 3646_09_Ch05 Page 191 Mercredi, 4. août 2004 1:49 13 > Apogee FrameMaker Couleur chapitre n° 5 Interroger une base de données Une méthode pour établir la connexion Examinons maintenant l’écriture de la méthode etablirConnexion() qui permet la connexion avec la base de données : private boolean etablirConnexion() { boolean statusConnexion = false; try { Class.forName("com.mysql.jdbc.Driver"); urlJdbc = construireUrlJdbc(); cnx = DriverManager.getConnection(urlJdbc); statusConnexion = true; } catch ( Exception e ) { statusConnexion = false; System.out.println(e); } return statusConnexion; } La méthode reprend les méthodes Class.forName(), construireUrlJdbc() et DriverManager.getConnection() étudiées précédemment. Ces méthodes sont insérées au sein d’une structure try–catch pour gérer les erreurs qui pourraient se produire lors de la connexion. En effet, la structure try-catch permet de « lever » les exceptions. Si une erreur se produit lors de l’exécution des instructions contenues dans la partie try, alors les instructions situées dans la partie catch sont exécutées. Figure 5-5 © Éditions Eyrolles Après validation du formulaire ➊, le serveur charge le pilote et se connecte ➋. En retour, il fournit un numéro de connexion ➌. 191 3646_09_Ch05 Page 192 Mercredi, 4. août 2004 1:49 13 partie n° 2 > Apogee FrameMaker Couleur Concepts avancés Ainsi pour notre exemple, dans la structure try, la valeur retournée par la méthode getConnection() est affectée à l’objet cnx de type Connection et la variable booléenne statusConnexion prend la valeur true. En cas d’erreur lors de la connexion, le bloc catch met à false la variable booléenne statusConnexion et écrit le type d’erreur dans le fichier C:\Program Files\Apache Software Foundation\Tomcat 5.0\logs\stderr (Windows) ou /usr/local/jakarta-tomcat-5.0.25/logs/stderr (Linux). Propriétés et méthodes d’accès du composant DBConnexion L’étude des méthodes métier construireUrlJdbc() et etablirConnexion() montre qu’il est nécessaire de définir les variables login, password, hostname, port, nomDeLaBase et cnx comme propriétés du composant DBConnexion. La déclaration des propriétés s’effectue de la façon suivante : private private private private private private String login ; String password ; String hostname; String port; String nomDeLaBase; Connection cnx; Pour se connecter, le système et l’utilisateur doivent transmettre, par l’intermédiaire d’un JSP, les valeurs relatives aux propriétés login, password, hostname, port, nomDeLaBase. Chacune de ces propriétés doit donc être accessible en écriture. Les propriétés étant définies pour des raisons de sécurité en mode private, l’accès aux propriétés s’effectue par l’intermédiaire des méthodes d’accès suivantes : public void setLogin (String valeur) { login = valeur ; } public void setPassword (String valeur) { password = valeur ; } public void setHostname (String valeur) { hostname = valeur ; } public void setPort (String valeur) { port = valeur ; } public void setNomDeLaBase (String valeur) { nomDeLaBase = valeur ; } 192 © Éditions Eyrolles 3646_09_Ch05 Page 193 Mercredi, 4. août 2004 1:49 13 chapitre n° 5 > Apogee FrameMaker Couleur Interroger une base de données Les méthodes d’accès en écriture ou en lecture sont étudiées au chapitre 4. « Utiliser un objet Java dans un script », section « Qu’est ce qu’un JavaBean ? ». À l’inverse, la propriété cnx est créée par le composant DBConnexion. Elle doit être transmise aux composants qui s’occupent de gérer les requêtes vers la base de données. Cette propriété doit donc être accessible en lecture, comme le montre la méthode suivante : public Connection getCnx() { if (etablirConnexion()) { return cnx; } else { return null; } } Afin de gérer les erreurs, la méthode getCnx() renvoie une valeur null si la connexion ne peut s’établir. Pour cela, elle teste le résultat retourné par la méthode etablir Connexion(). Pour que le type Connection et que les méthodes Class.forName() et getConnection() soient reconnus par le compilateur Java, il convient de placer, au début du composant DBConnexion, l’instruction import java.sql.* ;. Le code source complet du composant DBConnexion /* Fichier : DBConnexion.java Class : DBConnexion Package : exemples.ch5 */ package Exemples.Ch5 ; import java.io.Serializable ; import java.sql.*; public class DBConnexion implements java.io.Serializable { //Définition des propriétés private String login; private String password ; private String hostname; private String port; private String nomDeLaBase; © Éditions Eyrolles 193 3646_09_Ch05 Page 194 Mercredi, 4. août 2004 1:49 13 partie n° 2 > Apogee FrameMaker Couleur Concepts avancés private Connection cnx; // Méthodes d’accès en écriture public void setLogin (String valeur) { login = valeur ; } public void setPassword (String valeur) { password = valeur ; } public void setHostname (String valeur) { hostname = valeur ; } public void setPort (String valeur) { port = valeur ; } public void setNomDeLaBase (String valeur) { nomDeLaBase = valeur ; } // Méthodes d’accès en lecture public Connection getCnx() { if (etablirConnexion()) { return cnx; } else { return null; } } // Méthodes invisibles (métier) private String construireUrlJdbc() { String urlJdbc ; urlJdbc = "jdbc:mysql://"+hostname+":" + port + "/" + nomDeLaBase ; urlJdbc = urlJdbc + "?user=" + login + "&password=" + password ; return urlJdbc ; } 194 © Éditions Eyrolles 3646_09_Ch05 Page 195 Mercredi, 4. août 2004 1:49 13 chapitre n° 5 > Apogee FrameMaker Couleur Interroger une base de données private boolean etablirConnexion() { boolean statusConnexion = false; try { Class.forName("com.mysql.jdbc.Driver"); urlJdbc=construireUrlJdbc(); cnx=DriverManager.getConnection(urlJdbc); statusConnexion = true; } catch ( Exception e ) { statusConnexion = false; System.out.println(e); } return statusConnexion; } } Mise en place d’un tube de communication Une fois la connexion établie, il s’agit d’envoyer des requêtes vers la base de données. Les requêtes sont transmises à l’aide d’un objet de liaison Java qui sait communiquer du monde JSP vers le monde MySQL et inversement. Concrètement, la mise en place de cette liaison s’effectue à travers un objet de type Statement. La classe Statement est une interface définie par Java. Une interface est une classe particulière qui définit les différents types de comportements sans en décrire réellement les actions. Les méthodes définies par un Statement ne peuvent être prédéfinies par le langage Java. Une requête, c’est-à-dire un comportement associé à un Statement, ne peut être décrite que par le programmeur en fonction de ce que l’application doit réaliser. Un objet de type Statement est comparable à un tube (ou, dans le jargon informatique, pipeline). Ce tube est bidirectionnel, il permet de communiquer dans les deux sens. L’application JSP envoie une requête vers la base de données, via le tube. En retour, la base transmet le ou les résultats par le même canal. Pour créer un objet Statement, il suffit de faire appel à la méthode createStatement() définie à l’intérieur de la classe Connection. Lorsque cet objet est créé, le tube de communication reste ouvert tant que l’objet est chargé en mémoire. © Éditions Eyrolles 195 3646_09_Ch05 Page 196 Mercredi, 4. août 2004 1:49 13 partie n° 2 > Apogee FrameMaker Couleur Concepts avancés Figure 5-6 Une fois la connexion établie ➌, le JSP demande la création d’une communication ➍ à l’aide d’un objet de type Statement➎. Création du composant JavaBean DBLien Examinons à travers un exemple comment créer et gérer un objet de type Statement. Pour cela, nous allons créer un composant JavaBean nommé DBLien. Les deux JavaBeans DBConnexion et DBLien peuvent être réunis en un seul JavaBean qui gère tous les aspects relatifs à la mise en place d’une communication JSP/base de données. Pour des raisons pédagogiques, nous avons préféré les présenter séparément. La méthode métier du JavaBean DBLien fait appel à la méthode createStatement() de la façon suivante : private boolean construireStatement (Connection cnx) { boolean statusStatement = false; try { lien=cnx.createStatement(); statusStatement = true ; } catch ( Exception e ) { statusStatement = false; System.out.println(e); } return statusStatement; } La méthode construireStatement() appelle la méthode createStatement() à travers l’objet cnx de type Connection. Cet objet est créé par le composant DBConnexion. La méthode createStatement() détecte les erreurs éventuelles de communication, il convient donc de l’insérer dans une structure try-catch. Si aucune erreur n’est détectée, le 196 © Éditions Eyrolles 3646_09_Ch05 Page 197 Mercredi, 4. août 2004 1:49 13 chapitre n° 5 > Apogee FrameMaker Couleur Interroger une base de données résultat de l’appel de createStatement() est stocké dans un objet nommé lien de type Statement et la variable booléenne statusStatement prend la valeur true. En cas d’erreur lors de la création du tube de communication, le bloc catch met à false la variable booléenne statusStatement et écrit le type d’erreur dans le fichier C:\Program Files\Apache Software Foundation\Tomcat 5.0\logs\stderr (Windows) ou /usr/local/jakarta-tomcat-5.0.25/logs/stderr (Linux). Propriétés et méthodes d’accès du composant DBLien L’objet lien est défini comme étant une propriété du composant DBLien. La propriété lien est créée par le composant DBLien. Elle doit être transmise aux composants qui s’occupent de gérer les requêtes vers la base de données. Cette propriété doit donc être accessible en lecture, comme le montre la méthode suivante : public Statement getLien(Connection cnx) { if (construitStatement(cnx)) { return lien; } else { return null; } } Nous voyons ici que la méthode getLien() retourne l’objet lien ou l’objet null en fonction du retour de la méthode métier construireStatement(). Elle prend également en paramètre l’objet cnx de façon à ce que ce dernier, créé par le composant DBConnexion, soit transmis via le JSP au composant DBLien. Le code source complet /* Fichier : DBLien.java Class : DBLien Package : exemples.ch5 */ package Exemples.Ch5 ; import java.io.Serializable ; import java.sql.*; public class DBLien implements java.io.Serializable { //Définition des propriétés private Statement lien = null; © Éditions Eyrolles 197 3646_09_Ch05 Page 198 Mercredi, 4. août 2004 1:49 13 partie n° 2 > Apogee FrameMaker Couleur Concepts avancés // Méthodes d’accès en lecture public Statement getLien(Connection cnx) { if (construireStatement(cnx)) { return lien; } else { return null; } } // Méthodes invisibles private boolean construireStatement (Connection cnx) { boolean statusStatement = false; try { lien=cnx.createStatement(); statusStatement = true ; } catch ( Exception e ) { statusStatement = false; System.out.println(e); } return statusStatement; } } Transmission de requêtes entre un JSP et une base de données Les deux composants DBConnexion et DBLien sont maintenant à notre disposition pour mettre en relation l’application JSP avec la base de données. La page JSP doit donc créer deux objets de type DBConnexion et DBLien et attribuer les valeurs appropriées aux différentes propriétés. Pour établir la connexion, le JSP doit également faire appel aux différentes méthodes d’accès définies au sein des composants. Création et initialisation des objets DBConnexion et DBLien En tout premier lieu, la page JSP doit importer les deux classes nécessaires à la manipulation d’un objet Connection et d’un objet Statement : <%@ page import="java.sql.Connection" %> <%@ page import="java.sql.Statement" %> Ensuite vient la création des deux objets correspondant aux deux composants. Dans un premier temps, les objets dbcnx et dblien sont créés grâce aux instructions : <!--// DBConnexion Bean--> <jsp:useBean id="dbcnx" class="Exemples.Ch5.DBConnexion" /> 198 © Éditions Eyrolles 3646_09_Ch05 Page 199 Mercredi, 4. août 2004 1:49 13 chapitre n° 5 > Apogee FrameMaker Couleur Interroger une base de données <!--// DBLien Bean --> <jsp:useBean id="dblien" class="Exemples.Ch5.DBLien" /> Cela fait, il convient d’initialiser l’objet dbcnx de façon à mettre en place la connexion. Cette initialisation s’effectue grâce aux instructions : <!--// Code d’initialisation //--> <jsp:setProperty name="dbcnx" property="login" value="jspuser" /> <jsp:setProperty name="dbcnx" property="password" value="jspuser" /> <jsp:setProperty name="dbcnx" property="hostname" value="localhost" /> <jsp:setProperty name="dbcnx" property="port" value="3306" /> <jsp:setProperty name="dbcnx" property="nomDeLaBase" value="livrejsp"/> Pour simplifier, nous avons choisi d’initialiser les propriétés de l’objet dbcnx à l’intérieur même du JSP. L’utilisateur qui se connecte a pour login et pour mot de passe jspuser. Pour autoriser la connexion à d’autres utilisateurs, vous devez créer un formulaire de saisie du login et du mot de passe avant toute initialisation. Le nom des utilisateurs et celui de la base de données sont définis par l’administrateur de la base de données lors de sa mise en place. Pour notre cas, reportez-vous à la procédure d’installation de MySQL décrite en annexe « Contenu et exploitation du CD-Rom », à la section « La création des bases système MySQL ». La connexion s’établit sur le port 3306 en local (localhost) sur la base de données portant le nom livrejsp. Pour l’objet dblien, aucune propriété n’est à initialiser, la seule propriété lien étant initialisée par le composant lui-même. Accéder aux propriétés des objets DBConnexion et DBLien Après création et initialisation, la connexion s’établit à travers l’objet dbcnx. Le résultat de cette connexion est enregistré dans l’objet cnx, comme le montrent les instructions suivantes : Connection cnx = dbcnx.getCnx(); if (cnx == null) { out.println("<font color=red>Connexion impossible : " + cnx + "</font>"); } else { out.println("<font color=green>Connexion établie : " + cnx + "</font>"); } © Éditions Eyrolles 199 3646_09_Ch05 Page 200 Mercredi, 4. août 2004 1:49 13 partie n° 2 > Apogee FrameMaker Couleur Concepts avancés Lors de l’exécution de ces instructions, le serveur envoie sur le flux HTTP, grâce à la méthode out.println(), un message confirmant ou infirmant l’obtention de la connexion. Pour finir, la mise en place du tube de communication s’effectue grâce aux instructions suivantes : Statement lien = dblien.getLien(cnx); if (lien == null) { out.println("<font color=red>KO : " + lien + "</font>"); } else { out.println("<font color=green>OK : " + lien + "</font>"); } L’objet lien matérialise le tube de communication. Il est créé par l’intermédiaire de l’objet dblien et à l’aide de l’objet cnx. Comme précédemment, lors de l’exécution de ces instructions, le serveur envoie sur le flux HTTP un message confirmant ou infirmant la mise en place du tube de communication. Le code source complet Les instructions relatives à la connexion et à la mise en place du tube de communication sont écrites en Java. Elles sont placées entre des balises <% et %> (zones grisées). <!-# Fichier : connexionLien.jsp # Description : # Se connecte et crée un tube de communication # avec la base de données livrejsp # login et mot de passe par défaut : jspuser # JavaBeans : DBConnexion, DBLien --> <!-- La page JSP manipule des objets de type Connection et Statement --> <%@ page import="java.sql.Connection" %> <%@ page import="java.sql.Statement" %> <!--// DBConnexion Bean--> <jsp:useBean id="dbcnx" class="Exemples.Ch5.DBConnexion"> <!--// Code d’initialisation //--> <jsp:setProperty name= "dbcnx" property="login" value="jspuser"/> <jsp:setProperty name= "dbcnx" property="password" value="jspuser"/> <jsp:setProperty name= "dbcnx" property="hostname" value="localhost"/> <jsp:setProperty name= "dbcnx" property="port" value="3306"/> 200 © Éditions Eyrolles 3646_09_Ch05 Page 201 Mercredi, 4. août 2004 1:49 13 chapitre n° 5 > Apogee FrameMaker Couleur Interroger une base de données <jsp:setProperty name= "dbcnx" property="nomDeLaBase" value="livrejsp"/> </jsp:useBean> <!--// DBLien Bean --> <jsp:useBean id="dblien" class="Exemples.Ch5.DBLien"/> <html> <body> <table width=700><tr><td> <h1><font face=arial>Sélection sur la table Livres</h1> <h3><font face=arial>La connexion avec la base de données</h3> <font face=arial size=2 color=black>1ère étape : Création d’une connexion vers la base de données :<br> <% // Récupération de la connexion Connection cnx = dbcnx.getCnx(); if (cnx == null) { out.println("<font color=red>Connexion impossible : " + cnx + "</font>"); } else { out.println("<font color=green>Connexion établie : " + cnx + "</font>"); } %> <br><br> <font face=arial size=2 color=black>2ème étape : Création d’un tube de communication :<br> <% // Création du tube de communication avec la base de données Statement lien = dblien.getLien(cnx); if (lien == null) { out.println("<font color=red>Communication impossible : " + lien + "</font>"); } else { out.println("<font color=green>Communication établie : " + lien + "</font>"); } %> © Éditions Eyrolles 201 3646_09_Ch05 Page 202 Mercredi, 4. août 2004 1:49 13 partie n° 2 > Apogee FrameMaker Couleur Concepts avancés </td></tr></table> </body> </html> La figure 5-7 présente le résultat de l’exécution du programme connexionLien.jsp. Figure 5-7 Le programme connexionLien.jsp affiche les différentes étapes nécessaires à la connexion d’une base de données MySQL. Consulter ou modifier une base de données ? Après la connexion et la mise en place d’un tube de communication, nous pouvons effectuer différents traitements sur la base de données. Il existe deux types de traitement : ● la consultation, qui permet de savoir si, par exemple, un élément particulier est enregistré dans la base ; ● la modification, pour insérer, mettre à jour ou supprimer un élément de la base. JSP propose deux méthodes pour réaliser ces traitements, executeQuery() et execute Update(). Ces deux méthodes s’exécutent à travers le tube de communication Statement créé dans la section précédente (voir figure 5-8). Modifier la base de données Pour modifier le contenu d’une base de données, il convient d’utiliser la méthode execute Update(). Grâce à cette dernière, les requêtes MySQL INSERT, UPDATE et DELETE sont exécutables à l’intérieur d’un programme JSP. La requête INSERT permet l’insertion de lignes supplémentaires dans une ou plusieurs tables, alors que la requête UPDATE autorise la mise à jour d’une ligne d’une table, et que la requête DELETE est utilisée pour supprimer une ou plusieurs lignes d’une table de la base de données. 202 © Éditions Eyrolles 3646_09_Ch05 Page 203 Mercredi, 4. août 2004 1:49 13 chapitre n° 5 > Apogee FrameMaker Couleur Interroger une base de données Figure 5-8 Lorsque le tube de communication est mis en place, les requêtes sont transmises à la base de données ➎ et, s’il y a un résultat, celui-ci est retourné au navigateur ➏. La syntaxe d’utilisation de la méthode executeUpdate(). est la suivante : int valeur = lien.executeUpdate(commande); où : ● lien est un objet de type Statement et représente le tube de communication décrit précédemment. En appliquant la méthode à l’objet lien, nous sommes sûrs que la commande est exécutée à l’intérieur du tube de communication. ● commande est une chaîne de caractères qui contient la commande MySQL d’insertion, de mise à jour ou de suppression. ● valeur est la valeur de retour de la méthode. Elle représente le nombre de lignes insérées, mises à jour ou supprimées, en fonction de la commande exécutée. Exemple : insertion d’un nouveau livre dans la table Livres L’objectif est ici d’insérer un nouveau livre dans la table Livres. Pour cela, nous devons réaliser les cinq étapes suivantes (voir figure 5-9) : ➊ Mise en page d’un formulaire contenant les attributs de la table Livres. ➋ Validation des données à insérer dans la base de données à l’aide d’un composant Java Bean. ➌ Récupération des données transmises par le composant JavaBean. ➍ Connexion à la base de données et ouverture d’un tube de communication. ➎ Insertion des données à l’aide de la commande executeQuery(). Les quatre premières étapes ont déjà été réalisées, soit au cours du chapitre 4, soit lors de la section précédente de ce chapitre. Notre tâche consiste donc à récupérer tous les fichiers utiles à la réalisation de notre application et à les assembler correctement (voir figure 5-9). © Éditions Eyrolles 203 3646_09_Ch05 Page 204 Mercredi, 4. août 2004 1:49 13 partie n° 2 > Apogee FrameMaker Couleur Concepts avancés Figure 5-9 Les cinq étapes permettant d’insérer un livre dans la base de données. L’étape 1 a pour finalité de construire un formulaire HTML qui présente les différents champs de saisie correspondant aux champs de la table Livres, comme le montre la figure 5-10. Figure 5-10 204 Formulaire de saisie permettant d’enregistrer les informations relatives à un livre. © Éditions Eyrolles