OOP Kommunikation MVC und DTO

Maybe

Mitglied
Guten Tag liebe Community,

ich habe mal wieder eine Frage zur Struktur und wie ihr dieses aufbauen würdet.

Vorweg:
als GUI benutze ich Swing
zum persistieren benutze ich Hibernate (deswegen keine DAO Schicht, richtig?)

So sieht meine Struktur aus:
mvc-dto0gsyt.png


Ich bin gerade dabei, eine Datenbank für Filme zu bauen. Ich habe verschiedene Panel, diese sind zum Beispiel DVD und BluRay, welche in dem MainFrame untergebracht werden und mit einem jTabbedPane gewechselt werden können.
Diese enthalten verschiedene Bestandteile wie Informationen zum Einkauf (Preis, Artikelnummer etc.). Sie haben viele Gemeinsamkeiten in der Oberfläche, aber auch ein paar differenzen.

Meine Erste Überlegung war, eigene kleinere Panels machen, wie z.B. "BluRayEinkaufPanel" und "DVDEinkaufPanel", die beide von einer Superklasse "EinkaufPanel" erben und die verschiedenen Textfelder etc. hinzuzufügen. Oder sollte man die ganze Oberfläche in den Hauptpanel der BluRay machen und sich die Unterpanel sparen (Nachteil: Codeduplizierung)?
Ein Vorteil bei der zweiten Methode wäre, dass falls ich ein jTextField hinzufügen wollte, dieses frei anordnen kann und nicht nur anhängen kann.

Ein weiteres Problem ist das MVC-Modell. Ich habe die verschiedenen Views (meine Panels) welche Observer implementieren. Nun habe ich eine Suche in jedem Panel.
Ich brauche ja nun einen ActionListener auf dem Suchebutton, der die Daten an das Model weitergibt, ist also mein Controller dieser ActionListener?
Wie verfahre ich weiter? Der Controller ruft den Wert aus dem Model auf, oder sind die DAO direkt mein Modell? Ich müsste ja eine Anweisung haben wie "SELECT Titel FROM DVD WHERE ID =1" steht diese nun in meinem Model und kann mit einer Methode "getDVDbyID(int id)" aufgerufen werden, oder macht dieses der Controller oder das Model ist eigentlich nur ein Datenspeicher (wie meine DTO Klassen?)
Ist das Modell Observable oder der Controller? Ich denke mal das Modell. Wird jetzt setChanged und notifyObservers() aufgerufen, würdet ihr dann dort gleich alle Daten die in dem View erscheinen sollen als String Array übergeben, wird ihr eine DTO-Referenz mitgeben oder würdet ihr in dem View die Daten aus den Model bzw. den DTO Klassen ziehen lassen? (z.B. model.getTitel)

Ich hoffe ihr könnt mir weiterhelfen, ich finde immer nur eine MVC Beispiele ohne DTO Schichten.

Vielen dank im voraus!
 

KSG9|sebastian

Top Contributor
Der MVC/MVP-Teil ist ja rein auf den Client "beschränkt".

Der Controller würde einen Serviceaufruf machen (Webservice, REST, EJB...). Dieser Service wiederum würde JPA/Hibernate (EntityManager) verwenden, welcher quasi als "DAO" fungiert und die Geschäftslogik übernimmt.

Zur MVC-Frage: Ja, der Controller würde den ButtonClick verarbeiten, im besten Fall jedoch aber so, dass er gar nicht weiß dass eine ButtonAction dahinter liegt.

Beispiel (GWT-like):

Code:
interface MyPresenter {
   public void onSearch();
}

interface MyView{
   public String getSearchText();
}

class View implements MyView{
   private JTextField txtSearch;
   private JButton searchButton;

   private MyPresenter presenter;
   public View(MyPresenter presenter){
      this.presenter = presenter;
      ...

      searchButton = new JButton("Suchen");
      searchButton.addActionListener(new ActionListener(){
            public void actionPerformed(....){
                presenter.doSearch();
            }
      });
   }
  public String getSearchText(){
       return txtSearch.getText();
  }
}

class Presenter implements MyPresenter{
    // EJB, REST, RPC, WebService...
    private SearchService searchService;
    private MyView myView;
   
