# MVC Pattern



## PollerJava (8. Jan 2008)

Hallo,

ich lese aus einer XML- Datei ein und stelle die Struktur der XML- datei in einem JTree dar.
Meine Frage wäre jetzt, wer im MVC die Datei einließt, 
Ich vermute mal, der Controller aber ganz sicher bin icm mir nicht ob nicht das Model besser wäre und ich dann den View über den ModelObserver über die Änderungen informiere.

Vielen Dank für die Antworten,

lg


----------



## SnooP (8. Jan 2008)

Kommt ganz darauf an... - wenn der User das Laden der xml-datei initiiert, dann sollte der Controller das lesen übernehmen und in das TreeModel tüten... dieses aktualisiert die View dann automatich.


----------



## PollerJava (8. Jan 2008)

ich werds so machen, dass, wenn der User "Einlesen" betätigt, der Controller das Model veranlasst, die XML- Datei einzulesen,

Eine andere Frage hätte ich noch, wenn ich die XML- Datei mit der Struktur 


```
<Element type=""	  					id="0"     				name="0">  		  					  
		<varID type="" id="0">
			<State id="0">
				...
                                ...
                                ...
			</State>
		</varID>		
	</Element>
```
einlese, wo soll ich die XML- Datei speichern bzw. was ist am Besten/Schnellsten beim einlesen und bei der Bearbeitung-> Vector, HashMap, Set?

lg


----------



## babuschka (8. Jan 2008)

Dere,

www.java-forum.org/de/topic61262_jtable-defaulttablemodel-neue-row-per-button-klick.html

Gaaaaanz unten hat er alles nomal gepostet. Handelt sich zwar um ne JTable aber ums Prinzip von MVC zu verstehen is es ganz gut.

In deinem Fall wärs so:

```
View
-GUI aufbau (Actioncommand setzen)
-Methode zum einlesen
-Methode zum anzeigen

Controler
-View erzeugen und Actionlistener mit this setzen
-implementiert Actionlistener (ruft bei entsprechenden Actioncommand die Methode in View zum einlesen auf)
```


----------



## PollerJava (8. Jan 2008)

@Cmuck:
-implementiert Actionlistener (ruft bei entsprechenden Actioncommand die Methode in View zum einlesen auf)


der Controller kann nur das Model zum einlesen aufrufen, meinst Du das, der View darf ja mit dem Einlesen überhaupt nichts zu tun haben,

Ist ein Vector für das Speichern der XML- Datei ok?


----------



## babuschka (8. Jan 2008)

guck dir das beispiel im vorherigen link, den ich gepostet hab, an.
geh den code durch und du wirst verstehen wie der zusammenhang ist

de.wikipedia.org/wiki/Model_View_Controller

die daten durch das model einlesen zu lassen ist falsch ("...Das Modell ist von Präsentation und Steuerung unabhängig...")

controller = steuerung
"...Es ist nicht die Aufgabe der Steuerung Daten zu manipulieren. Die *Steuerung entscheidet aufgrund der Benutzeraktion in der Präsentation* welche Daten im Modell geändert werden müssen. ..."

view = präsentation
"...Die Präsentation ist für *die Darstellung der benötigten Daten* aus dem Modell und die Entgegennahme von Benutzerinteraktionen zuständig. Sie kennt *sowohl ihre Steuerung als auch das Modell*, dessen Daten sie präsentiert. Sie ist nicht für die Weiterverarbeitung der vom Benutzer übergebenen Daten verantwortlich...."


ich würde also das einlesen in der view machen, da diese das model kennt


----------



## babuschka (8. Jan 2008)

```
public class Controller implements ActionListener {

    private View view = null;
   
    Controller(View view) {
        this.view = view;
   
        view.setActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent actEv) {
        String action = actEv.getActionCommand();
   
        if (action.equals("HINZU")) {
            Person p = new Person("Test", "User");
            view.getMdl().addPerson(p);
        }
    }
}
```

