1 IMPLANTER LE PARADIGME MVC AVEC RMI UNE SOLUTION (AVEC REDÉFINITION COMPLÈTE DE L IMPLÉMENTATION MVC DE JAVA) : IMPLÉMENTATION MVC actuelle de Java MonModèle Observable MonInterfaceModèle NOUVELLE IMPLÉMENTATION MVC/RMI pour Java MonModèleImpl MonModèle MvcModel MvcModelAbstract MonContrôleur1 Observer MonContrôleur2 Observer ItemListener MonContrôleur3 Observer TextListener MonContrôleur1 MvcControlerView MonContrôleur2 MvcControlerView ACTIONS de l UTILISATEUR (souris / clavier) ACTIONS de l UTILISATEUR (souris / clavier) MaVue1 MaVue1 MaVue2 MaVue3 MaVue1 MaVue1 MaVue2 <T,U,V> JVM 1 : SERVEUR MonContrôleur3 MvcControlerView JVM 2 : CLIENT MaVue3 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 qui permet de fournir aux contrôleurs une description de ce qui a changé dans le modèle.
Action de l utilisateur sur les composants actifs de l interface graphique Transmission au modèle (vu au travers de son interface) de l action à effectuer Notification à tous les contrôleurs inscrits d un changement du modèle Mise à jour des vues en fonction des modifications du modèle (par utilisation de ) 2 DIAGRAMME d ACTIVITÉ (UML) Client JVM 2 Serveur JVM 1 Client JVM 3 Vues ACTION de l UTILISATEUR (souris / clavier) Vue [actualisée] Contrôleurs Réception de l action Mise à jour des Mise vues à jour des vues [paramètres] Modèle Demande d action au modèle Notification de mise à jour à tous les contrôleurs clients Modèle [modifié] Contrôleurs [paramètres] Mise à jour des vues 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.
3 public interface MvcControlerView extends java.rmi. { public void update(mvcmodel mod, W wc) throws java.rmi.exception ; public interface MvcModel extends java.rmi. { public void addcontroler(mvccontrolerview cv) throws java.rmi.exception ; public boolean deletecontroler(mvccontrolerview cv) throws java.rmi.exception ; public void deletecontrolers() throws java.rmi.exception ; public void notifycontrolers() throws java.rmi.exception ; public void notifycontrolers(w wc) throws java.rmi.exception ; public int countcontrolers() throws java.rmi.exception ; public void clearchanged() throws java.rmi.exception ; public boolean haschanged() throws java.rmi.exception ; public void setchanged() throws java.rmi.exception ; public abstract class MvcModelAbstract implements MvcModel { protected java.util.arraylist<mvccontroleurview> mvclist; protected boolean changed; public MvcModelAbstract() { mvclist = new java.util.arraylist<mvccontroleurview>(); changed = false; public void addcontroler(mvccontrolerview cvw) mvclist.add(cvw); public boolean deletecontroler(mvccontrolerview cvw) return mvclist.remove(cvw); public void deletecontrolers() mvclist.clear();
public void notifycontrolers() notifycontrolers(null); 4 public void notifycontrolers(w w) ArrayList<MvcControlerView> supplist = null; // Envoi des update à des MvcControlerView // et non seulement à des MvcControlerView! for( MvcControlerView 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>(); supplist.add(mvc); System.out.println("MvcModelAbstract(notifyControlers): "); System.out.println(" Contrôleur inconnu : "+e.getmessage()); catch ( Exception e) { // Peut arriver pour des raisons de communication réseau if ( supplist == null ) { supplist = new ArrayList<MvcControlerView>(); 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 mvc : supplist ) { deletecontroler(mvc); System.out.println("MvcModelAbstract(notifyControlers) : " + "suppression de " + supplist.size() + " contrôleur(s)"); public int countcontrolers() return mvclist.size(); public boolean haschanged() return changed; public void setchanged() changed = true;
5 public void clearchanged() throws java.rmi.exception { 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); System.out.println(" OK"); return true; catch (Exception e) { 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(, int) // plutôt que exportobject() UnicastObject.exportObject(this, portserveur); // Enregistre le nom et la référence distante (Stub) registry.rebind(nameod, this); System.out.println(" OK : "+nameod); return true; catch (Exception e) { System.out.println(" ERREUR"); System.out.println( " Warning dans registermodel : " + e.getmessage()); return false;
6 public class <T,U,V> { public final String mess; public T t; public U u; public V v; public () { this.mess = null; public (String mess) { public (String mess, T t) { this.t = t; public (String mess, T t, U u) { this.t = t; this.u = u; public (String mess, T t, U u, V v) { this.t = t; this.u = u; this.v = v;