    public Presenter(SearchService service){
        this.searchService = searchService;
        myView = new View(this);
    }

    public void doSearch(){
       readResults(searchService.search(myView.getSearchText());
    }
}

Edith:
Ich persönlich mag die Umsetzung von MVC mittels Observer/Observable nicht sehr. Modelle welche PropertyChanges feuern passt, aber für den "Rest" würde ich eher auf ein Databinding-Framework setzen. notify() und setChanged() u.s.w. wird, finde ich, bei etwas größeren Oberflächen enorm unübersichtlich und nicht nachvollziehbar.

Aber auf deine Frage: Das Model wäre Observable. Die View wäre der Observer, der Controller könnte aber genauso ein Observer sein, kommt darauf an was du tun willst. Der Observer ist ja nur derjenige, der auf Modeländerungen hört...
 
Zuletzt bearbeitet:

Maybe

Mitglied
Ich habe aber ja keinen Server, es existiert quasi nur ein Client. Dieser baut auch die Verbindung zur Datenbank auf etc.

Mit Serviceaufrufen etc. kenne ich mich nicht aus, habe mich noch nie mit Java EE beschäftigt. Genauso ist mir GWT fremd.

Sollte ich das ganze vorhaben besser mit Java EE realisieren?
 
T

TryToHelp

Gast
...
Der Controller würde einen Serviceaufruf machen (Webservice, REST, EJB...). Dieser Service wiederum würde JPA/Hibernate (EntityManager) verwenden, welcher quasi als "DAO" fungiert und die Geschäftslogik übernimmt.
...
Ja, aber finde ich schlecht formuliert, da könnte man denken, das der DAO bzw EntityManager die Geschäftslogik hat, was ja nicht der Fall ist, die sollte schließlich beim Service liegen. Also Buch für genau diesen Aspekt, kann ich dir Moderne Software-Architektur von Johannes Siederleben empfelen https://www.fbi.h-da.de/fileadmin/personal/b.humm/Publikationen/Siedersleben_-_Quasar_1__sd_m_Brosch_re_.pdf
 
T

TryToHelp

Gast
Nein musst du nicht, das kannst du auch als einfache Stande Allone Applikation machen, jedoch solltest du trotzdem EntityManager, Service und dann dein GUI-gedöns haben ;-)
 
T

TryToHelp

Gast
Das war nur ein Vorschlag, aus dem EE umfeld, aber musst du nicht, kannst auch Klassisch aufrufen, wie auch immer das bei Hibernate ohne EE geht, damit habe ich mich noch nicht beschäftigt
 

Zeeu

Aktives Mitglied
KSG9 hat gesagt.:
Aber auf deine Frage: Das Model wäre Observable. Die View wäre der Observer, der Controller könnte aber genauso ein Observer sein, kommt darauf an was du tun willst. Der Observer ist ja nur derjenige, der auf Modeländerungen hört...

denke auch der Controller sollte eher der Observer sein. Wäre es zudem nicht sinnvoll dort auch die Actionlistener zu implementieren ? Über Methoden aus dem JFrame können sich die einzelnen Actionlistener bei den jeweiligen Buttons etc. anmelden und die eigentliche Logik ist komplett im Controller.
 

Maybe

Mitglied
Heißt also die Geschäftslogik = Controller? Ich dachte immer das wäre die Vermittlungsschiene und die Logik wäre in dem Model?

Wie sieht das aus mit Java EE ist das ganz anders als Java SE? Falls ich mehrere solche Projekte vorhabe, lohnt es sich dann Java EE zu erlernen?

Wollte mir eh irgedwann Java EE angucken, aber ich dachte, das wäre nur interessant wenn man einen Server sowie Client hat.

@sebastian: Mit Databinding-Framework meinst du Dependency Injection sowie Guice etc. oder?
 

Zeeu

Aktives Mitglied
ich meinte damit nicht die Geschäftslogik im controller, sondern nur die "Logik" der Gui, reaktion auf tastendrücke oder Klicks und was genau dann passieren soll. Das Model repräsentiert meiner Meinung nach nur die Daten und beschafft diese auch aus der Datenhaltung
 
T

TryToHelp

Gast
Also ich würde sagen, das Model ist nur die Datenhaltung steuerung, also gehört da keine Logik rein ;-)

Also Java EE generell macht nur wirklich Sinn, wenn du eine Web-Applikation, also sozusagen Server-Client (Server und darstellung im Browser) machst. Jedoch kannst du dann EJB und soweiter nutzen, da es von den ApplicationServern unterstützt wird. Wie gesagt EE steht halt für Enterprice als Business, da ist alles eine Nummer größer ;-)
 

KSG9|sebastian

Top Contributor
Du solltest erstmal JavaSE entsprechend verstehen, sonst brichst du dir mit JEE einen ab und es kommt nix raus.

Mit Databinding meine ich zum Beispiel beansbinding (google!).

Bei Änderungen am Model wird die View direkt informiert, somit wäre die View mehr oder weniger auch ein Observer.

Reaktionen auf Button-Klicks und ähnliches liegen natürlich im Controller. Wie dieser Controller davon "Wind bekommt" sei mal dahingestellt.

Zur Trennung:

- View: Die View eben
- Model: Hat die ganzen Daten, keine Logik (!)
- Controller: Steuert die View und enthält allgemeine "Oberflächenlogik"
- Service: Erledigt die Geschäftslogik

Der Service muss kein EJB oder Webservice oder ähnliches sein, für deine Anwendung kannst du einfach eine normale Klasse nehmen. Diese wiederum kennt den EntityManager (DAO) und erledigt alles weitere.
 

Maybe

Mitglied
Also, hier nochmal ein kleines Codebeispiel wie mein Code in sehr vereinfachter Weise aussieht.
Die Unterscheidung zwischen DVD und BluRay macht mit diesen Eigenschaften nicht sehr viel Sinn, da beide natürlich eine Bitrate sowie einen Producer haben.

Was mich stutzig macht ist das Model, es fungiert bei mir lediglich als DAO Schicht. Ich weiß aber einfach nicht wie ich diese dort einbringen soll, oder ob es in diesem Beispiel alles der Controller machen würde?

Ihr hattet mir ja zu einer Service-Schicht geraten. Wie würde ich diese einbringen?
Außerdem hatte ich ein paar Fragen:

- Sollte die View die Daten aus dem Model "pullen" oder sollen diese gepusht werden?
- Wo werden die Eingaben überprüft? View, Model oder doch im Controller?

Vielleicht könntet ihr ja diesen Code mal "optimieren" wenn ihr ein bisschen Zeit habt, wäre auch sehr dankbar.

Entschuldigung für die Umstände :(

Dennoch vielen Dank schonmal für die Hilfe euch allen! :)

Controller.java:
Java:
package controller;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;

import dto.DVD;

import model.Model;
import view.View;

public class Controller extends Observable{
	
	private View view;
	private Model model;

	public static void main(String[] args) {
		new Controller();
	}
	
	public Controller() {
		view = new View();
		model = new Model();
		
		addObserver(view);
		
		view.addBluRaySucheListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				DVD dvd = model.getDvdById(Integer.parseInt(view.getDvdSuche()));
				
				setChanged();
				notifyObservers(); // hier DVD übergeben? Oder soll sich die View das ziehen?
			}
		});
		
		view.addDVDSucheListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// ähnlich wie BluRay, hier weggelassen
			}
		});
	}
	
}
AbstractMedium:
Java:
package dto;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public abstract class AbstractMedium {

	@Id @GeneratedValue
	private int id;
	private String title;
	
	public int getId() {
		return id;
	}
	public String getTitle() {
		return title;
	}
	public void setId(int id) {
		this.id = id;
	}
	public void setTitle(String title) {
		this.title = title;
	}	
}
BluRay.java:
Java:
package dto;

import javax.persistence.Entity;

@Entity
public class BluRay extends AbstractMedium {

	private String producer;

	public String getProducer() {
		return producer;
	}
	public void setProducer(String producer) {
		this.producer = producer;
	}
}
DVD.java:
Java:
package dto;

import javax.persistence.Entity;

@Entity
public class DVD extends AbstractMedium {

	private int bitrate;

	public int getBitrate() {
		return bitrate;
	}

	public void setBitrate(int bitrate) {
		this.bitrate = bitrate;
	}
	
}
Model:
Java:
package model;

import dto.DVD;

public class Model {