der controller entscheidet nur, welche methdoe in view aufgerufen wird
beim klicken das buttons mit dem actioncommand "HINZU" ist es .getMdl().addPerson


----------



## PollerJava (8. Jan 2008)

Nö, das ist mir nicht klar, warum View die Datein einlesen soll, da kann ich die GUI wieder nicht in einem anderen Programm verwenden, da ja dann dort die XML- datei eingelesen wird,

ausserdem starte ich mein Programm so:


```
DesignerModelInterface model = new DesignerModel();                                  // das Model erzeugen
        ControllerInterface controller = new DesignerController(model);
```

wie in einem anderen Bsp. vorgeschlagen,

lg


----------



## babuschka (8. Jan 2008)

die ordentliche trennung zwischen controler und view klappt nicht immer.
in vielen fällen ist es oft so, das sie zusammengelegt sind.

also wenn ein model erzeugt wird, dann erst in der view bzw wenigstens dem view übergeben. wie soll view die daten anzeigen wenn er das model ned kennt?

wo hast du das bsp den her? post mal bitte den link


schreib dir doch extra ne klasse z.B. ReadXML die für das einlesen zuständig ist.
so kannst die GUI in einem anderen programm verwenden.

also z.B.

```
public class Controller implements ActionListener {

    private View view;
    private ReadXML input;

    Controller(View view) {
        this.view = view;
   this.input = new ReadXML();

        view.setActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent actEv) {
        String action = actEv.getActionCommand();
   
        if (action.equals("EINLESEN")) {
               view.repaintGUI(input.readXML());
               
        }
    }
}
```

Du erzeugst dir Controller. Controller erzeugt die View und einmal ReadXML. 
Klickst auf den Button einlesen, führt ReadXML das einlesen der XML-Datei aus 
und gibt den Container (HashMap,ArrayList,...) an view.repaintGUI zurück.
in dieser methode in view lässt du dir dann deinen jtree erzeugen und darstellen


----------



## PollerJava (8. Jan 2008)

Entwurfsmuster von O'Reilly, 

1. Model erzeugen
2. Controller mit einer Instanz auf das Model erzeugen,
3. Im Konstruktor des Kontrollers den View mit Instanzen auf das Model und den Controller erzeugen,

Wenn du es so machst wie in deinem Beispiel, dann verwendest du das Strategy- Muster nicht, das heißt, alle 3 (MVC) sind voneinander abhängig,
Mit meiner Implementierung kann ich den Controller zur Laufzeit ändern,

lg


----------



## Guest (8. Jan 2008)

PollerJava hat gesagt.:
			
		

> Wenn du es so machst wie in deinem Beispiel, dann verwendest du das Strategy- Muster nicht, das heißt, alle 3 (MVC) sind voneinander abhängig


wowowowow....komm ich jetzt ned ganz mit oder warum wechselst du von mvc zum strategy? 
davon war bisher noch nie die rede.

also bevor ma da jetzt stundenlang weiterreden, sag erstmal ganz klar was du machen willst....
wieso soll der controler zur laufzeit geändert werden?
eine änderung des controlers hattest du in der ersten frage nie angegeben.

guck dir doch das bild bitte an (quelle: wiki)





türlich ist model von view abhängig und view von controller


----------



## babuschka (8. Jan 2008)

sry...vorheriger post war natürlich ich...war bloss nimma angemeldet


----------



## HLX (8. Jan 2008)

@PollerJava/Cmuck Ich denke es gibt hier einen kleinen Unterschied in eurer Definition des Models

Das Model besteht nicht allein aus der Datenhaltung für die GUI sondern auch aus dem Back-End, sprich: Programmlogik und DB-Anbindung. Von daher ist der Ansatz von PollerJava, die Daten im Model einzulesen korrekt.

Der Controller stößt den Import an, nimmt die importierten Daten aus dem Back-End entgegen und übergibt sie an die GUI.

In manchen Fällen ist der Teil des Models, der der GUI zugeordnet ist Bestandteil des Views. So ist es z.B. beim Swing-TableModel.


----------



## PollerJava (8. Jan 2008)

Mein Ansatz ist dieser:

http://students.cs.byu.edu/~cs340ta...s/?path=MVC/DJView/headfirst/combined/djview/

Grundsaätzlich sollte der View nur eine Referenz auf ControllerInterface und ModelInterface haben, 
zur Laufzeit kann dann der Controller (theoretisch, nicht in meinem Fall) geändert werden (Das ist das Strategy- Muster -> kapseln, was sich ändert),

lg


----------



## babuschka (8. Jan 2008)

mhh...okey....dann lag der fehler wohl bei mir
hab damals im studium observer so verstanden, dass das model wirklich nur ein model repräsentiert.
sprich keine ausführenden tätigkeiten wie z.b. db-abfragen vornimmt.

man lernt nie aus


----------



## ARadauer (8. Jan 2008)

ja genau:



> die daten durch das model einlesen zu lassen ist falsch ("...Das Modell ist von Präsentation und Steuerung unabhängig...")
> ..
> ich würde also das einlesen in der view machen, da diese das model kennt


ganz ehrlich, mir wurde kurz schwindelich, als ich das gelesen habe.

Die Daten wirden im Model gehalten also soll sich das Model auch die Daten selber laden. Das Commando dafür bekommt es vom Contrller, welcher von der View angestossen wurde. Die View wird vom Model über das ObserverPatter informiert dass Daten geladen wurden. View hat eine Referenz auf das Model und kann sich die Daten, wenn es will hohlen.

generell, kann man aber sagen, dass es kein richtig oder falsch gibt, mvc ist nichtmal ein pattern sondern eine sammlung von patterns. Es ist eher eine architekturüberlegung. wenn mann es öfters angewendet hat, merkt man.

(obwohl: daten lesen in der gui ist falsch! *g*)

Beispiel: Excel: Tabellenansicht (V), Daigrammansicht (V), Datenstruktur für die Werte (M), Controller (C).
die Tabelleansiciht ist sicher nicht für das Laden von Daten zuständig.


zum halten der XML Daten in einer Datenstruktur. Ich würde mir entweder eine eigene Struktur schreiben oder die Daten im DOM lassen... kommt auf die Daten an. Aber eine einfache Liste? Ich bin mir nicht sicher in wie weit die Daten dann verarbeitet werden sollen.... Kommt auf die Daten und auf den Zweck an....


----------



## PollerJava (8. Jan 2008)

Genau, zur vervollständigung: Das MVC besteht in seinen Grundzügen aus dem CompositeMuster im View, dem ObserverMuster und dem StrategyMuster,
Natürlich  können die einzelnen Module wieder Muster enthalen, so wie bei mir die AbstractFactory, da ich das erzeugen einer Familie von Objekten ausgelagert habe-> die Factory ist ein Singelton,


PS:

wo wird eigentlich ein Pfad für eine Datei eingelesen -> im View oder im Controller oder Model,
ich hab den FileChooser jetzt im View implementiert und übergebe den Pfad dann dem Controller und dieser gibt den Pfad dem Model,

ist das Konsistent?

lg


----------



## ARadauer (8. Jan 2008)

würd ich auch so machen.


----------



## maki (8. Jan 2008)

> Das MVC besteht in seinen Grundzügen aus dem CompositeMuster im View, dem ObserverMuster und dem StrategyMuster,


Nicht immer.

MVC bleibt nur ein allgemeines Konzept mit -zig möglichen Implementierungen.


----------



## PollerJava (8. Jan 2008)

SnooP hat gesagt.:
			
		

> Dijkstra




Der Dijkstra verfolgt mich momentan bei den Routern bzw. bei der Pfadsuche oder kürzesten Weg suche, da gibts ja auch den Dijkstra -> super algorithmus,


----------



## SnooP (9. Jan 2008)

Dijkstra wird einem immer verfolgen... selbst wenn man es nur mit Thread-Programmierung zu tun bekommt 

und ich hatte das auch falsch verstanden - mit der Definition von Model tut man sich manchmal etwas schwer... - für manche sind das nur seelenlose Datencontainer (z.B. Hibernate-Klassen). Ich trenne das gerne in BusinessLogik + Model auf... dann kann man die BL-Klassen auch als Service implementieren, die für ihre Datenhaltung dann auf die Datenklassen zugreifen... - allerdings verliert man dabei manchmal die schöne OOP-Welt


----------



## babuschka (9. Jan 2008)

SnooP hat gesagt.:
			
		

> mit der Definition von Model tut man sich manchmal etwas schwer... - für manche sind das nur seelenlose Datencontainer


genau das hatte ich bisher drunter verstanden...bin ja zum glück ned der einzige ders anfangs falsch versteht *G*



			
				SnooP hat gesagt.:
			
		

> Ich trenne das gerne in BusinessLogik + Model auf...


auf der ersten seite hatte ich auch das vorgeschlagen...ne eigene klasse für die businesslogik (einlesen der xml)...

würde dann dieser code des controlers stimmen?


```
public class Controller implements ActionListener {

    private Model model;
    private View view;
    private ReadXML input;

    Controller(Model model) {
    
    model = new Model();
    input = new ReadXML();        
    this.view = new View;
       

        view.setActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent actEv) {
        String action = actEv.getActionCommand();
   
        if (action.equals("EINLESEN")) {
               model.setData(input.readXML());
               
        }
    }
}
```


die anzeige in view wird mit dem observer-pattern realisiert.
setData signalisiert das sich im observable was geändert hat -> view aktualisiert sich


----------



## PollerJava (10. Jan 2008)

Also ich würd mal folgendes sagen, 
MVC wird ja in den verschiedenen Bereichen eingesetzt -> Applikationen, WebAnwendungen usw.
Wenn man das MVC in einer Applikation verwendet, dann würd ich meine Variante bevorzugen dan man alle Teile (Controller, View, Model eigenständig verwenden kann aber besonders halt die View), 

wenn das MVC in einem J2EE Projekt verwendet wird (Model ist ja da die Datenbank) dann ist natüllich die ganze Logic im View und das Model ist seelenlos (so weit eine Datenbank seelenlos sein kann),

lg


----------



## HLX (10. Jan 2008)

PollerJava hat gesagt.:
			
		

> wenn das MVC in einem J2EE Projekt verwendet wird (Model ist ja da die Datenbank) dann ist natüllich die ganze Logic im View und das Model ist seelenlos (so weit eine Datenbank seelenlos sein kann),



Also für einen View gibt es schon eine ziemlich klare Definition. Der View ist auch in J2EE-Projekten die grafische Benutzeroberfläche. Er enthält ebenfalls keine Programmlogik. Das was du wahrscheinlich hier als View bezeichnest ist nur eine weitere Stufe im Back-End. 

MVC zielt darauf ab, die grafische Benutzeroberfläche von Logik zu befreien und das Model für verschiedene grafische Oberflächen wiederverwendbar zu machen. Heutzutage wird für viele Anwendungen gefordert, dass sie in verschiedenen Oberflächen (Swing/Web) und auf verschiedenen Endgeräten (PC/Handy) zur Verfügung gestellt werden können. Das Model ist hier im Prinzip der für alle Fälle wiederverwendbare Teil der Anwendung. Der Controller stellt die Schnittstelle zwischen Model und der jeweiligen GUI dar.


----------



## maki (10. Jan 2008)

