Académique Documents
Professionnel Documents
Culture Documents
Informatique de Gestion :
Travaux Pratiques
Titulaire du Cours:
Prof. Dr. Saint-Jean DJUNGU
Pouvoir implémenter les bases de données en SQL Server, Access, MYSQL, Java
DB, etc.
Pré requis
Pour bien assimiler ces travaux pratiques, l’étudiant doit avoir une bonne
connaissance sur :
Quand nous construisons directement les tables d’une base de données dans un logiciel de
gestion des bases de données (SQL Server, MYSQL,…), nous sommes exposés à deux types de
problèmes :
Nous ne savons pas toujours dans quelle table placer certaines colonnes (par
exemple, l’adresse de livraison se met dans la table des clients ou dans la table de
commande) ;
Nous avons du mal à prévoir les tables de jonction intermédiaires (par exemple, la
table des interprétations qui est indispensable entre les tables des films et des
acteurs).
Face à un problème bien défini (soit à travers un énoncé précis, soit à travers
une collection de formulaires ou d’états que le nouveau système d’information est censé
de remplacer), nous pouvons procéder comme suit pour concevoir un MCD :
I.1.2.1. Définitions
I.1.2.2. Propriétés
Transitivité : si X Y et Y Z alors X Z
Mais cette dernière dépendance fonctionnelle est transitive, car il faut passer
par le numéro de client pour l’obtenir. Au contraire, la deuxième dépendance de notre
exemple est directe. Seules les dépendances directes vont nous intéresser.
Par exemple, la quantité de commande (d’un article dans une commande) dépend de
deux attributs : le numéro de commande et le numéro de l’article. Notons que cette
dépendance est à la fois non élémentaire et directe.
Numéro de commande + numéro de l’article quantité commandée
Concerner
quantite
Première forme normale : à un instant donné dans une entité, pour un individu, un
attribut ne peut prendre qu’une valeur et non pas, un ensemble ou une liste des valeurs.
Livres
livres Auteurs
1,n
PK numero livre 1,n
PK numero livre PK numero auteur
titre
auteurs
titre Ecrire nom
editeur
editeur
nbre de page
nbre de page
année
année
Deuxième forme normale : l’identifiant peut être composé de plusieurs attributs mais les
autres attributs de l’entité doivent dépendre de l’identifiant en entier et non pas une
partie de cet identifiant.
Troisième forme normale : tous les attributs d’une entité doivent dépendre directement
de son identifiant et d’aucun d’autre attribut.
Règle 2 : une association de type 1 :n disparait, au profit d’une clé étrangère dans la table
côté 0,1 ou 1,1, qui référence la clé primaire de l’autre table. Cette d’une clé étrangère ne
peut recevoir la valeur vide si cardinalité est 1,1.
Règle3 : une association binaire de type n : m devient une table supplémentaire (parfois
appelé Table de jonction, Table de jointure, table d’association) dont la clé primaire est
composée de deux clés étrangères.
Règle 4 : une association binaire de type 1 : 1est traduite comme une association de type
1 : n sauf que la clé étrangère se voit imposer une contrainte d’unicité en plus d’une
éventuelle contrainte de non vacuité.
Si les associations fantômes ont été éliminées, il devrait y avoir au moins un coté de
cardinalité 0,1. C’est alors dans la table du côté opposé que doit aller la clé étrangère. Si
les deux côtés sont de cardinalités 0,1 alors la clé étrangère peut être placée
indifféremment dans l’une de deux tables.
Règle 5 : une association non binaire est traduite par une table supplémentaire dont la clé
primaire est composée d’autant de clés étrangères que d’entités en association.
Architecture 3 tiers
L'architecture 3-tiers ou architecture à trois niveaux est l'application du modèle plus
général qu'est le multi-tiers.
L'architecture logique du système est divisée en trois niveaux ou couches :
• couche présentation
• couche métier
• couche accès aux données
C'est une extension du modèle client/serveur.
L'architecture 3-tiers (de l'anglais tiers signifiant étage ou niveau) est un modèle logique
d'architecture applicative qui vise à séparer très nettement trois couches logicielles au
sein d'une même application ou système, à modéliser et présenter cette application
comme un empilement de trois couches, étages, niveaux ou strates dont le rôle est
clairement défini :
• la présentation des données : correspondant à l'affichage, la restitution sur le
poste de travail, le dialogue avec l'utilisateur ;
• le traitement métier des données : correspondant à la mise en œuvre de
l'ensemble des règles de gestion et de la logique applicative ;
• et enfin l'accès aux données persistantes: correspondant aux données qui sont
destinées à être conservées sur la durée, voire de manière définitive.
Dans cette approche, les couches communiquent entre elles au travers d'un « modèle
d'échange », et chacune d'entre elles propose un ensemble de services rendus. Les
services d'une couche sont mis à disposition de la couche supérieure. On s'interdit par
conséquent qu'une couche invoque les services d'une couche plus basse que la couche
immédiatement inférieure ou plus haute que la couche immédiatement supérieure
(chaque niveau ne communique qu'avec ses voisins immédiats).
Le rôle de chacune des couches et leur interface de communication étant bien définis, les
fonctionnalités de chacune d'entre elles peuvent évoluer sans induire de changement
dans les autres couches. Cependant, une nouvelle fonctionnalité de l'application peut
avoir des répercussions dans plusieurs d'entre elles. Il est donc essentiel de définir un
modèle d'échange assez souple, pour permettre une maintenance aisée de l'application.
Elle correspond à la partie de l'application visible et interactive avec les utilisateurs. On parle
d'Interface Homme Machine. En informatique, elle peut être réalisée par une application
graphique ou textuelle. Elle peut aussi être représentée en HTML pour être exploitée par un
navigateur web ou en WML pour être utilisée par un téléphone portable.
On conçoit facilement que cette interface peut prendre de multiples facettes sans changer la
finalité de l'application.
La couche métier offre des services applicatifs et métier [1] à la couche présentation. Pour
fournir ces services, elle s'appuie, le cas échéant, sur les données du système, accessibles au
travers des services de la couche inférieure. En retour, elle renvoie à la couche présentation
les résultats qu'elle a calculés.
Elle consiste en la partie gérant l'accès aux gisements de données du système. Ces données
peuvent être propres au système, ou gérées par un autre système. La couche métier n'a pas
à s'adapter à ces deux cas, ils sont transparents pour elle, et elle accède aux données de
manière uniforme (couplage faible).
Ces données sont pérennes, car destinées à durer dans le temps, de manière plus ou moins
longue, voire définitive.
Les données peuvent être stockées indifféremment dans de simples fichiers texte, ou
eXtensible Markup Language (XML), ou encore dans une base de données. Quel que soit le
support de stockage choisi, l'accès aux données doit être le même. Cette abstraction
améliore la maintenance du système.
Les services sont mis à disposition de la couche métier. Les données renvoyées sont issues
du/des gisements de données du système.
Les données peuvent aussi être gérées de manière externe. Elles ne sont pas stockées par le
système considéré, il s'appuie sur la capacité d'un autre système à fournir ces informations.
Par exemple, une application de pilotage de l'entreprise peut ne pas sauvegarder des
données comptables de haut niveau dont elle a besoin, mais les demander à une application
de comptabilité. Celle-ci est indépendante et préexistante, et on ne se préoccupe pas de
savoir comment elle les obtient ou si elle les sauvegarde, on utilise simplement sa capacité à
fournir des données à jour.
III.1. JDBC
II.1. Les Outils nécessaires pour utiliser JDBC
Les classes de JDBC sont regroupées dans le package java.sql et sont incluses
dans le JDK à partir de sa version 1.1. La version 2.0 de cette API est incluse dans la version
1.2 du JDK.
Pour pouvoir utiliser JDBC, il faut un pilote qui est spécifique à la base de
données à laquelle on veut accéder. Avec le JDK, Sun fournit un pilote qui permet l'accès aux
bases de données via ODBC.
Ce pilote permet de réaliser l'indépendance de JDBC vis à vis des bases de
données.
Pour utiliser le pont JDBC−ODBC sous Window 9x ou version supérieure, il faut
utiliser ODBC en version 32 bits.
La partie native (ODBC et son pilote) rend l'application moins portable et dépendante
d'une plateforme.
Type 2 : un driver écrit en java qui appelle l'API native de la base de données
Ce type de driver convertit les ordres JDBC pour appeler directement les API de la base de
données via un pilote natif sur le client. Ce type de driver nécessite aussi l'utilisation de code
natif sur le client.
Ce type de driver, écrit en java, appelle directement le SGBD par le réseau. Ils sont fournis
par l'éditeur de la base de données.
Les drivers se présentent souvent sous forme de fichiers jar dont le chemin doit être ajouté
au classpath pour permettre au programme de l'utiliser.
Pour utiliser un pilote de type 1 (pont ODBC−JDBC) sous Windows 9x, il est
nécessaire d'enregistrer la base de données dans ODBC avant de pouvoir l'utiliser.
Pour lancer cette application sous Windows 9x, il faut doubler cliquer sur
l'icône "ODBC 32bits" dans le panneau de configuration.
Sous Windows XP, il faut double cliquer sur l'icône "Source de données
(ODBC)" dans le répertoire "Outils d'administration" du panneau de configuration.
Pour se connecter à une base de données via ODBC, il faut tout d'abord
charger le pilote JDBC−ODBC qui fait le lien entre les deux.
try{
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch (ClassNotFoundException e){}
try{
Class.forName ("com.mysql.jdbc.Driver");
}
try{
Class.forName("org.apache.derby.jdbc.ClientDriver");
}
catch(Exception e){
jTextField2.setText("Exception");
}
Syntaxe de base :
Exemples :
1. ODBC
DBurl = "jdbc:odbc:info";
try{
con = DriverManager.getConnection(DBurl,"root","");
}
catch(SQLException e){}
2. MySQL Server
DBurl = "jdbc:mysql://localhost:3307/info";
try{
Connection con = DriverManager.getConnection(DBurl,"root","");
}
catch(SQLException e){}
3. Java DB
Une fois la connexion établie, il est possible d'exécuter des ordres SQL. Les
objets qui peuvent être utilisés pour obtenir des informations sur la base de données sont :
Les requêtes d'interrogation SQL sont exécutées avec les méthodes d'un objet
Statement que l'on obtient à partir d'un objet Connection.
Exemple :
Exemple :
...
//insertion d'un enregistrement dans la table client
requete = "INSERT INTO client VALUES (3,'client 3','prenom
3')";
try {
Statement stmt = con.createStatement();
int nbMaj = stmt.executeUpdate(requete);
affiche("nb mise a jour = "+nbMaj);
} catch (SQLException e) {
e.printStackTrace();
}
...
Lorsque la méthode executeUpdate() est utilisée pour exécuter un traitement
de type DDL ( Data Defiition Langage : définition de données ) comme la création d'un table,
elle retourne 0. Si la méthode retourne 0, cela peut signifier deux choses : le traitement de
mise à jour n'a affecté aucun enregistrement ou le traitement concernait un traitement de
type DDL.
Si l'on utilise executeQuery() pour exécuter une requête SQL ne contenant pas
d'ordre SELECT, alors une exception de type SQLException est levée.
C'est une classe qui représente une abstraction d'une table qui se compose de
plusieurs enregistrements constitués de colonnes qui contiennent les données.
Exemple :
ResultSetMetaData rsmd;
rsmd = results.getMetaData();
nbCols = rsmd.getColumnCount();
Exemple :
import java.sql.*;
public class TestJDBC1 {
private static void affiche(String message) {
System.out.println(message);
}
private static void arret(String message) {
System.err.println(message);
System.exit(99);
}
public static void main(java.lang.String[] args) {
Connection con = null;
ResultSet résultats = null;
String requete = "";
// chargement du pilote
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
} catch (ClassNotFoundException e) {
arret("Impossible de charger le pilote jdbc:odbc");
}
//connection a la base de données
affiche("connection a la base de données");
try {
String DBurl = "jdbc:odbc:testDB";
con = DriverManager.getConnection(DBurl);
} catch (SQLException e) {
arret("Connection à la base de données impossible");
}
//insertion d'un enregistrement dans la table client
affiche("creation enregistrement");
requete = "INSERT INTO client VALUES (3,'client 3','client
4')";
try {
Statement stmt = con.createStatement();
int nbMaj = stmt.executeUpdate(requete);
affiche("nb mise a jour = "+nbMaj);
} catch (SQLException e) {
e.printStackTrace();
}
//creation et execution de la requete
affiche("creation et execution de la requête");
requete = "SELECT * FROM client";
Résultat:
catalog : le nom du catalogue dans lequel les tables doivent être recherchées. Pour
une base de données
JDBC−ODBC, il peut être mis à null.
schema : le schéma de la base dedonnées à inclure pour les bases les supportant. Il
est en principe mis à null
tablemask : un masque décrivant les noms des tables à retrouver. Pour les retrouver
toutes, il faut l'initialiser avec le caractère '%'
types[] : tableau de chaines décrivant le type de tables à retrouver. La valeur null
permet de retrouver toutes les tables.
Exemple :
con = DriverManager.getConnection(url);
dma =con.getMetaData();
String[] types = new String[1];
types[0] = "TABLES"; //set table type mask
results = dma.getTables(null, null, "%", types);
boolean more = results.next();
while (more) {
for (i = 1; i <= numCols; i++)
System.out.print(results.getString(i)+" ");
System.out.println();
more = results.next();
}
Exemple :
package com.jmd.test.dej;
import java.sql.*;
public class TestJDBC2 {
private static void affiche(String message) {
System.out.println(message);
}
private static void arret(String message) {
System.err.println(message);
System.exit(99);
}
public static void main(java.lang.String[] args) {
Connection con = null;
ResultSet resultats = null;
String requete = "";
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
} catch (ClassNotFoundException e) {
arret("Impossible de charger le pilote jdbc:odbc");
}
affiche("connection a la base de données");
try {
String DBurl = "jdbc:odbc:testDB";
con = DriverManager.getConnection(DBurl);
PreparedStatement recherchePersonne =
con.prepareStatement("SELECT * FROM personnes WHERE
nom_personne = ?");
recherchePersonne.setString(1, "nom3");
resultats = recherchePersonne.executeQuery();
affiche("parcours des données retournées");
boolean encore = resultats.next();
while (encore) {
System.out.print(resultats.getInt(1) + " :
"+resultats.getString(2)+" "+
resultats.getString(3)+"("+resultats.getDate(4)+")");
System.out.println();
encore = resultats.next();
}
resultats.close();
} catch (SQLException e) {
arret(e.getMessage());
}
affiche("fin du programme");
System.exit(0);
}
executeUpdate() : cette méthode permet d'exécuter une requête de type mise à jour
et renvoie un entier qui contient le nombre d'occurrences impactées par la mise à
jour.
Swing fait partie de la bibliothèque Java Foundation Classes (JFC). C'est une API dont le but
est similaire à celui de l'API AWT mais dont le mode de fonctionnement et d'utilisation est
complètement différent. Swing a été intégré au JDK depuis sa version 1.2. Cette bibliothèque
existe séparément pour le JDK 1.1.
Présentation de Swing
Les packages Swing
Un exemple de fenêtre autonome
Les composants Swing
Les boutons
Les composants de saisie de texte
Les onglets
Tous les éléments de Swing font partie d'un package qui a changé plusieurs
fois de nom : le nom du package dépend de la version du J.D.K. utilisée :
com.sun.java.swing : jusqu'à la version 1.1 beta 2 de Swing, de la version 1.1 des JFC
et de la version 1.2 beta 4 du J.D.K.
javax.swing : à partir des versions de Swing 1.1 beta 3 et J.D.K. 1.2 RC1
La procédure à suivre pour utiliser un composant Swing est identique à celle des composants
de la bibliothèque AWT :
Swing utilise la même infrastructure de classes que AWT, ce qui permet de mélanger
des composants Swing et AWT dans la même interface. Sun recommande toutefois
d'éviter de les mélanger car certains peuvent ne pas être restitués correctement.
Les composants Swing utilisent des modèles pour contenir leurs états ou leurs
données. Ces modèles sont des classes particulières qui possèdent toutes un
comportement par défaut.
La classe de base d'une application est la classe JFrame. Son rôle est
équivalent à la classe Frame de l'AWT et elle s'utilise de la même façon.
Exemple :
import javax.swing.*;
import java.awt.event.*;
public class swing1 extends JFrame {
public swing1() {
super("titre de l'application");
WindowListener l = new WindowAdapter() {
public void windowClosing(WindowEvent e){
System.exit(0);
}
};
addWindowListener(l);
setSize(200,100);
setVisible(true);
}
public static void main(String [] args){
JFrame frame = new swing1();
}
}
import javax.swing.*;
public class TestJFrame3 {
public static void main(String argv[]) {
JFrame f = new JFrame("ma fenetre");
f.setSize(300,100);
JButton b =new JButton("Mon bouton");
f.getContentPane().add(b);
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE)
;
f.setVisible(true);
}
}
V.1.4.1.2. La personnalisation de l'icône
La méthode setIconImage() permet de modifier l'icône de la JFrame.
Exemple :
import javax.swing.*;
public class TestJFrame4 {
public static void main(String argv[]) {
JFrame f = new JFrame("ma fenetre");
f.setSize(300,100);
JButton b =new JButton("Mon bouton");
f.getContentPane().add(b);
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE)
;
ImageIcon image = new ImageIcon("book.gif");
f.setIconImage(image.getImage());
f.setVisible(true);
}
}
Si l'image n'est pas trouvée, alors l'icône est vide. Si l'image est trop grande,
elle est redimensionnée.
V.1.4.1.3. Centrer une JFrame à l'écran
Le composant JLabel propose les mêmes fonctionnalités que les intitulés AWT
mais ils peuvent en plus contenir des icônes.
Cette classe possède plusieurs constructeurs :
Prof. Dr. Saint Jean DJUNGU Ass. MANZAMBI NDONGALA Nathan
Exemple:
import javax.swing.*;
import java.awt.*;
public class TestJLabel1 {
public static void main(String argv[]) {
JFrame f = new JFrame("ma fenetre");
f.setSize(100,200);
JPanel pannel = new JPanel();
JLabel jLabel1 =new JLabel("Mon texte dans JLabel");
pannel.add(jLabel1);
ImageIcon icone = new ImageIcon("book.gif");
JLabel jLabel2 =new JLabel(icone);
pannel.add(jLabel2);
JLabel jLabel3 =new
JLabel("Montexte",icone,SwingConstants.LEFT);
pannel.add(jLabel3);
f.getContentPane().add(pannel);
f.setVisible(true);
}
}
La classe JLabel définit plusieurs méthodes pour modifier l'apparence du
composant :
Par défaut, un JLabel est transparent : son fond n'est pas dessiné. Pour le
dessiner, il faut utiliser la méthode setOpaque() :
Exemple:
import javax.swing.*;
import java.awt.*;
public class TestJLabel2 {
public static void main(String argv[]) {
JFrame f = new JFrame("ma fenetre");
f.setSize(100,200);
JPanel pannel = new JPanel();
JLabel jLabel1 =new JLabel("Mon texte dans JLabel 1");
jLabel1.setBackground(Color.red);
pannel.add(jLabel1);
JLabel jLabel2 =new JLabel("Mon texte dans JLabel 2");
jLabel2.setBackground(Color.red);
jLabel2.setOpaque(true);
pannel.add(jLabel2);
f.getContentPane().add(pannel);
f.setVisible(true);
}
}
Dans l'exemple, les 2 JLabel ont le fond rouge demandé par la méthode
setBackground(). Seul le deuxième affiche un fond rouge car il est rendu opaque avec la
méthode setOpaque().
Il est possible d'associer un raccourci clavier au JLabel qui permet de donner le
focus à un autre composant. La méthode setDisplayedMnemonic() permet de définir le
raccourci clavier. Celui ci sera activé en utilisant la touche Alt avec le caractère fourni en
paramètre. La méthode setLabelFor() permet d'associer le composant fourni en paramètre
au raccourci.
Exemple:
import javax.swing.*;
import java.awt.*;
public class TestJLabel3 {
Prof. Dr. Saint Jean DJUNGU Ass. MANZAMBI NDONGALA Nathan
C'est une classe abstraite dont hérite les boutons Swing JButton, JMenuItem
et JToggleButton.
Cette classe définit de nombreuses méthodes dont les principales sont :
Tous les boutons peuvent afficher du texte et/ou une image. Il est possible de
préciser une image différente lors du passage de la souris sur le composant et lors de
l'enfoncement du bouton : dans ce cas, il faut créer trois images pour chacun des états
(normal, enfoncé et survolé). L'image normale est associée au bouton grâce au constructeur,
l'image enfoncée grâce à la méthode setPressedIcon() et l'image lors d'un survole grâce à la
méthode setRolloverIcon(). Il suffit enfin d'appeler la méthode setRolloverEnable() avec en
paramètre la valeur true.
Exemple:
import javax.swing.*;
import java.awt.event.*;
public class swing4 extends JFrame {
public swing4() {
super("titre de l'application");
import javax.swing.*;
import java.awt.event.*;
public class TestJButton3 {
public static void main(String argv[]) {
JFrame f = new JFrame("ma fenetre");
f.setSize(300,100);
JPanel pannel = new JPanel();
JButton bouton1 = new JButton("Bouton1");
bouton1.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
);
pannel.add(bouton1);
f.getContentPane().add(pannel);
f.setVisible(true);
}
}
Il ne gère pas d'état. Toutes les indications concernant le contenu du composant JLabel sont
valables pour le composant JButton.
import javax.swing.*;
import java.awt.*;
public class TestJButton2 {
public static void main(String argv[]) {
JFrame f = new JFrame("ma fenetre");
f.setSize(300,100);
JPanel pannel = new JPanel();
JButton bouton1 = new JButton("Bouton 1");
pannel.add(bouton1);
JButton bouton2 = new JButton("Bouton 2");
pannel.add(bouton2);
JButton bouton3 = new JButton("Bouton 3");
pannel.add(bouton3);
f.getContentPane().add(pannel);
f.getRootPane().setDefaultButton(bouton3);
f.setVisible(true);
}
}
Le bouton par défaut est activé par un appui sur la touche Entrée alors que le
bouton actif est activé par un appui sur la barre d'espace.
La méthode isDefaultButton() de JButton permet de savoir si le composant est
le bouton par défaut.
Cette classe définit un bouton à deux états : c'est la classe mère des
composants JCheckBox et JRadioButton.
La méthode setSelected() héritée de AbstractButton permet de mettre à jour
l'état du bouton. La méthode isSelected() permet de connaître cet état.
Exemple:
import javax.swing.*;
Prof. Dr. Saint Jean DJUNGU Ass. MANZAMBI NDONGALA Nathan
Un groupe de cases à cocher peut être défini avec la classe ButtonGroup. Dans
ce cas, un seul composant du groupe peut être sélectionné. Pour l'utiliser, il faut créer un
objet de la classe ButtonGroup et utiliser la méthode add() pour ajouter un composant au
groupe.
Exemple:
import javax.swing.*;
public class TestJCheckBox1 {
public static void main(String argv[]) {
JFrame f = new JFrame("ma fenetre");
f.setSize(300,100);
JPanel pannel = new JPanel();
Exemple :
import javax.swing.*;
public class TestJRadioButton1 {
public static void main(String argv[]) {
JFrame f = new JFrame("ma fenetre");
f.setSize(300,100);
JPanel pannel = new JPanel();
JRadioButton bouton1 = new JRadioButton("Bouton 1");
pannel.add(bouton1);
JRadioButton bouton2 = new JRadioButton("Bouton 2");
pannel.add(bouton2);
JRadioButton bouton3 = new JRadioButton("Bouton 3");
pannel.add(bouton3);
f.getContentPane().add(pannel);
f.setVisible(true);
}
}
Pour regrouper plusieurs boutons radio, il faut utiliser la classe
CheckboxGroup
Exemple:
import javax.swing.*;
public class JTextField1 {
La classe JPasswordField permet la saisie d'un texte dont tous les caractères saisis seront
affichés sous la forme d'un caractère particulier ('*' par défaut). Cette classe hérite de la
classe JTextField.
Exemple :
import java.awt.Dimension;
import javax.swing.*;
public class JPasswordField1 {
public static void main(String argv[]) {
JFrame f = new JFrame("ma fenetre");
f.setSize(300, 100);
JPanel pannel = new JPanel();
JPasswordField passwordField1 = new JPasswordField ("");
passwordField1.setPreferredSize(new Dimension(100,20 ));
pannel.add(passwordField1);
f.getContentPane().add(pannel);
f.setVisible(true);
}
}
Exemple:
import java.awt.Dimension;
import java.awt.event.*;
import javax.swing.*;
public class JPasswordField2 implements ActionListener {
JPasswordField passwordField1 = null;
public static void main(String argv[]) {
JPasswordField2 jpf2 = new JPasswordField2();
jpf2.init();
}
public void init() {
JFrame f = new JFrame("ma fenetre");
f.setSize(300, 100);
JPanel pannel = new JPanel();
passwordField1 = new JPasswordField("");
passwordField1.setPreferredSize(new Dimension(100, 20));
pannel.add(passwordField1);
JButton bouton1 = new JButton("Afficher");
bouton1.addActionListener(this);
pannel.add(bouton1);
f.getContentPane().add(pannel);
f.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
System.out.println("texte saisie = " +
String.copyValueOf(passwordField1.getPassword()));
}
}
Les méthodes copy() et cut() sont redéfinies pour empêcher l'envoi du
contenu dans le composant et émettre simplement un beep.
import java.net.URL;
import javax.swing.*;
import javax.swing.event.*;
public class JEditorPane1 {
public static void main(String[] args) {
final JEditorPane editeur;
JPanel pannel = new JPanel();
try {
editeur = new JEditorPane(new URL("http://google.fr"));
editeur.setEditable(false);
editeur.addHyperlinkListener(new HyperlinkListener() {
public void hyperlinkUpdate(HyperlinkEvent e) {
if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED)
{
URL url = e.getURL();
if (url == null)
return;
try {
editeur.setPage(e.getURL());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
});
pannel.add(editeur);
} catch (Exception e1) {
e1.printStackTrace();
}
JFrame f = new JFrame("ma fenetre");
f.setSize(500, 300);
f.getContentPane().add(pannel);
f.setVisible(true);
}
}
JTexteArea propose plusieurs méthodes pour ajouter du texte dans son modèle :
Soit utiliser la méthode insert() permet d'insérer un texte à une position données en
caractères dans dans le texte du composant
Exemple:
import javax.swing.*;
public class JTextArea1 {
public static void main(String argv[]) {
JFrame f = new JFrame("ma fenetre");
f.setSize(300, 100);
JPanel pannel = new JPanel();
JTextArea textArea1 = new JTextArea ("mon texte");
pannel.add(textArea1);
f.getContentPane().add(pannel);
f.setVisible(true);
}
}
Exemple :
import java.awt.Dimension;
import javax.swing.*;
public class JTextArea1 {
public static void main(String argv[]) {
JFrame f = new JFrame("ma fenetre");
f.setSize(300, 100);
JPanel pannel = new JPanel();
JTextArea textArea1 = new JTextArea ("mon texte");
JScrollPane scrollPane = new JScrollPane(textArea1);
scrollPane.setPreferredSize(new Dimension(200,70));
pannel.add(scrollPane);
f.getContentPane().add(pannel);
f.setVisible(true);
Prof. Dr. Saint Jean DJUNGU Ass. MANZAMBI NDONGALA Nathan
Exemple:
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class TestJTabbedPane1 {
public static void main(String[] args) {
JFrame f = new JFrame("Test JTabbedPane");
f.setSize(320, 150);
JPanel pannel = new JPanel();
JTabbedPane onglets = new JTabbedPane(SwingConstants.TOP);
JPanel onglet1 = new JPanel();
JLabel titreOnglet1 = new JLabel("Onglet 1");
onglet1.add(titreOnglet1);
onglet1.setPreferredSize(new Dimension(300, 80));
onglets.addTab("onglet1", onglet1);
JPanel onglet2 = new JPanel();
JLabel titreOnglet2 = new JLabel("Onglet 2");
onglet2.add(titreOnglet2);
onglets.addTab("onglet2", onglet2);
onglets.setOpaque(true);
pannel.add(onglets);
f.getContentPane().add(pannel);
f.setVisible(true);
}
A partir du JDK 1.4, il est possible d'ajouter un raccourci clavier sur chacun des
onglets en utilisant la méthode setMnemonicAt(). Cette méthode attend deux paramètres :
l'index de l'onglet concerné (le premier commence à 0) et la touche du clavier associée sous
la forme d'une constance KeyEvent.VK_xxx. Pour utiliser ce raccourci, il suffit d'utiliser la
touche désignée en paramètre de la méthode avec la touche Alt.
V.2. Reporting
V.2.1. Introduction
Cependant des outils issus du libre existent et sont très puissants en terme de
fonctionnalités :
On choisit une source de données puis, on clique sur Next>. Pour notre cas la
source de données est DataBase JDBC Connection.
Suivant>
Compiler
Pour utiliser notre rapport compilé sur iReport, nous devons au préalable
configurer l’environnement de travail en ajoutant les librairies dans la CLASSPATH de
l’application.
Exemple :
// - Execution du rapport
JasperPrint jasperPrint =
JasperFillManager.fillReport(jasperReport, parameters,
connection);
(Version future)
(Version future)
2. Analyse de l’existent
A la date d’aujourd’hui (2008), le dernier des recteurs est le Professeur KIKA, nommé
par l’actuel Président de la République Démocratique du Congo Joseph KABILA
Kabange, par un décret portant nomination des recteurs des établissements publics
d’enseignement supérieur et universitaire.
Il faut signaler que de ces différents recteurs qui ont défilé à la tête de l’Université de
Kinshasa, le Professeur Nestor MPEYE NYANGO est revenu deux fois au pouvoir : de
1983 à 1986, et de 2000 à 2001.
Une année après, soit en 1955, trois autres chambres furent ajoutées et le sous-sol
de la faculté des Sciences a servi, en 1956, de cache ou magasin. Tandis que le
bâtiment Administratif, érige en 1957, réservera une partie du rez-de-chaussée a la
bibliothèque dont l’occupation effective interviendra trois ans après, soit en 1960
pendant les grandes vacances.
Situation géographique
Objectif global
Dans son aspect de la recherche, elle utilise deux principaux moyens, celui des
expériences et la documentation. C’est bien à ce niveau que nous trouvons la raison
fondée d’une bibliothèque à l’Université.
Principales activités
Elle utilise 3 moyens pour l’obtention de ses ouvrages : l’achat, les dons et les
échanges avec d’autres bibliothèques.
Certains ouvrages peuvent développer un ou plusieurs contenus. Apres avoir été fixe
sur le contenu, on fait appel à la table de classification de DEWEY, qui permettra
d’attribuer un indice a l’ouvrage.
Nous prendrons le cas des ouvrages ordinaires, qui est le plus fréquent, on note sur la
première ligne la clé d’entrée (généralement le nom de l’auteur) en Majuscule, suivi
d’un point-virgule, son prénom dont la première lettre est inscrit en majuscule et le
reste en minuscule.
Sur une ligne supplémentaire, on indique les différentes autres vedettes en suivant
leur hiérarchie
Dans cette bibliothèque, suite aux abus très courant des abonnes, on a opté pour la
politique des prêts internes c’est-à-dire que les abonnes n’ont droit d’utiliser les
ouvrages que dans la salle de lecture de la bibliothèque et nulle part ailleurs.
Il existe un registre dans ce département ou l’on note les informations sur tous les
abonnes qui empruntent les ouvrages. On y signale : son nom, sa promotion, la cote
du livre, le titre et le nom de l’auteur.
Acquisition
Catalogage
Référencement et circulation
Conservation et prêt
Magasinage
Légende
Ouvr : Ouvrages
T1 : Estampillage et enregistrement dans la registre
Ouvr1 : Ouvrages estampilles et enregistres
T2 : Indexation
Ouvr2 : Ouvrages ayant subi l’indexation
Cote
T3 : Etablissement de la fiche de catalogage de base
FCB : Fiche de catalogage de base
T4 : Duplication des fiches de catalogage de base
FCC : Fiche de catalogage cote
FCM : Fiche de catalogage matières
FCA : Fiche de catalogage Auteurs
Pour pallier à ces problèmes, nous pensons qu’il est fort nécessaire d’informatiser
quelques servies de la bibliothèque ; ainsi elle gagnera en temps, en qualité de
travail, en communication en son sein, en sécurité et au-delà de tout ceci en
rentabilité financière, car nous savons tous qu’une bibliothèque plus moderne attire
un grand nombre de client.
Et pour certains département tels que celui de conservation et prêt et celui des
périodiques nous proposons d’y installer des ordinateurs important à leur
rendement.
Le nouveau système que nous implémenterons constitue notre solution à court terme, et on
aura besoin des spécifités techniques suivantes :
Du point de vue économique, les outils utilisés sont tous issus du monde libre sauf le
Microsoft Windows Server 20003. La bibliothèque payera donc :
4. Modélisation
Les domaines sont : "prêter les livres aux lecteurs" (assurer la rotation des livres
prêtés, récupérer les livres prêtés), "enrichir la bibliothèque" (conseiller le choix de
lecture, commander les nouveautés) et "maintenir les livres en état" (faire relier les
Les messages entre domaines ne sont pas représentés. Ils pourraient être la
demande d'état de livre entre "prêter" et "maintenir", la demande de livre non
connu...
Déduction du MCD
Conseiller lecteur : opération rajoutée pour montrer qu'une procédure peut être
multi-domaines.
Prise en compte de la demande d'abonnement : ici la procédure est détaillée
dans le cas où le lecteur n'a pas son adresse ou une justification de son identité
et de son adresse (utile pour la relance des livres non restitués).
Abonner lecteur : identique au conceptuel.
Prise en compte de la demande de prêt : la différence est que le magasinier va
chercher le livre en magasin.
Chercher livre : opération typiquement organisée. Le magasinier peut ne pas
trouver le livre s'il est tombé de l'armoire ou s'il est mal rangé. Pour éviter que
Les individus sont les mêmes que le MCD. Au lieu de créer un individu
supplémentaire tel que "inventaire", une information supplémentaire est dans l'individu
Au niveau de MLT, on présente les différents états que l’application est censée
de produire.
Exercice 1
Chaque question est identifiée par un intitulé et est caractérisée par une réponse, un
niveau de difficulté et un thème. Une même question peut apparaître dans plusieurs
séries avec un numéro d'ordre pour chaque série ; par exemple une même question
peut apparaître comme question N±2 dans la série 5 du CD-ROM 15 et comme
question N±12 dans la série 3 du CD-ROM 4. Une même série peut être projetée
plusieurs fois à des séances différentes. Lorsqu'un élève assiste à une séance, il
obtient le nombre de fautes (une note sur 40) qu'il a fait pour la série passée pendant
la séance.
La base de données doit permettre de répondre à des requêtes telles que "Quel est le
nombre moyen de fautes pour la série 5 du CD-ROM 14?", "Quels élèves peuvent se
présenter au prochain examen du code de la route ?", "Quels élèves ont échoué au
moins une fois à l'examen ?" etc.
Vous préciserez les clés primaires des relations en les soulignant ainsi que les clés
étrangères en les signalant par un # et en précisant à quoi elles font référence.
Dans votre schéma relationnel, chaque relation doit être spécifiée de la manière
suivante :
Nom(att1,...,attn) où Nom est le nom de la relation et att1, ..., attn sont des noms
d'attributs.
Le nom de la relation doit obligatoirement avoir un lien avec les noms des ensembles
d'entités (classes) ou des associations du schéma de modélisation de la question 1.
Vous donnerez des explications claires et concises du passage au relationnel. Vous
préciserez notamment pourquoi et comment vous créez ou modifiez certaines
relations (1 ligne maximum par relation).
Exercice 2
On souhaite construire une base de données gérant des revues et les articles de ces revues. Une
revue est caractérisée par un nom et une périodicité. Chaque revue parait sous la forme de numéros,
chaque numéro étant identifié par un nombre relatif à la revue et à l'année en cours (ex. le numéro
N°12 de Linux Magazine en 2003 est différent du numéro N°12 de Linux Magazine en 2004). Un
numéro est également caractérisé par un nombre de pages. Chaque numéro contient des articles
écrits par un ou plusieurs auteurs. Un auteur est caractérisé par un nom, un prénom, ainsi qu'un
email. Chaque article possède un titre et un contenu. Un même article peut apparaître dans plusieurs
numéros d'une même revue ou de différentes revues. Lorsqu'un article apparaît dans un numéro
d'une revue, il a une page de début et une page de n. Un article peut faire référence à d'autres
articles, en précisant le numéro et la revue dans lesquels l'article référencé a été publié.
ci-avant sont sémantiquement clairs. Néanmoins, quels points nécessitent d'être précisés.
• L'ensemble d'entités Numéro est un ensemble d'entités faibles de Revue au format Merise. En
effet, ce choix de modélisation a été fait pour représenter le fait que l'identificateur d'un numéro est
relatif à la revue à laquelle le numéro appartient. Un numéro d'une revue donnée étant identifié par
un nombre et une année, ces deux attributs (ID et Année) sont soulignés.
• Les cardinalités de l'association entre les ensembles d'entités Numéro et Article sont 1:N-1:M, car
un article peut apparaître dans plusieurs numéros et un numéro contient plusieurs articles. Le
principe est le même pour les cardinalités de l'association entre Auteur et Article.
• Les attributs PageDébut et PageFin caractérisent l'association entre Article et Numéro (un numéro
étant relatif à une revue, il est inutile de faire une association avec Revue). En effet, la page de début
et la page de n peuvent varier, pour un même article, lorsqu'il paraît dans plusieurs numéros
différents.
• Un article peut faire référence à un autre article. Le numéro et la revue dans lesquels l'article
référencé apparaît doivent être précisés dans l'article référençant. Par exemple, l'article intitulé
"Correction d'exercices en bases de données" peut faire référence à l'article "Concepts généraux en
BD relationnelle" du numéro 12 de l'année 2004 de la revue "Informatique magazine".
A cet effet, les ensembles d'entités Numéro et Article ont été regroupés au sein d'un agrégat au
format Merise. Cet agrégat (ou cette classe association) représente l'article référencé, c'est-à-dire
Prof. Dr. Saint Jean DJUNGU Ass. MANZAMBI NDONGALA Nathan
Vous préciserez les clés primaires des relations en les soulignant ainsi que les clés étrangères en les
signalant par un # et en précisant à quoi elles font référence.
Dans votre schéma relationnel, chaque relation doit être spécifiée de la manière suivante :
RNom(att1,...,attn) où RNom est le nom de la relation et att1, ..., attn sont des noms d'attributs.
Le nom de la relation doit obligatoirement avoir un lien avec les noms des ensembles d'entités ou
des associations du schéma de modélisation de la question 1.
Vous donnerez des explications claires et concises du passage au relationnel. Vous préciserez
notamment pourquoi et comment vous créez ou modifiez certaines relations (1 ligne maximum par
relation).
Exercice 3
On suppose qu'une bibliothèque gère une base de données dont le schéma est le
suivant (les clés primaires des relations sont soulignées) :
Exprimer, lorsque cela est possible, les requêtes suivantes en algèbre relationnelle,
en calcul à variable nuplet et en SQL.
1. Quelles sont les personnes ayant emprunté le livre "Recueil Examens BD" ?
2. Quelles sont les personnes n'ayant jamais rendu de livre en retard ?
3. Quelles sont les personnes ayant emprunté tous les livres (empruntés au moins
une fois) ?
4. Quels sont les livres ayant été empruntés par tout le monde (i.e. tous les
emprunteurs) ?
5. Quelles sont les personnes ayant toujours rendu en retard les livres qu'elles ont
empruntés ?
Exercice 4
Les attributs soulignés sont les attributs appartenant à la clé primaire. Ils sont de type entier.
L'attribut Salle_ID de la relation Spectacle est une clé étrangère qui fait référence à l'attribut de
même nom de la relation Salle. L'attribut Spectacle_ID de la relation Concert est une clé étrangère
qui fait référence à l'attribut de même nom de la relation Spectacle. L'attribut Concert_ID de la
relation Billet est une clé étrangère qui fait référence à l'attribut de même nom de la relation
Concert.
L'attribut Billet_ID de la relation Vente est une clé étrangère qui fait référence à l'attribut de même
nom de la relation Billet.
2.2. Quels sont les noms des salles ayant la plus grande capacité ?
2.3. Quels sont les chanteurs n'ayant jamais réalisé de concert à la Cygale ?
2.4. Quels sont les chanteurs ayant réalisé au moins un concert dans toutes les salles ?
2.5. Quels sont les dates et les identificateurs des concerts pour lesquels il ne reste aucun billet
invendu ?
Exercice 5
Exercice 6
3.1. Exprimer, à l'aide de dépendances fonctionnelles, les contraintes suivantes que doivent
vérifier les instances de la relation R :
(a) "On peut déduire le nom et le prénom d'un utilisateur à partir de son identificateur."
(b) "Un utilisateur (identifié par son identificateur) possède un seul login et un seul password par
serveur de mails."
[3] F. Chabli, Exemple d'utilisation de l'API JFreeChart avec JasperReports, 26 mai 2009