	public DVD getDvdById(int id){
		// Datenbankverbindung aufbauen, abfrage und return der DVD wenn gefunden
		// Beispiel return get(DVD.class, id);
		return null;
	}

        public void deleteDVD(DVD dvd){ ; //löschen}
        public void editDVD(DVD old, DVD new) { ; // ändern } 
        // ...
}
View.java:
Java:
package view;

import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class View extends JFrame implements Observer{
	
	private JPanel dvdPanel;
	private JPanel blurayPanel;
	private JTextField txtIdBlu, txtIdDvd, txtTitleBlu, txtTitleDvd, txtProducerBlu, txtBitrateDvd; 
	private JButton sucheDVD, sucheBlu;
	
	public View(){
		
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLayout(new FlowLayout());
		
		sucheBlu = new JButton("Suche");
		sucheDVD = new JButton("Suche");
		
		txtIdBlu = new JTextField(20);
		txtIdDvd = new JTextField(20);
		txtTitleBlu = new JTextField(20);
		txtTitleDvd = new JTextField(20);
		txtProducerBlu = new JTextField(20);
		txtBitrateDvd = new JTextField(20);
		
		dvdPanel = new JPanel();
		dvdPanel.setLayout(new FlowLayout());
		dvdPanel.add(new JLabel("ID: "));
		dvdPanel.add(txtIdDvd);
		dvdPanel.add(new JLabel("Title: "));
		dvdPanel.add(txtTitleDvd);
		dvdPanel.add(new JLabel("Bitrate: "));
		dvdPanel.add(txtBitrateDvd);
		dvdPanel.add(sucheDVD);
		
		
		blurayPanel = new JPanel();
		blurayPanel.setLayout(new FlowLayout());
		blurayPanel.add(new JLabel("ID: "));
		blurayPanel.add(txtIdBlu);
		blurayPanel.add(new JLabel("Title: "));
		blurayPanel.add(txtTitleBlu);
		blurayPanel.add(new JLabel("Bitrate: "));
		blurayPanel.add(txtProducerBlu);
		blurayPanel.add(sucheBlu);
		
		getContentPane().add(dvdPanel);
		getContentPane().add(blurayPanel);
		
		
		pack();
	}

	@Override
	public void update(Observable o, Object arg) {
		
	}
	
	public void addBluRaySucheListener(ActionListener a){
		sucheBlu.addActionListener(a);
	}
	
	public void addDVDSucheListener(ActionListener a){
		sucheDVD.addActionListener(a);
	}
	
	public String getDvdSuche(){
		// würde hier schon zu Int geparst werden oder im Controller?
		return sucheBlu.getText();
	}
	
}
 
M

maki

Gast
Was mich stutzig macht ist das Model, es fungiert bei mir lediglich als DAO Schicht. Ich weiß aber einfach nicht wie ich diese dort einbringen soll, oder ob es in diesem Beispiel alles der Controller machen würde?
Das ist ein Muster, nennt sich "Active Record" und ist verpöhnt in der Java Welt.

Was oft verwirrt wenn Leute sich mit MVC auseinandersetzen ist, dass MVC etc. nur Sinn macht wenn man Schichtentrennung hat, denn MVC lebt ausschliesslich in der GUI Schicht, nicht in der Busniesslogik und schon gar nicht in der Persistenzschicht.

D.h. der "Controller" in MVC ist ein "GUI Controller", kein "Business Controller", wenn man nun ein reines "GUI Model" hat, also ein Model dass nur für die GUI da ist und in das Domänenmodell "übersetzt" werden muss, nimmt man DTOs, viele nehmen heutezutage einfach nur die JPA Entities als Model für die Domäne und die GUI, dann braucht man keine DTOs.

Lass deinen GUI Controller nicht mit EntityManagern arbeiten bzw. direkt mit der Persitenzschicht kommunizieren, schreibe einen Service ("BusinessController") der dann die Daten holt, speichert, löscht.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Kommunikation mit Seriellen Schnittstellen + Integration einer lib Java Basics - Anfänger-Themen 1
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 9
D Klassen Klassen Kommunikation Java Basics - Anfänger-Themen 12
I Kommunikation "normaler PC" mit lokaler Software an "Cloud Service" und umgekehrt Java Basics - Anfänger-Themen 15
izoards Socket Kommunikation Java Basics - Anfänger-Themen 16
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 3
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
A Client-Server Kommunikation Java Basics - Anfänger-Themen 3
S JavaFX-Arduino Kommunikation mit LCD-Anzeige Java Basics - Anfänger-Themen 0
A Kommunikation zwischen nebenläufigen Threads Java Basics - Anfänger-Themen 4
F Klassen Kommunikation zwischen Klassen Java Basics - Anfänger-Themen 4
M Input/Output Kommunikation mit externen Geräten Java Basics - Anfänger-Themen 0
K Kommunikation von Java RMI und Webservices Java Basics - Anfänger-Themen 9
H Einfache Client/Server-Kommunikation Java Basics - Anfänger-Themen 16
E MVC: Kommunikation der Modellteile Java Basics - Anfänger-Themen 12
G Klassen Kommunikation zw. Klassen Java Basics - Anfänger-Themen 28
B Socket Kommunikation in beide Richtungen Java Basics - Anfänger-Themen 12
F Socket Kommunikation Java Basics - Anfänger-Themen 4
G Server-Client Kommunikation Java Basics - Anfänger-Themen 3
G Kommunikation zwischen zwei Klassen Java Basics - Anfänger-Themen 5
J Panel-übergreifende Kommunikation Java Basics - Anfänger-Themen 3
P Kommunikation zwischen zwei *.class Java Basics - Anfänger-Themen 3
J RxTx/RS232 Kommunikation (TwoWay) Java Basics - Anfänger-Themen 10
Z Tomcat Server Kommunikation zu Client Applet Java Basics - Anfänger-Themen 5
G Datenstruktur und die Kommunikation mit der GUI Java Basics - Anfänger-Themen 10
W Inter-Thread-Kommunikation Java Basics - Anfänger-Themen 3
M Kommunikation zwischen Klassen Java Basics - Anfänger-Themen 3
T Kommunikation zwischen Controller und GUI Java Basics - Anfänger-Themen 2
S Frage zur Kommunikation zwischen Objekten Java Basics - Anfänger-Themen 5
J Kommunikation zwischen zwei JAVA-Dateien Java Basics - Anfänger-Themen 8
T Kommunikation zw. 2 Javaprogrammen Aufr --> Verab. -> Java Basics - Anfänger-Themen 6
P Kommunikation mit Prozess Java Basics - Anfänger-Themen 3
H Kommunikation C++ <> Java Java Basics - Anfänger-Themen 4
A Kommunikation Java-Anwendung <-> Java-Applet Java Basics - Anfänger-Themen 24
V Kommunikation zwischen Klassen Java Basics - Anfänger-Themen 2
S Kommunikation zwischen Komponenten in einem JFrame Java Basics - Anfänger-Themen 10
D Thread und Process Kommunikation bei eigener Console Java Basics - Anfänger-Themen 2
P asynchrone Kommunikation Applet Servlet mit RMI möglich Java Basics - Anfänger-Themen 4
B Kommunikation zwischen Klasse und Listener Java Basics - Anfänger-Themen 2
F Kommunikation von 2 Klasse Java Basics - Anfänger-Themen 5
L Kommunikation zwischen mehreren Klassen Java Basics - Anfänger-Themen 2
B jtapi <-> tapi Kommunikation Java Basics - Anfänger-Themen 2
D Kommunikation zwischen zwei Java Anwendungen möglich? Java Basics - Anfänger-Themen 6
S Kommunikation zwsichen Klassen. Java Basics - Anfänger-Themen 9
D J/Direct oder JNI? .bzw. Kommunikation mit Windows-API. Java Basics - Anfänger-Themen 2
G Nochmal Problem mit Kommunikation zwischen Klassen Java Basics - Anfänger-Themen 3
G Kommunikation zwischen Klassen, aber bitte MVC Java Basics - Anfänger-Themen 12
G Kommunikation zwischen Applet und Java-Anwendung über TCP/IP Java Basics - Anfänger-Themen 3
M Kommunikation zwischen GUI und Event -Klasse Java Basics - Anfänger-Themen 3
M probleme in der kommunikation von klassen Java Basics - Anfänger-Themen 5
Q Kommunikation zwischen Frames Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben