Java RMI Y. Laborde Cours LOO - TOA
1
IMPLANTER LE PARADIGME MVC AVEC RMI
UNE SOLUTION (AVEC REDÉFINITION COMPLÈTE
DE L’IMPLÉMENTATION MVC DE JAVA) :
De plus, les classes et interfaces ont été paramétrées à l’aide de types génériques pour faciliter
l’utilisation de la classe WhatChanged qui permet de fournir aux contrôleurs une description de ce
qui a changé dans le modèle.
NOUVELLE IMPLÉMENTATION
MVC/RMI pour Java
IMPLÉMENTATION MVC actuelle de Java
MonContrôleu
r
3
MvcControlerView
Remote
ActionListener
MonContrôleu
r
2
MvcControlerView
Remote
ActionListener
MonModèleImpl
MonModèle
MvcModel
Remote
MaVue1
MaVue2
MaVue3
MaVue1’
ACTIONS de
l’UTILISATEUR
(
souris
/
clavier
)
MonContrôleur1
MvcControlerView
Remote
ActionListener
MvcModelAbstract
J
VM 1 : SERVEU
R
J
VM 2 : CLIENT
q
q
o
p
n
WhatChanged
MonContrôleur3
Observer
TextListener
MonModèle MaVue1
MaVue2
MaVue3
MaVue1’
q
q
MonContrôleur1
Observer
A
ctionListener
MonContrôleur2
Observer
ItemListener
o
MonInter
f
aceModèle
Observable p
ACTIONS de
l’UTILISATEUR
(
souris
/
clavier
)
n
WhatChanged
<W>
<T,U,V>
<W>
<W>
<W>
<W>
Java RMI Y. Laborde Cours LOO - TOA
2
n Action de l’utilisateur sur les composants actifs de l’interface graphique
o Transmission au modèle (vu au travers de son interface) de l’action à effectuer
p Notification à tous les contrôleurs inscrits d’un changement du modèle
q Mise à jour des vues en fonction des modifications du modèle (par utilisation de
WhatChanged)
Diagramme d'activités : sémantique
UML permet de représenter graphiquement le comportement d'une méthode ou le
déroulement d'un cas d'utilisation, à l'aide de diagrammes d'activités (une variante
des diagrammes d'états-transitions).
Une activité représente une exécution d'un mécanisme, un déroulement d'étapes
séquentielles.
Le passage d'une activité vers une autre est matérialisé par une transition.
Les transitions sont déclenchées par la fin d'une activité et provoquent le début
immédiat d'une autre (elles sont automatiques).
En théorie, tous les mécanismes dynamiques pourraient être décrits par un
diagramme d'activités, mais seuls les mécanismes complexes ou intéressants
méritent d'être représentés.
Afin d'organiser un diagramme d'activités selon les différents responsables des actions représentées, il
est possible de définir des "couloirs d'activités".
Il est même possible d'identifier les objets principaux, qui sont manipulés d'activités en activités et de
visualiser leur changement d'état.
DIAGRAMME d’ACTIVITÉ (UML)
Clien
t
JVM 2
Vues Contrôleurs
Serveur JVM 1
Modèle
Clien
JVM 3
Contrôleurs
Demande
d’action au
modèle
Modèle
[modifié]
Notification
de mise à jour
à tous les
contrôleurs
clients
Mise à jour
des vues
ACTION de
l’UTILISATEUR
(souris /
clavier
)
Réception
de l’action
Mise à jour
des vues
Vue
[actualisée]
Mise à jour
des vues
~ ~
~
WhatChanged
[paramètres]
WhatChanged
[paramètres]
n
q
q
o
p
q
Java RMI Y. Laborde Cours LOO - TOA
3
package mvc.rmi;
public interface MvcControlerView<W> extends java.rmi.Remote {
public void update(MvcModel<W> mod, W wc)
throws java.rmi.RemoteException ;
}
package mvc.rmi;
public interface MvcModel<W> extends java.rmi.Remote {
public void addControler(MvcControlerView cv)
throws java.rmi.RemoteException ;
public boolean deleteControler(MvcControlerView cv)
throws java.rmi.RemoteException ;
public void deleteControlers() throws java.rmi.RemoteException ;
public void notifyControlers() throws java.rmi.RemoteException ;
public void notifyControlers(W wc) throws java.rmi.RemoteException ;
public int countControlers() throws java.rmi.RemoteException ;
public void clearChanged() throws java.rmi.RemoteException ;
public boolean hasChanged() throws java.rmi.RemoteException ;
public void setChanged() throws java.rmi.RemoteException ;
}
package mvc.rmi;
public abstract class MvcModelAbstract<W> implements MvcModel<W> {
protected java.util.ArrayList<MvcControleurView> mvclist;
protected boolean changed;
public MvcModelAbstract() {
mvclist = new java.util.ArrayList<MvcControleurView>();
changed = false;
}
public void addControler(mvcControlerView cvw)
throws java.rmi.RemoteException{
mvclist.add(cvw);
}
public boolean deleteControler(mvcControlerView cvw)
throws java.rmi.RemoteException{
return mvclist.remove(cvw);
}
public void deleteControlers() throws java.rmi.RemoteException{
mvclist.clear();
}
Java RMI Y. Laborde Cours LOO - TOA
4
public void notifyControlers() throws java.rmi.RemoteException{
notifyControlers(null);
}
public void notifyControlers(W w) throws java.rmi.RemoteException{
ArrayList<MvcControlerView<W>> suppList = null;
// Envoi des update à des MvcControlerView<W>
// et non seulement à des MvcControlerView !
for( MvcControlerView<W> mvc : mvclist ) {
try {
mvc.update(this, w); // Invocation de l'OD-méthode
}
// ICI: on peut vouloir supprimer le contrôleur non valide
// de la liste des contrôleurs du modèle pour qu'il
// ne provoque plus d'erreur inutile la prochaine fois.
catch ( NoSuchObjectException e) {
// Peut arriver quand le client a été fermé !
if ( suppList == null ) {
suppList = new ArrayList<MvcControlerView<W>>();
}
suppList.add(mvc);
System.out.println("MvcModelAbstract(notifyControlers): ");
System.out.println(" Contrôleur inconnu : "+e.getMessage());
}
catch ( RemoteException e) {
// Peut arriver pour des raisons de communication réseau
if ( suppList == null ) {
suppList = new ArrayList<MvcControlerView<W>>();
}
suppList.add(mvc);
System.out.println("MvcModelAbstract(notifyControlers) : ");
System.out.println(" Contrôleur inaccessible : "+e.getMessage());
}
}
// Suppression des contrôleurs inconnus !
if ( suppList != null ) {
for( MvcControlerView<W> mvc : suppList ) {
deleteControler(mvc);
}
System.out.println("MvcModelAbstract(notifyControlers) : "
+ "suppression de "
+ suppList.size() + " contrôleur(s)");
}
}
public int countControlers() throws java.rmi.RemoteException{
return mvclist.size();
}
public boolean hasChanged() throws java.rmi.RemoteException{
return changed;
}
public void setChanged() throws java.rmi.RemoteException{
changed = true;
}
Java RMI Y. Laborde Cours LOO - TOA
5
public void clearChanged() throws java.rmi.RemoteException {
changed = false;
}
/**
* Créer un service de résolution de noms pour la JVM courante
*/
protected boolean createRegistry(int portServeur) {
try {
System.out.print("SERVEUR création du registry :");
// Créer un service de noms pour la JVM courante
LocateRegistry.createRegistry (portServeur) ;
// Trouve le service de résolution de noms de RMI
registry = LocateRegistry.getRegistry(portServeur);
// echo
System.out.println(" OK");
return true;
} catch (Exception e) {
// echo
System.out.println(" ERREUR");
System.out.println(
" Warning dans createRegistry : " + e.getMessage());
return false;
}
}
/**
* Exporte le STUB serveur (this)
* et l'enregistre dans rmiregistry sous le nom nameOD.
*/
protected boolean registerModel(int portServeur, String nameOD) {
try {
System.out.print("SERVEUR enregistrement du modèle :");
// Exporte le modèle dans rmiregistry
// ICI, le STUB est créé dynamiquement
// par l'usage de exportObject(Remote, int)
// plutôt que exportObject(Remote)
UnicastRemoteObject.exportObject(this, portServeur);
// Enregistre le nom et la référence distante (Stub)
registry.rebind(nameOD, this);
// echo
System.out.println(" OK : "+nameOD);
return true;
} catch (Exception e) {
// echo
System.out.println(" ERREUR");
System.out.println(
" Warning dans registerModel : " + e.getMessage());
return false;
}
}
}
1 / 6 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !