cours3 - site perso de création de sites web.
Download
Report
Transcript cours3 - site perso de création de sites web.
Java : Aspects Avancés
• La programmation Réseau
Communication par sockets
Les classes de java.net.* permettent très
facilement de se connecter à une machine
afin d’y établir des flux d’entrées/sorties.
En java, la socket est équivalente à un
gestionnaire d’entrée/sortie entre deux
machines.
Protocoles de communication
Il existe deux protocoles utilisant les
sockets en Java :
TCP : Stream Socket
Communication en mode connectéS
Les applications sont averties lors de la
déconnexion
UDP : Datagram Socket
Communication en mode non connectéS
Plus rapide mais moins fiable que TCP
Protocole TCP
Le serveur :
Le client :
Crée une socket
Attend une
connection
demande une
connection
accepte la demande
création de socket
échange de données
échange de données
ServerSocket
Définit une socket sur le serveur.
Pour créer une ServerSocket, il faut lui
donner un numéro de port.
Une fois crée, la socket Serveur attend
une connection par la méthode accept().
Ex :
ServerSocket s = new ServerSocket (8888)
Socket socket = s.accept();
// attente d ’une connection
La Socket du client
Se connecter sur une socket d ’un serveur,
implique de connaître son adresse.
InetAddress permet de récupérer une
adresse à partir d ’un nom.
La liaison d ’une socket à la socket serveur
peut alors être demandée
Ex :
InetAddress addr = InetAddress.getByName("crabe");
Socket socket = new Socket(addr, Serveur_1.PORT);
Communication inter-socket
Les communication entre socket
s ’effectue ‘ classiquement ’,
par les flux d ’entrées, issus de la
méthode getInputStream
par les flux de sorties, issus de la
méthode getOutputStream.
Communication inter-socket
Exemple
ServerSocket s = new ServerSocket(8888);
System.out.println("Socket lancee : " + s);
try
{
Socket socket = s.accept(); // Attendre une connection
try
{
System.out.println( "Connection acceptee: "+ socket);
InputStream socket_in = new InputStream(
socket.getInputStream());
DataInputStreaam in = new DataInputStreaam(socket_in);
String str = in.readLine();
}
}
Protocole UDP
Emission de paquets de données, rapide mais peu
fiable
Définir un paquet à envoyer ou à recevoir par la
classe DatagramPacket
Définir une socket par la classe DatagramSocket
Emission de paquets
import java.net.*;
public class UDPClient
{
public static void main(String arg[])
{
try
{
String chaine = "un message";
byte[] data = chaine.getBytes();
InetAddress addr = InetAddress.getByName(null);
DatagramPacket packet = new DatagramPacket(data, data.length, addr, 1234);
DatagramSocket ds = new DatagramSocket();
ds.send(packet);
ds.close();
}
catch(Exception e){}
}
}
Reception de paquets
import java.net.*;
public class UDPServeur
{
public static void main(String arg[])
{
try
{
// Serveur
DatagramSocket ds = new DatagramSocket(1234);
while(true)
{
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
ds.receive(packet);
System.out.println("Message: " + packet.getData());
}
}
}
}
catch(Exception e){}
Une classe réseau : URL
URL permet de créer des liens vers des
pages internets :
Exemple :
URL url = new URL("http://www.univ-valenciennes.fr/index.html");
DataInputStream dis = new DataInputStream(url.openStream());
String line;
while ((line = dis.readLine()) != null)
System.out.println(line);
Exercice
Un exemple classique de programmation
réseau : le client-serveur.
Un serveur est lancé sur une machine et
attend la connexion d’un client. Puis, il
récupère les lignes envoyées par le client,
les affiche et les lui renvoie.
Java : Aspects Avancés
• Les Threads
Qu’est-ce qu’un thread?
Un thread est un processus qui hérite de son
processus père.
Java permet la mise ne commun de code, de
données (« light weight process » ou « processus
léger »)
Le processus partage ses ressources système
(entrées/sorties, ...).
La programmation est enfin sans contrainte !
Utilité des processus
Afin de « rendre la main » au programme
principal.
Afin d ’interagir efficacement.
Pour la gestion des graphiques, des
applets.
Définition d’un Thread
Pour créer une tâche, il suffit de faire hériter sa
classe de la classe Thread.
La principale méthode de Thread est run() qui doit
être surchargée. C’est la méthode qui sera
exécutée simultanément par les autres tâches du
programme.
La méthode yield() oblige la tâche à se reposer,
pour laisser aux tâches la possibilité de s’exécuter
La classe Thread implémente l’interface Runnable.
Implémenter Runnable oblige à définir la méthode
run().
Exemple de thread (1/2)
class une_tache extends Thread
{
une_tache(String nom)
{ super(nom); } // appel au constructeur de Thread
public void run()
{
while (true)
{
System.out.println("Mon nom est : " + getName());
Thread.yield(); // petite pause
}
}
}
Exemple de thread (2/2)
class Exemple_tache_1
{
public static void main(String args[])
{
une_tache tache1 = new une_tache("tache 1");
une_tache tache2 = new une_tache("tache 2");
tache1.start();
tache2.start();
while (true)
{
System.out.println("Je suis la tâche principale");
Thread.yield();
}
}
}
Run et Start
La méthode run() est généralement
placée dans une boucle infinie
La méthode start(),
est utilisée pour lancer le Thread
et appelle la méthode run()
Accès simultanés à une ressource
La programmation multitâche implique le partage de
ressources (mémoire, objets). Dans certains cas, ceci peut
être problématique.
Pour cela, Java dispose du mot clé synchronized qui
assure l’exclusion mutuelle d’une section critique en
informant le moniteur (gestionnaire de mémoire).
exemple: public synchronised void compte() {…}
empèche toute instance de la classe de lancer compte tant
qu’elle ne s’est pas terminée.
Lorsqu'un thread t1 exécute cette méthode à partir d ’un
objet, un autre thread t2 ne peut pas l'exécuter à partir
du même objet. Mais t2 peut l ’exécuter pour une autre
instance de la même classe.
Synchronisation et efficacité
Chaque objet possède un verrou lock ou moniteur.
(Cela fait partie de la classe Object).
Exemple de verrou :
...
synchronized (compteur) {compteur.add() ; compteur.mult() ; ...}
...
Lorsqu'une méthode synchronisée d'un objet est
appelée, le verrou est mis, aucune autre méthode
synchronisée de cet objet peut être exécutée.
Acquérir le verrou d'un objet est forcément
coûteux. Il faut donc savoir gérer et diminuer au
maximum les sections critiques.
Le processus dans tous ses états
Nouveau : il est créé mais start() n ’est pas
encore appelé
Exécutable : il a été initialisé (il est exécuté si
l ’ordonnanceur le décide)
Mort : fin normale d ’un Thead (sortie de la
méthode run()
Bloqué : l ’ordonnanceur ignore le Tread
Raison d ’un blocage
Le thread peut être :
endormi : sleep(milliseconds)
suspendu : par suspend(). Il sera alors
relancé par resume()
en attente : par wait(). Il pourra alors être
réactivé par notify() ou notifyAll()
IO : en attente d ’une Entrée/Sortie
synch : en attente de la libération d ’une
ressource synchronisée
Différence Wait/Suspend
Suspend :
Tient le verrou de l ’objet,
donc bloque dons les méthode synchronisées
et peut être source de DeadLock
Wait
ne tient pas les verrous
et donc ne doit pas être appelé d ’un bloc
synchronisé, sous risque d ’accès concurrent
Maintien en cohérence...
Il faut éviter l ’utilisation de :
stop : cette méthode libère les verrous même
si l ’objet est dans un état instable
Il faut le remplacer par un test dans la boucle du
run()
lever l ’exception InterrupedException en utilisant
la méthode interrupt()
suspend (et donc resume), car ils sont
sources de nombreux deadlock
Exercice
Un exemple classique de programmation de
processus : le producteur-consommateur.
Un producteur produit des objets dans
une pile, 2 consommateurs en consomment.
Ecrire les classes Tab_objets,
Producteur et Consommateur, ainsi que la
classe principale.
Java : Aspects Avancés
• Les applets
Une Applet...
Second type de programmation Java, le plus
connu car le plus visible
Ne peut être exécutée que depuis un
Navigateur
Le Navigateur doit contenir en interne
une machine virtuelle
sa propre méthode main
Les méthodes d ’une applet
Une applet est un objet graphique (descendant de panel),
aussi contient elle des méthodes graphiques.
Les principales méthodes d ’une applet sont :
init(), que le navigateur appelle après chaque chargement de
l’applet.,
start(), lancée après l’initialisation,
stop(), arrête l’applet lorsqu’elle n’est plus visible,
destroy(), appelé à l’arrêt du navigateur, ou au rechargement de
l’applet,
paint(Graphics g) est appelé chaque fois que l’applet est
réaffichée.
Exemple d ’applet
import java.awt.*;
import java.applet.*;
public class Applet1 extends Applet
{
Font font;
public void init()
{
font = new Font("TimesRoman", Font.PLAIN,20);
}
public void paint(Graphics g)
{
g.setFont(font);
g.setColor(Color.red);
g.drawString("Salut tout le monde!", 0, font.getSize());
g.draw3DRect(0, 0, 180, 30, true);
}
}
Insertion dans une page Web
L ’insertion est possible par le tag
APPLET
:
<HTML>
<HEAD>
<TITLE>Exemple d'applet</TITLE>
<BODY>
<H1>Un exemple dapplet</H1>
<applet code="Applet1.class" width=200 height=50>
desole ... ce navigateur ne supporte pas les applets
</applet>
</BODY>
</HEAD>
</HTML>
Passage de paramètres
dans une page Web
La méthode getParameter("msg") retourne
la valeur du paramètre indiqué dans la page web.
Pour passer les paramètres, il faut appeler
l’applet dans la page web comme ceci :
<Applet code="Applet1.class" width=300 height=200>
<param name=msg value="voici le message">
</Applet>
Archiver les classes
Lorsqu ’une applet utilise une autre classe située
dans le même répertoire, elle charge cette
classe, ce qui cause un ralentissement.
Pour éviter les multiples chargement il faut
compresser les classes avec jar
L’appel à partir d’une page web se fera sous la
forme :
<Applet code="Applet1.class" archive= "nom_archive.jar"
width=300 height=200>
<param name=msg value="voici le message">
</Applet>
Applet permanente
Toutes les applets utilisent la même machine
virtuelle. Si l’on souhaite créer une applet à
activité permanente (défilement de texte,
d’images, ...), il faut la créer en tant que
processus afin de ne pas bloquer les autres
applets.
Pour cela, il faut que l’applet implémente
l’interface Runnable (similaire à Thread, mais qui
permet de réécrire la fonction stop())
Exercice
Ecrire une applet qui affiche un texte
déroulant dans la barre d ’état du
navigateur.
On utilisera la fonction showStatus de
l ’applet.
La fréquence de défilement est passée en
paramètre
Java : Aspects Avancés
• AWT : Abstract Window Toolkit
Sylvain LECOMTE & Vincent POIRRIEZ
Généralités sur AWT
AWT comporte :
des éléments graphiques
des conteneurs
Un mécanisme de gestion d'événements, ...
AWT a beaucoup évolué entre 1.0.2 et 1.1.1 :
nouveau modèle événementiel
gestion de l'impression
gestion de l'échange de données
AWT a encore évolué avec Java Foundation Class
et java.2D
Sylvain LECOMTE & Vincent POIRRIEZ
Les objets graphiques de AWT
Les éléments graphiques
Button
Canvas (zone de dessin)
Checkbox
Choice
Label
List
MenuBar
MenuItem
TextArea
TextField
Sylvain LECOMTE & Vincent POIRRIEZ
Les conteneurs de AWT
Les conteneurs sont les couches sur
lesquels seront dessinés les objets :
Frame
Dialog
Window
Panel (conteneur de base)
Les Gestionnaires de mise en page
permettent de placer automatiquement
les objets.
Sylvain LECOMTE & Vincent POIRRIEZ
FlowLayout
java.awt.FlowLayout : de gauche à droite,
de haut en bas
one
two
three
Sylvain LECOMTE & Vincent POIRRIEZ
BorderLayout
java.awt.BorderLayout découpe la zone en
Nord, Sud, Est, Ouest et Centre
North
West
Center
South
East
Sylvain LECOMTE & Vincent POIRRIEZ
GridLayout
java.awt.GridLayout découpe la zone en
une grille dont on peut choisir les
dimensions
one
two
three
four
five
six
Sylvain LECOMTE & Vincent POIRRIEZ
Avantage de AWT
Il permet de créer une interface
graphique d ’exécutant sous toutes les
interfaces (Windows, Xwindows, …)
il simplifie la tâche du concepteur de
l ’IHM (presque tous les objets sont
présents)...
Sylvain LECOMTE & Vincent POIRRIEZ
Evenements
Chaque objet graphique (ou presque) possède sa
propre gestion dévénements,
Java propose des interfaces d ’écoute (Window,
Mouse, ...)Listener
Pour les plux complexes, il existe des classes
dont les méthodes ne font rien !
(Window, Mouse, ...)Adapter
Avantage, si une classe hérite d ’une de ces classes,
elle n ’a qu ’à surcharger la méthode désirée
Sylvain LECOMTE & Vincent POIRRIEZ
Exemple d ’interface AWT
Sylvain LECOMTE & Vincent POIRRIEZ
Exemple d ’interface AWT (2)
MenuBar
Label
TextField
Choice
List
tfPanel
chPanel
lstPanel
cbPanel
Checkbox
rbPanel
btPanel
Button
Sylvain LECOMTE & Vincent POIRRIEZ
Exemple de label
// Text Field Panel
Panel tfPanel = new Panel(new FlowLayout(FlowLayout.LEFT));
label = new Label("TextField");
tfdPanel.add(label);
textField = new TextField(15);
tfPanel.add(textField);
Sylvain LECOMTE & Vincent POIRRIEZ
Exemple de choix
// Choice Panel
Panel chPanel = new Panel(new FlowLayout(FlowLayout.LEFT));
label = new Label("Choice");
chPanel.add(label);
choice = new Choice();
choice.addItem("Solaris");
choice.addItem("Linux");
choice.addItem("Aix");
chPanel.add(choice);
Sylvain LECOMTE & Vincent POIRRIEZ
Exemple de liste
// List Panel
Panel listPanel = new Panel(new FlowLayout(FlowLayout.LEFT));
label = new Label("List");
listPanel.add(label);
list = new List();
list.addItem("Solaris");
list.addItem("Linux");
list.addItem("Aix");
listPanel.add(list);
Sylvain LECOMTE & Vincent POIRRIEZ
Exemple de cases
// Checkbox Panel
Panel cbPanel = new Panel(new FlowLayout(FlowLayout.LEFT));
cbSolaris = new Checkbox("Solaris");
cbPanel.add(cbSolaris);
cbLinux = new Checkbox("Linux");
cbPanel.add(cbLinux);
cbAix = new Checkbox("Aix");
cbPanel.add(cbAix);
Sylvain LECOMTE & Vincent POIRRIEZ
Exemple de bouton radio
// RadioButton Panel
Panel rbPanel = new Panel(new FlowLayout(FlowLayout.LEFT));
rbGroup = new CheckboxGroup();
rbSolaris = new Checkbox("Solaris");
rbSolaris.setCheckboxGroup(rbGroup);
rbPanel.add(rbSolaris);
rbLinux = new Checkbox("Linux");
rbLinux.setCheckboxGroup(rbGroup);
rbPanel.add(rbLinux);
rbAix = new Checkbox("Aix");
rbAix.setCheckboxGroup(rbGroup);
rbPanel.add(rbAix);
rbGroup.setSelectedCheckbox(rbSolaris);
Evenement sur choix, boutons
radios, cases et listes
Sylvain LECOMTE & Vincent POIRRIEZ
ItemListener est l’interface permettant
de gérer les événements sur les objets de
type Choice, List et CheckBox
Elle contient la méthode
itemStateChanged(ItemEvent e)
déclenchée lors de sélection/déselection d’un
item.
Sylvain LECOMTE & Vincent POIRRIEZ
Exemple de bouton
// Button Panel
Panel btPanel = new Panel(new FlowLayout(FlowLayout.LEFT));
okButton = new Button("Ok");
okButton.addActionListener(new OkButtonListener());
btPanel.add(okButton);
cancelButton = new Button("Cancel");
cancelButton.addActionListener(new CancelButtonListener());
btPanel.add(cancelButton);
Sylvain LECOMTE & Vincent POIRRIEZ
Exemple de menu
// Menu Bar
Menu procMenu = new Menu("Procedural");
procMenu.add(new MenuItem("Pascal"));
...
Menu ooMenu = new Menu("Object Oriented");
ooMenu.add(new MenuItem("SmallTalk"));
...
Menu funcMenu = new Menu("Functional");
funcMenu.add(new MenuItem("Lisp"));
...
Menu languageMenu = new Menu("Languages");
languageMenu.add(procMenu);
...
MenuBar mb = new MenuBar();
mb.add(languageMenu);
Sylvain LECOMTE & Vincent POIRRIEZ
Exemple de construction
public class FrameExample extends Frame {
public FrameExample(String title) {
super(title);
...
setMenuBar(mb);
setLayout(new GridLayout(0, 1, 2, 2));
add(textFieldPanel);
add(choicePanel);
add(listPanel);
add(checkboxPanel);
add(radioButtonPanel);
add(buttonPanel);
pack();
show();}
Exemple de gestion d’événement sur
bouton
Sylvain LECOMTE & Vincent POIRRIEZ
Gestion des événements : clic sur le bouton Ok
okButton.addActionListener(new OkButtonListener());
public class OkButtonListener implements ActionListener {
public void actionPerformed(ActionEvent evt) {
System.out.println("textField = " + textField.getText());
System.out.println("choice = "
+ choice.getSelectedItem());
System.out.println("list = "
+ list.getSelectedItem());
System.out.println("cbSolaris="
+ (cbSolaris.getState() ?"Yes"
System.out.println("cbLinux="
+ (cbLinux.getState()
?"Yes"
System.out.println("cbWindow="
+ (cbAix.getState()
?"Yes"
System.out.println("rbSolaris="
+ (rbSolaris.getState() ?"Yes"
System.out.println("rbLinux="
+ (rbLinux.getState()
?"Yes"
System.out.println("rbWindow="
+ (rbAix.getState()
?"Yes"
}
}
:
:
:
:
:
:
"No"));
"No"));
"No"));
"No"));
"No"));
"No"));
Exemple de gestion d’événement sur
menu
Sylvain LECOMTE & Vincent POIRRIEZ
Gestion des événements : sélection d'items du
menu
MenuItem mi = new MenuItem("Pascal");
mi.addActionListener(new LanguageMenuListener());
public class LanguageMenuListener implements ActionListener
{
public void actionPerformed(ActionEvent evt)
{ System.out.println("Menu: " + evt.getActionCommand()};
}
}
Exemple de gestion d’événement sur
fenêtre
Sylvain LECOMTE & Vincent POIRRIEZ
Gestion des événements : fermeture de la fenêtre
addWindowListener(new MyWindowListener());
public class MyWindowListener extends WindowAdapter
{
public void windowClosing(WindowEvent evt)
{
System.out.println("Window closing");
System.exit(0);
}
}
Evenement sur champs de texte et
zone de texte
Sylvain LECOMTE & Vincent POIRRIEZ
L’interface TextListener permet de gérer
les événements sur les objets de type
TextField et TextAera,
Elle contient la méthode
textValueChanged(TextEvent e)
déclenchée lors de modification du texte
Sylvain LECOMTE & Vincent POIRRIEZ
Autres gestions d ’événements (souris)
On trouve aussi l’interface MouseListener qui définit les
méthodes
void mouseClicked(MouseEvent e) clic sur l’objet
void mouseEntered(MouseEvent e) passage sur l’objet
void mouseExited(MouseEvent e) sortie de l’objet
void mousePressed(MouseEvent e) pression sur l’objet
void mouseReleased(MouseEvent e) relâche de l’objet
Cette interface est implémentée par la classe
MouseAdapter qu ’il faudra étendre pour gérer les
événements souris
Autres gestions d ’événements
(fenêtre)
Sylvain LECOMTE & Vincent POIRRIEZ
Ainsi que l’interface WindowListener qui définit les
méthodes suivantes :
void windowActivated(WindowEvent e) la fenêtre devient active
void windowClosed(WindowEvent e) fermeture par un bouton ou
autre
void windowClosing(WindowEvent e) fermeture par menu système
void windowDeactivated(WindowEvent e) la fenêtre n’est plus active
void windowDeiconified(WindowEvent e) de minimisée à un autre
état
void windowIconified(WindowEvent e) minimisation
void windowOpened(WindowEvent e) première ouverture
Cette interface est implémentée par la classe
WindowAdapter qu ’il faudra étendre pour gérer les
événements sur la fenêtre.
Sylvain LECOMTE & Vincent POIRRIEZ
L ’objet graphics
Les fonctions de la classe Graphics permettent
de dessiner simplement différentes figures sur
un support :
clearRect, draw3Drect, drawArc, drawImage,
drawLine, drawOval, drawPolygon, drawPolyline,
drawRect, drawString, fill3Drect, fillArc, fillOval,
fillPolygon, fillRect, getColor, getFont, setColor,
setFont.
Le support peut être tout objet descendant de
Composant
Exercice
Créer une Frame permettant de dessiner
des lignes à l ’aide de la souris
Utiliser un tableau de 10 Points pour
tracer des lignes entre chaque Point.
Sylvain LECOMTE & Vincent POIRRIEZ
Java : Aspects Avancés
• Le Swing
Swing :
Qu ’est ce que c ’est ?
Sylvain LECOMTE & Vincent POIRRIEZ
Swing est un ensemble de librairies graphiques
plus évoluées et plus complètes que les
librairies AWT.
Swing est livrée avec le JDK 1.2,
pour JDK 1.1, il est possible de télécharger les
classes swing.
Sylvain LECOMTE & Vincent POIRRIEZ
Nouvelles Fonctionnalités
Swing propose de nouveaux composants tels que
Les Tables, les Arbres, la Barre de progression…
Les objets graphiques AWT ont été surchargés (on
trouve maintenant les types JButton, Jpanel, ...)
Avec Swing, il est possible de masquer certains
événements
Il est possible de "zaper" entre les différentes
interfaces :
l ’interface Windows
l ’interface Motif
une interface 3D « métale »
Sylvain LECOMTE & Vincent POIRRIEZ
Un exemple de swing...
import javax.swing.*; import java.awt.*;import java.awt.event.*;
public class SwingApplication
{
private static String labelPrefix = "Number of button clicks: ";
private int numClicks = 0;
public Component createComponents()
{
final JLabel label = new JLabel(labelPrefix + "0 ");
JButton button = new JButton("I'm a Swing button!");
button.setMnemonic(KeyEvent.VK_I);
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
numClicks++;
label.setText(labelPrefix + numClicks);
}
}
);
label.setLabelFor(button);
}
Sylvain LECOMTE & Vincent POIRRIEZ
Un exemple de swing Suite...
public static void main(String[] args)
{
try {
UIManager.setLookAndFeel(
UIManager.getCrossPlatformLookAndFeelClassName());
} catch (Exception e) { }
//Create the top-level container and add contents to it.
JFrame frame = new JFrame("SwingApplication");
SwingApplication app = new SwingApplication();
Component contents = app.createComponents();
frame.getContentPane().add(contents, BorderLayout.CENTER);
//Finish setting up the frame, and show it.
frame.addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0); } });
frame.pack(); frame.setVisible(true);
}
Sylvain LECOMTE & Vincent POIRRIEZ
Swing dans une applet
Il est tout à fait possible de créer des applets utilisant des
composants swing.
Il faut alors être sûr que les navigateurs des utilisateurs
pourront interpréter le swing.
import javax.swing.*; import java.awt.*;
public class HelloSwingApplet extends JApplet
{
public void init()
{
JLabel label = new JLabel("You are successfully running a Swing applet!");
label.setHorizontalAlignment(JLabel.CENTER);
//Add border.
label.setBorder(BorderFactory.createMatteBorder(1,1,2,2,Color.black));
getContentPane().add(label, BorderLayout.CENTER);
}
}
Sylvain LECOMTE & Vincent POIRRIEZ
Un autre exemple :
un menu
Sylvain LECOMTE & Vincent POIRRIEZ
Conclusion sur Swing
Swing offre surtout beaucoup plus de composants
que AWT (trop ?) :
Le rendu est meilleur
Les options nombreuses
Mais l ’API est encore difficile à connaître
ne pas hésiter à utiliser le Tutorial...
Sylvain LECOMTE & Vincent POIRRIEZ
Java : Aspects Avancés
• Les JavaBean
Sylvain LECOMTE & Vincent POIRRIEZ
La notion de composant
Un bean Java est un composant réutilisable (sorte
d ’active X)
Il facilite donc la création de programmes par
connexion de composants
Java propose déjà un ensemble de composants
très utiles (le bean hotjava par exemple pour
afficher une page web, ...)
Pour développer, utiliser des beans, il existe le
bdk, le kit de développement de beans ...
Sylvain LECOMTE & Vincent POIRRIEZ
Outil de développement
Réserve de
composants
Application
Propriété du
composant
sélectionné
Sylvain LECOMTE & Vincent POIRRIEZ
L ’introspection
Permet à un système de se regarder lui même
Exemple :
Les objets de la classe Class représente des classes du système
Les objets de la classe Method représente des méthodes
On peut alors rechercher une classe par son nom
Class classButton = Class.forName("Button");
et créer une nouvelle instance de cette classe
Objetc myButton = classButton.newInstance();
et récupérer toutes les méthodes de cette classe :
Method [] bmethods = classButton.getDeclaredMethods();
Sylvain LECOMTE & Vincent POIRRIEZ
Qu ’est ce qu ’un Beans ?
Un composant qui possède :
des propriétés
des événements reconnus
des méthodes de traitement des événements
Importance de l ’introspection :
possibilité d ’interroger le composant
Quelles sont tes méthodes, les variables, les événements traités
Sylvain LECOMTE & Vincent POIRRIEZ
Types de Beans
Component (montre, barre, synoptique, ...)
Container (panneau, ...)
Invisible (ne possède pas d ’interface graphique )
joue le rôle d ’interface
Applet
Sylvain LECOMTE & Vincent POIRRIEZ
La double vie des Beans
Pendant la configuration dans le BDK le Bean
peut posséder sa propre interface graphique
de configuration
Le bean est sérializé à la fermeture du bdk, il
est désérialisé (rechargé) à l exécution.
Les méthodes du bean sont activés par des
événements.
Sylvain LECOMTE & Vincent POIRRIEZ
Classes d’évènements prédéfinies
Evénements de bas niveau
java.util.EventObject
java.awt.AWTEvent
java.awt.event.ComponentEvent
java.awt.event.FocusEvent
java.awt.event.WindowEvent
java.awt.event.InputEvent
java.awt.event.KeyEvent
java.awt.event.MouseEvent
Sylvain LECOMTE & Vincent POIRRIEZ
Créer un Bean...
1. Ecrire le source : C ’est un rectangle rouge
import java.awt.*;
import java.io.Serializable;
public class SimpleBean extends Canvas implements Serializable
{
public SimpleBean()
{ setSize(60,40); setBackground(Color.red); }}
2. Créer un fichier jar contenant la classe SimpleBean
Sylvain LECOMTE & Vincent POIRRIEZ
Créer un Bean (suite)
3. Charger le .jar dans la ToolBox
4. Créer une instance de la classe dans la BeanBox
On peut se rendre compte que le Bean dispose d ’un
certain nombre de propriétés (qui sont en fait héritées
de Canvas) :
Foreground
Background
font
name
Sylvain LECOMTE & Vincent POIRRIEZ
Ajouter une propriété
Exemple : la propriété de « couleur »
1. Créer et initialiser l ’atribut : private Color color = Color.green;
2. Ecrire une méthode pour obtenir la couleur :
public Color getColor() {return color;}
3. Ecrire une méthode pour changer la couleur
public void setColor(Color newColor){ color = newColor; repaint();}
4.Réécrire la méthode paint() héritée de Canvas :
public void paint(Graphics g) { g.setColor(color); g.fillRect(20, 5, 20, 30);}
5.Compiler le Bean, le charger dans la Toolbox et créer une instance
dans la BeanBox.
Sylvain LECOMTE & Vincent POIRRIEZ
Résultat
Sylvain LECOMTE & Vincent POIRRIEZ
Enterprise Java Beans
Ce sont les Beans contenant une couche
client serveur,
très à la mode en ce moment (commerce
électroniques, accès à ds bases de
données distantes, communication aux
travers de site web,...)
Sylvain LECOMTE & Vincent POIRRIEZ
Java , suite
Et non fin,
cf. Internet, de nombreuses applications
de Java à tous niveaux,
possibilité d ’inclure des librairies C,
notions de servlet pour communication de
données d ’un client vers un fournisseur
par html,
accès sécurisé, xml, ...........