> wenn das MVC in einem J2EE Projekt verwendet wird (Model ist ja da die Datenbank) dann ist natüllich die ganze Logic im View und das Model ist seelenlos (so weit eine Datenbank seelenlos sein kann),


Auch nicht richtig 

Das Model in J2EE kann sein:
Eine Entity (EJB/POJO), ein TransferObjekt, etc. pp.

Verbindung zur DB/EJB/Backend wird meist vom Controller gemacht.


----------



## ARadauer (10. Jan 2008)

ich stimme maki zu.

die view stellen meiner meinung nach zb die jsp seiten dar (darstellen der daten und annehmen der benutzer aktionen)
controller ist dann irgendein zentralles serverlet (ja nach framework) das über das model sachen macht (zb laden von daten) und dann an die view (jsp) weiterletet.

das model besteht dan aus DAOs, container klassen, pojo, fachobjekte das ganze zeugs halt, je nach dem wie man arbeitet (ejb hab ich noch nie bentutz)

die datenbank stellt für micih eine persistierung des models dar. kann natürlich auch zum model hinzugezählt werden.


das ganze ist oft eine auslegungssache eines sehr komplexen themas.....


----------



## maki (10. Jan 2008)

> das model besteht dan aus DAOs, container klassen, pojo, fachobjekte das ganze zeugs halt, je nach dem wie man arbeitet (ejb hab ich noch nie bentutz)


Naja, ein DAO ist nicht unbedingt das Model, es kommt wirklich auf die Architektur an.

Wie HLX bereits sagte, geht es bei MVC um die Trennung zwischen der Darstellung, den Daten und der Steuerung.
Es gibt so viele Möglcihkiten das umzusetzen, dass es keinen Sinn macht über MVC im allgemeinen zu sprechen.


----------



## ARadauer (10. Jan 2008)

> DAO ist nicht unbedingt das Model


ja wie man will. 
Meine Modelklassen benutzen immer Daos um Fachobjekte zu laden.


----------



## byte (10. Jan 2008)

PollerJava hat gesagt.:
			
		

> Wenn man das MVC in einer Applikation verwendet, dann würd ich meine Variante bevorzugen dan man alle Teile (Controller, View, Model eigenständig verwenden kann aber besonders halt die View)


Ich behaupte einfach mal, dass Du in den meisten Fällen View und Controller *nie* in einem anderen Kontext (also anderem Modell) wiederverwenden wirst. Die Wiederverwendbarkeit bei MVC bezieht sich fast immer auf das Modell. Du wirst Deine GUI fast immer auf die Anforderungen des Modells entwerfen und auch der Controller ist dann mit dieser GUI fest verdrahtet.
Natürlich gibts auch Ausnahmen, die dann aber meistens extreme Anforderungen an das Design stellen (z.B. Eclipse RCP).


----------



## maki (10. Jan 2008)

> ja wie man will.
> Meine Modelklassen benutzen immer Daos um Fachobjekte zu laden.


Bei mir nutzen die EJBs die DAOs um Domainobjekte zu laden, die Domainobjekte selbst wissen nix von DAOs, es gibt Hibernate Mapping Dateien.

So viele Möglichkeiten..


----------



## ARadauer (10. Jan 2008)

stimmt. die wiederverwendbarkeit wird immer sehr groß geschrieben. aber dass wirklich effektiv ohne anpassungen etwas wiederverwenden, ist selten möglich.

ich kapsel gerne ganze mvc componenten, zb eine benutzer liste, mit view, controller und model. diese benutzer liste kann ich dann an verschiedenen stellen im programm verwenden.


----------



## HLX (10. Jan 2008)

ARadauer hat gesagt.:
			
		

> ich kapsel gerne ganze mvc componenten, zb eine benutzer liste, mit view, controller und model. diese benutzer liste kann ich dann an verschiedenen stellen im programm verwenden.



Diese Art der Wiederverwendbarkeit gibt es natürlich auch, hat aber nichts mit MVC zu tun.  :wink:


----------

