Feuille 8 Dépnt Info, I.U.T. d’Orsay 2ième année C lient S erveur pour novembre 2003 I ntranet Liaison avec des données On dispose de la base de données BdHtml97.mdb , construite avec Access; le fichier se trouve dans le répertoire '…/tp/FI2/csi_orientation/bases'. I.- On crée, avec Jbuilder, une application avec interface utilisateur qui visualise une table 1.- Mise en place de la source de données ODBC Cliquer sur Démarrer/Panneau de configuration/Outils d’administration/Sources de données ODBC. Ajouter un DSN utilisateur AliasBase avec le pilote Microsoft Access Driver en sélectionnant la base de données BdHtml97.mdb. 2.- Créer un nouveau projet tp_bd dans le répertoire tpcsi_bd de titre "Liaison avec les BD". N'oubliez pas de modifier les valeurs par défaut des répertoires 'Source' et 'Sortie' prsentées dans la boîte de dialogue de configuation 'Projet/Propriétés'. 3.- Dans ce projet, créer une application en précisant l'option suivante 'Générer les commentaires en en-tête'. et en mettant comme nom de classe 'TestVoirTable', comme titre 'Etude de liaison avec les BD' et comme classe 'VoirTable'. Passer en mode conception. 4.- Création des éléments non visuels, liés à la base Dans le cadre de l'application, créer un objet Database1 de type Database au moyen de l'onglet Data Express. Comment est modifiée la sous-arborescence Interface utilisateur et celle Accès aux données? Interface Utilisateur Accès aux données Cliquer dans la propriété connection et remplacer 'aucun'. Pour cela, choisir le pilote JdbcOdbcDriver et l’URL jdbc :odbc :odbcAliasBase. Avant de valider, tester la connexion. Si Succès, OK, sinon, … trouver votre erreur. Créer un queryDataSet queryDataSet1 à partir de l'onglet Data Express. Dans la propriété query de queryDataSet1, associer la Database et en utilisant le constructeur SQL, construire une requête permettant d'extraire les noms, balises et valeurs de la table -1- 841059676 Attributs classés par ordre alphabétique et où balise = A. Tester la requête. Si succès, OK, sinon trouver l'erreur. 5.- Création des éléments d’interface utilisateur A jouter, en mode conception toujours, trois composants d’interface utilisateur dans la fenêtre ; ces composants sont pris dans l’onglet ‘dbSwing’ : Au nord, une barre de navigation (JdbNavToolBar), nom de variable : barreNavig ; Au sud, une barre d’état (JdbStatusLabel), nom de variable : barreEtat ; Au centre, une ‘grille’ avec barres de défilement (TableScrollPane contenant un objet JdbTable) Relier ces composants à la requête queryDataset1, par la propriété dataset. Donner l'état des sous-arborescences Interface Utilisateur et Accès aux données. Interface Utilisateur Accès aux données Visualiser par un dessin les connexions entre les différents éléments et récapituler les différentes propriétés que vous avez modifiées. D’après le source, quelles sont les méthodes utilisées pour accéder à la base et pour accéder aux données ? -2- 841059676 II.- On réalise une interrogation analogue sur la même base, sans interface utilisateur. 1.- Ecrire une application qui reçoit par la ligne de commande un nom de balise Html, puis interroge la base pour afficher les attributs de cette balise et les commentaires associés. Il faudra établir la connexion à la base en passant par Odbc, puis envoyer une requête, afficher les lignes du résultats et fermer la connexion. 2. Ecrire une deuxième version qui place les résultats dans un fichier structuré comme un document Html, que l'on pourra visualiser avec un navigateur. Il est possible que, suivant le nom de balise fourni, il n'y ait aucun attribut. Annexe1: exemple de source Java d'accès /** AffTable.java : Table Etudiant : exemple d'accès à une base, par odbc num nom adr 100 Abel Paris 110 Adam Orsay 120 Eve Orsay */ import java.sql.*; import sun.jdbc.odbc.JdbcOdbcDriver; public class AffTable { // // // // // } public static void main(String[] args) { try { Charger le pilote jdbc-odbc, et se connecter Class pil = Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection ( "jdbc:odbc:Etudiant", "U", "mdp"); Création d'un objet 'requête', et envoie Statement req = con.createStatement(); ResultSet res = req.executeQuery ("Select * From Etudiant where nom = ’"+ args [0] + "’; "); Afficher le résultat int n; while( res.next()) { afficher les trois valeurs d'une ligne (n = 1...3) for(n = 1 ; n <= 3; n ++) System.out.print(res.getString(n)+'\t'); System.out.println(""); } con.close(); Fermer la connexion } catch(Exception e) { e.printStackTrace(); } } // fin class AffTable Annexe2: exemple de document Html Voici document créé quand on donne 'A' comme nom de balise. Le texte souligné est extrait du résultat de la requête. Votre programme java doit donc créer un fichier, y écrire les lignes 1 à 6; puis extraire les résultats de la requête pour confectionner les lignes 7 à 9, et enfin terminer par les dernières lignes. -3- 841059676 1 2 3 4 5 6 7 8 9 10 11 12 <html> <head> <title> Attributs d'une balise </title> </head> <body> <h2> Attributs de la balise 'A' </h2> <br>name : définit la position comme une ancre <br>href : lien hypertexte <br>target : indique le cadre où doit s'afficher le lien hypertexte </body> </html> Annexe3: exemple de création d'un fichier Un fichier de nom tmp, donc situé dans le répertoire courant, est créé ci-contre; on utilise ensuite la classe PrintStream pour écrire dans ce fichier. L'objet System.out est lui aussi de cette classe; les méthodes habituellement utilisées pour afficher à l'écran sont aussi disponibles pour écrire dans le fichier. Cependant, pour une opération sur fichier il ne faut pas oublier de fermer le fichier. -4- import java.io.* ; // Ouverture d'un fichier FileOutputStream fos = new FileOutputStream("tmp"); // Un flot de sortie sur ce fichier PrintStream surF = new PrintStream(fos); surF.println("Premiere ligne"); surF.print("deuxieme ligne\n"); surF.print("<br>" + 123.33); surF.flush(); surF.close(); } 841059676 Liaison avec des données Eléments de réponse On dispose de la base de données BdHtml97.mdb , construite avec Access; le fichier se trouve dans le répertoire '…/tp/FI2/csi_orientation/bases'. I.- On veut créer une application en visualisant une partie sous Jbuilder avec interface utilisateur 1.- Mise en place de la source de données ODBC Cliquer sur Démarrer/Panneau de configuration/Outils d’administration/Sources de données ODBC. Ajouter un DSN utilisateur AliasBase avec le pilote Microsoft Access Driver en sélectionnant la base de données BdHtml97.mdb. 2.- Créer un nouveau projet tp_bd dans le répertoire tpcsi_bd de titre "Liaison avec les BD". N'oubliez pas de mettre à jour les informations Source et Sortie dans Projet/Propriétés. 3.- Dans ce projet, créer une application en précisant les options suivantes. Cliquer sur l'option Générer les commentaires en en-tête. Mettez comme nom de classe TestVoirTable, comme titre Etude de liaison avec les BD et comme classe VoirTable Passer en mode conception. 4.- Création des différents éléments liés à la base Dans le cadre de l'application, créer un objet Database1 de type Database au moyen de l'onglet Data Express. Comment est modifiée la sous-arborescence Interface utilisateur et celle Accès aux données? Interface Utilisateur Accès aux données this Database1 ContentPane (BorderLayout) QueryDataSet1 BorderLayout Cliquer dans la propriété connection et remplacer 'aucun'. Pour cela, choisir le pilote JdbcOdbcDriver et l’URL jdbc :odbc :odbcAliasBase. Avant de valider, tester la connexion. Si Succès, OK, sinon, … trouver votre erreur. Créer un queryDataSet queryDataSet1 à partir de l'onglet Data Express. Dans la propriété query de queryDataSet1, associer la Database et en utilisant le constructeur SQL, construire une requête permettant d'extraire les noms, balises et valeurs de la table Attributs classés par ordre alphabétique et où balise = A. Tester la requête. Si succès, OK, sinon trouver l'erreur. Donner l'état des sous-arborescence Interface Utilisateur et Accès aux données. Visualiser par un dessin les connexions entre les différents éléments et récapituler les différentes propriétés que vous avez modifiées. -5- 841059676 Le composant Database encapsule une connexion de base de données via JDBC avec un serveur SQL et propose également une gestion simplifiée des transactions. Le composant QueryDataSet propose les caractéristiques permettant d’exécuter une instruction de requêtes portant sur les tables d’une BD SQL et de stocker l’ensemble des résultats de la requête. II.- On veut réaliser une interrogation analogue sur la même base, sans interface utilisateur. 1.- Ecrire une application qui reçoit par la ligne de commande un nom de balise Html, puis interroge la base pour afficher les attributs de cette balise et les commentaires associés. Il faudra établir la connexion à la base en passant par Odbc, puis envoyer une requête, afficher les lignes du résultats et fermer la connexion. import java.sql.*; import sun.jdbc.odbc.JdbcOdbcDriver; /** * <p>Titre : </p> * <p>Description : </p> * <p>Copyright : Copyright (c) 2003</p> * <p>Société : </p> * @author non attribuable * @version 1.0 */ public class Q2 { public Q2() { } public static void main(String[] args) { try { Class pil = Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection( "jdbc:odbc:AliasBase"); Statement req = con.createStatement(); ResultSet res = req.executeQuery( "SELECT * FROM Attributs WHERE balise='" + args[0] + "';"); int n; while(res.next()) { for(n = 1 ; n <= 2; n ++) System.out.print(res.getString(n) + "\t"); System.out.println(); } con.close(); } catch(Exception e) {e.printStackTrace(); } } } -6- 841059676 2. Ecrire une deuxième version qui place les résultats dans un fichier structuré comme un document Html, que l'on pourra visualiser avec un navigateur. Il est possible que, suivant le nom de balise fourni, il n'y ait aucun attribut. import java.sql.*; import sun.jdbc.odbc.JdbcOdbcDriver; import java.io.*; /** * <p>Titre : </p> * <p>Description : </p> * <p>Copyright : Copyright (c) 2003</p> * <p>Société : </p> * @author non attribuable * @version 1.0 */ public class Q3 { public Q3() { } public static void main(String[] args) { try { Class pil=Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection( "jdbc:odbc:AliasBase"); Statement req = con.createStatement(); ResultSet res = req.executeQuery( "SELECT * FROM Attributs WHERE balise = '" + args[0] + "';"); int n; // Fichier de sortie FileOutputStream fics = new FileOutputStream("page.html"); PrintStream page = new PrintStream(fics); page.println("<html> <head>\n"); page.println("<title>Attributs d'une balise </title>\n"); page.println("</head> <body>\n"); page.println ("<h2>Attributs de la balise " + args[0] + "</h2>\n"); while(res.next()) { page.println("<br>" + res.getString(1)+ " : "); page.println(" " + res.getString(4)); System.out.println(); } con.close(); page.println("</body></html>\n"); } catch(Exception e) {e.printStackTrace(); } } } -7- 841059676