Dépnt Info, I.U.T. d’Orsay 	Feuille  8	novembre 2003
2ième année
Client   Serveur  pour  Intranet

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?

Accès aux données

Interface Utilisateur

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.
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.

Accès aux données

Interface Utilisateur

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 ?

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 :  exemple d'accès à une base, par odbc
Table Etudiant :         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.

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. 	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();
}	

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?

Accès aux données

Interface Utilisateur

Database1

this

QueryDataSet1

ContentPane (BorderLayout)

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.

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

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