Bestellungsverwaltung nach MVC-Standard

Vokabulator

Mitglied
Hallo!

Ich würde gerne, um die MVC-Denkweise zu lernen, ein kleines, rudimentäres Bestellungsverwaltungssystem programmieren, also GUI und Anbindung an DB, dann soll man eine Bestellung erfassen können, Produkte hinzufügen, Kunden verwalten und Rechnungen stellen und solche Dinge. Nix Großes, wenn das einfach ein bissen funzt, reichts.

Wie gestalte ich das nach MVC?

So wie ich es verstehe, wäre das Model die Klasse, die sich um die Verbindung zur Datenbank kümmert, also
- Datensätze lesen
- DB updaten
- Verbindung herstellen
- usw.

Der View wäre die grafische Oberfläche

Und der Controller verbindet view und model. D. h. ich würde im controller quasi die ganzen eventhändler handhaben, die dann die Datensätze auf der GUI anzeigen? D. h. ich lese einen Datensatz durch das Model, übergebe die Sachen an den Controller und der Controller übergibt es an den View? D. h. konkret, ich bekäme Datensätze aus der DB, die würde ich als Strings an den Controller übergeben und der Controller würde z. B. den Eventhandler zum updaten einer JTextArea beinhalten. Und umgekehrt zum Lesen der JTextArea.

Verstehe ich das so richtig?
 

JavaMeister

Gesperrter Benutzer
Implementiere das mal, was du da so "unkonkret" beschreibst, dann kann man drüber schauen.

Jegliche theorie zum MVC findest du im Wiki, Google. Eine million Beispiele. Und auch hier im Forum.
 

Bartertown

Mitglied
Ja das entspricht dem Datenbankprojekt des Java-Kurses denn ich gemacht habe.
Allerdings das MVC - Pattern kann hier nicht als Paradigma für die ganze Anwendung gelten.
Der View ist klar, das ist z.B. die Bestellverwaltung, der Controller ist z.B. ist der implementierte ActionListener, somit ist View und Controller sinnvollerweise gemixt.

Das Model stellt in einer Datenbankanwendung einfach eine Relation dar: Kunde , Bestellung , Person , Artikel... Die Rede ist hier auch von object relational mapping.
Bei einer Rich-Client Architektur hat jede Client-Anwendung ein DB-Management, bei einer Thin-Client ist der DB-Manager eine Server-Applikation.
Soweit ich das bisher begreife entspricht diese Datenbankverwaltung einem Command-Pattern.

Somit hättest du als View und Controller z.B.die JFrames, als Model die ganzen modellierten Datensätze und eine Klasse z.B. DB-Manager.
Aber der beschriebene Observer-Mechanismus mit dem updaten von Textfeldern denke ich ist bei so einer Anwendung nicht der Zweck, es geht eher um das updaten der (Datenbank)Modelle!
Um das MVC in reinster Form anzuwenden und zu verstehen wäre vielleicht ein kleines Grafikspiel geeigneter?
 

dzim

Top Contributor
Mit Modell bezeichnet man allgemein nur die Klassen zur "Datenhaltung". Also bei dir wäre das z.B. der Kunde. Die Anbindung an die DB wird IMHO meist über den Controller gesteuert, wobei die eigentliche DB-Anbindung hüfig über sog. DAOs zustande kommt (Data Access Object). Mir fällt es tatsächlich oft schwer View und Control zu trennen, wenn ich das UI per Code erstelle (SWT oder Swing), dagegen ist es mit JavaFX oder Android relativ einfach möglich, da die die GUI "deklarativ" erstellt wird - also in separaten Dateien im XML-Format.

Ausgehend von JavaFX (wie man hier im Forum lesen kann mein Favorit unter den Java-basierten Desktop-UI-Frameworks ;-) ), würde deine Struktur wäre also ungefähr so aussehen:

Datenzugriff:
package.dao.DAOInterface (wirklich ein Interface)
package.dao.JDBCDAOImpl (die JDBC-Implementierung des o.g. Interfaces)
[offen: Wie hole ich mir ein DAOInterface-Objekt. Alter Ansatz und von manchen verpönt wäre eine Factory. Alternativ via DI (Dependency Injection) á la Guice, Eclipse e4-DI, Spring-DI, ... Für den Anfang eines kleinen Projekts aber genügt immer noch IMHO eine Factory-Klasse (bitte googlen)]

Model:
package.model.Customer
package.model.Product
package.model.[...]

View:
package.ui.layout."Main.fxml"
package.ui.layout."Dialog.fxml"
package.ui.layout.[...] <-- so viele, wie du halt brauchst, ich würde versuchen auch hier eine Trennung nach Funktionalität vorzunehmen

Control:
package.ui.MainController
package.ui.DialogController
package.ui.[...] <-- pro View ein Controller

Bevor du loslegst, musst du dir also Gedanken machen, welche Daten du holen willst (Model) und woher (DAO-Implementierung) und wie du sie darstellen möchtest (View). Darüber hinaus muss natürlich auch das UI irgendwie auf die Eingaben eines Users reagieren - das Programm also mit Logik befüllt werden (Controller).

Klar soweit?
 

Vokabulator

Mitglied
Uh, okay, doch etwas komplizierter als ich dachte :D Aber gut, soll ja auch eine Herausforderung werden. Ich denke, ich werd mit Swing programmieren, einfach um da auch noch fitter zu werden.

Okay, ich denke, ich fange mal an und lass das Topic mal offen. Danke auf jeden Fall für eure Antworten!
 

dzim

Top Contributor
Nur damit ich wieder das sage, was ich (so ähnlich) immer im Fall einer Entscheidung auf Swing sage:
"Swing ist tot, SWT stirbt - nutzt JavaFX! Das ist für die hippen Kids! Alles andere ist Old-School..." :p

Wenn Herausforderung, dann richtig! :)

Grüsse,
Daniel
 

Vokabulator

Mitglied
SO, anbei mal , was ich bisher fabriziert habe. Vielleicht hat ja noch jemand Lust, sich das zu Gemüte zu führen und ausgiebigst zu bemängeln: Main großes Problem ist nämlich, dass ich niemanden kenne, der JAVA kann und deswegen nie Feedback erhalte.

Beispiel-Model (package models):
Java:
@Entity
public class Produkte {
	
	@Id
	private int ID;
	private String bezeichnung;
	private int anzahl;
	private String Beschreibung;
	private int Preis;
	
	public Produkte() {
		
	}
	
	public Produkte(int id, String bezeichnung, int anzahl, String beschreibung, int preis) {
		this.ID = id;
		this.bezeichnung = bezeichnung;
		this.anzahl = anzahl;
		this.Beschreibung = beschreibung;
		this.Preis = preis;
	}
	
	public int getID() {
		return ID;
	}
	public void setID(int iD) {
		ID = iD;
	}
	public String getBezeichnung() {
		return bezeichnung;
	}
	public void setBezeichnung(String bezeichnung) {
		this.bezeichnung = bezeichnung;
	}
	public int getAnzahl() {
		return anzahl;
	}
	public void setAnzahl(int anzahl) {
		this.anzahl = anzahl;
	}
	public String getBeschreibung() {
		return Beschreibung;
	}
	public void setBeschreibung(String beschreibung) {
		Beschreibung = beschreibung;
	}
	public int getPreis() {
		return Preis;
	}
	public void setPreis(int preis) {
		Preis = preis;
	}
}

Beispiel DAO (package model):

Java:
public class ProdukteDAO {
    
    public void createProdukte(Produkte p, Session s ) {
        Transaction trans = s.beginTransaction();
        s.saveOrUpdate(p);
        trans.commit();
        } 
}



View bisher (package view)

Java:
public class MainGUI {

	private JFrame frame;
	private JMenuBar menubar;
	private JMenu dateimenu;
	private JMenu optionsmenu;
	private JToolBar toolbar;
	private JButton button_rechnung;
	private JButton button_bestellung;
	private JButton button_statistik;
	private ImageIcon rechnung_icon;
	private ImageIcon bestellung_icon;
	private ImageIcon statistik_icon;
	private JPanel pane;
	
	public MainGUI() {
		createGUI();
	}
	
	private void createGUI()  {
		frame = new JFrame();
		frame.setSize(1200, 700);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		frame.setResizable(false);
		frame.setLayout(new BorderLayout());
		createMenuBar();
		createToolBar();
		createLeftMenu();
		frame.setVisible(true);
	}
	
	private void createMenuBar() {
		menubar = new JMenuBar();
		dateimenu = new JMenu("Datei");
		optionsmenu = new JMenu("Optionen");
		menubar.add(dateimenu);
		menubar.add(optionsmenu);
		frame.setJMenuBar(menubar);
	}
	
	private void createToolBar() {
		toolbar = new JToolBar();
		toolbar.setSize(1200,80);
		createToolbarButtons();
		frame.add(toolbar,BorderLayout.NORTH);
	}
	
	private void createToolbarButtons() {
		rechnung_icon = new ImageIcon("rechnung.jpg");
		bestellung_icon = new ImageIcon("bestellung.gif");
		statistik_icon = new ImageIcon("statistik.jpg");
		
		button_rechnung = new JButton(rechnung_icon);
		button_bestellung = new JButton(bestellung_icon);
		button_statistik = new JButton(statistik_icon);
		
		toolbar.add(button_bestellung);
		toolbar.add(button_rechnung);
		toolbar.add(button_statistik);
		}
	
	private void createLeftMenu() {
		pane = new JPanel();
		pane.setSize(400, 620);
		pane.setBackground(Color.BLUE);
		JButton button = new JButton("Hallo");
		button.setSize(400, 80);
		pane.add(button);
		frame.add(pane,BorderLayout.WEST);
	}
}

Controller (package controller)
Java:
public class MainController {

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {
				new MainGUI();
				Configuration configuration = new Configuration().configure();
				StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
						.applySettings(configuration.getProperties());
				SessionFactory factory = configuration
						.buildSessionFactory(builder.build());
				Session session = factory.openSession();
				Produkte produkte = new Produkte(1,"Decke",2,"Das ist eine Decke",20);
				ProdukteDAO produktedao = new ProdukteDAO();
				
				produktedao.createProdukte(produkte,session);
				
				session.close();
				factory.close();
			}
		});
	}
}
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Buttons und Shapes sehen ja nach Screengröße klein oder zu groß aus, jemand eine Idee, was man tun kann? AWT, Swing, JavaFX & SWT 1
W JEditorPane textausrichtung nach settext funktioniert nicht mehr AWT, Swing, JavaFX & SWT 11
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
H JavaFX Fenstergröße nach maximieren erkennen AWT, Swing, JavaFX & SWT 6
D Swing Komponenten nicht sichtbar nach Start AWT, Swing, JavaFX & SWT 12
T Elemente auf vorheriger Stage, nach Wechsel der Stage ansprechen AWT, Swing, JavaFX & SWT 32
berserkerdq2 Mein Rechteck hat 4 Seiten, ich soll je nach dem, welche Seite berührt wurde, etwas ausführen, wie prüfe ich das? AWT, Swing, JavaFX & SWT 12
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
K Textarea aktuallisiert sich nicht, nach Auswahl (Itemlistener) AWT, Swing, JavaFX & SWT 3
M Nach Export als Runnable Jar wird css nicht merh gefunden AWT, Swing, JavaFX & SWT 22
P kein Scrollen nach affinertransformation bei mouse dragged AWT, Swing, JavaFX & SWT 2
M Wieso verändert sich die Framerate nach erneutem Starten des AnimationTimer? AWT, Swing, JavaFX & SWT 18
T ListView nach Erweiterung Fehler in CellFactory AWT, Swing, JavaFX & SWT 8
N JavaFX Tableview nach Löschen von Element falscher Index AWT, Swing, JavaFX & SWT 4
B JavaFX TextInputDialog: Focus auf Eingabefeldinhalt setzen und nach OK Inhalt leeren AWT, Swing, JavaFX & SWT 5
VPChief Nach abspielen von Sound reagiert das Program nichtmehr AWT, Swing, JavaFX & SWT 9
VPChief Swing Eclipse: Nach Exportieren, Button funktioniert nicht mehr AWT, Swing, JavaFX & SWT 26
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
R Swing JTextField - Schriftgröße je nach Länge und Größe ändern AWT, Swing, JavaFX & SWT 0
F AWT awt KeyEvent - Zeichen direkt nach Eingabe löschen AWT, Swing, JavaFX & SWT 2
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
K JavaFX Element in HBOX nach rechts verschieben AWT, Swing, JavaFX & SWT 2
S JavaFX Slider freezt nach Benutzung AWT, Swing, JavaFX & SWT 3
M Swing GUI wird nach invokeLater() langsam AWT, Swing, JavaFX & SWT 19
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
T JavaFX Nach Zoomen wird an falscher Stelle gezeichnet AWT, Swing, JavaFX & SWT 0
S Ausgabe aktualisiert sich nur nach 2. Klick AWT, Swing, JavaFX & SWT 17
F JavaFX Zustand der CheckMenuItems behalten nach Programmneustart AWT, Swing, JavaFX & SWT 7
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
stroggi Swing Suche nach Kurveneditor (UI-Element) AWT, Swing, JavaFX & SWT 1
Neumi5694 java.awt.Window nach javafx.stage.Window AWT, Swing, JavaFX & SWT 1
L Swing Komponenten erst nach Resize sichtbar AWT, Swing, JavaFX & SWT 2
F Swing Frame nach vorne holen AWT, Swing, JavaFX & SWT 2
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
S Swing JButton verschwindet nach Compilieren AWT, Swing, JavaFX & SWT 8
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
robinab JavaFX TableView column resize nach setItems() AWT, Swing, JavaFX & SWT 0
MiMa Java, Maven Projekte nach JavaFX? AWT, Swing, JavaFX & SWT 3
S JavaFX Node soll auch nach Skalierung zentriert platziert sein AWT, Swing, JavaFX & SWT 3
J Suche nach einer horizontal aufklappbaren Toolbar AWT, Swing, JavaFX & SWT 1
Bluedaishi JTextArea gefundene Zeile nach Oben Scrollen AWT, Swing, JavaFX & SWT 13
MiMa Java Projekt nach JavaFX convertieren AWT, Swing, JavaFX & SWT 4
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
U JavaFX Wechsel der Scene nach betätigen eines Button AWT, Swing, JavaFX & SWT 2
L JTextField erscheint erst nach Veränderung der Framegröße AWT, Swing, JavaFX & SWT 5
C Nach Aufruf von anderer Klasse streikt Grafik AWT, Swing, JavaFX & SWT 1
F AWT Robot Klasse Screenshot nach Pixelmustern in bestimmten Radius um Bildschirmmittelpunkt absuchen AWT, Swing, JavaFX & SWT 13
H Musik wird nach dem erstellen der .jar Datei nicht mehr abgespielt AWT, Swing, JavaFX & SWT 1
D iText PDF wird nach Neustart nicht importiert AWT, Swing, JavaFX & SWT 0
J Java FX Koordinaten NACH Animation setzen, wie? AWT, Swing, JavaFX & SWT 9
A Nach klick auf Button neuen Inhalt im gleichen Fenster AWT, Swing, JavaFX & SWT 3
Pr0m3theus Animation nach Event AWT, Swing, JavaFX & SWT 6
N Swing Abfrage durch JTextField nach Button betätigung AWT, Swing, JavaFX & SWT 3
S JTextArea Text nach oben wandern lassen AWT, Swing, JavaFX & SWT 7
Thallius JScrollPane Scrollpos setzen nach Neuzeichnen AWT, Swing, JavaFX & SWT 3
C JavaFX mehrere Kreise nach Eingabeprozess ausgeben AWT, Swing, JavaFX & SWT 2
J 2D-Grafik Linie wird nach Mausklick nicht am richtigen Ort gezeichnet AWT, Swing, JavaFX & SWT 11
C Memory Karten nach Paar offen bleiben sonst wieder umdrehen AWT, Swing, JavaFX & SWT 1
C Benutzername in GUI eingeben und nach Spiel neues Fenster Benutzername wieder anzeigen AWT, Swing, JavaFX & SWT 1
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
L JavaFX Java FX Anwendung nach MVC mit Observer Pattern AWT, Swing, JavaFX & SWT 15
M JavaFX Methode nach initialize() aufrufen AWT, Swing, JavaFX & SWT 6
MrSnake Tabelle nach 2 Strings Filtern AWT, Swing, JavaFX & SWT 3
N Swing JFormattedTextField keine Werte nach Formatzuweisung AWT, Swing, JavaFX & SWT 0
T Swing Tabelle mit Button - Anzeigefehler nach Zeile entfernen AWT, Swing, JavaFX & SWT 1
R LookAndFeel Wie kann man die Textfarbe der Nimbus ProgressBar nach Füllstand ändern? AWT, Swing, JavaFX & SWT 2
KilledByCheese Swing Seltsame Ausgabe nach ButtonClick AWT, Swing, JavaFX & SWT 1
thobren JavaFX textarea nach setPrefRowCount Ansicht aktualisieren AWT, Swing, JavaFX & SWT 1
L Graphik nach 100 ms neu laden AWT, Swing, JavaFX & SWT 1
B Doppelte MenuBar -> Nach Minimieren verschwunden AWT, Swing, JavaFX & SWT 3
W JComboBox auffristen nach Listenänderung AWT, Swing, JavaFX & SWT 20
T JavaFX Editable Combobox Text-Selektierung nach Trigger AWT, Swing, JavaFX & SWT 4
A JFace/SWT: ListViewer Inhalt nach Selection in zweitem List Viewer aktualisieren! AWT, Swing, JavaFX & SWT 5
E JMenu erscheint nach RDP-Verbindung auf falschem Desktop AWT, Swing, JavaFX & SWT 1
B Resize von Image nach Resize von Button AWT, Swing, JavaFX & SWT 1
M Swing PDF Datei nach drucken nicht löschbar AWT, Swing, JavaFX & SWT 6
M JavaFX TableView nach Spalte sortieren AWT, Swing, JavaFX & SWT 1
F 2D-Grafik Grafikproblem nach Aufruf von JColorChooser-Dialog AWT, Swing, JavaFX & SWT 6
J JTable filtern nach einer Spalte AWT, Swing, JavaFX & SWT 2
J 2D-Grafik Windows Blue-Screen nach anzeigen eines Bildes in Java AWT, Swing, JavaFX & SWT 10
P Anwendung kommt nach minimieren nicht mehr in den Vordergrund AWT, Swing, JavaFX & SWT 5
1 JButton nach Klick ausblenden AWT, Swing, JavaFX & SWT 6
K Swing JPanel nach oben und links vergrößern AWT, Swing, JavaFX & SWT 3
Z Plot nach links verschieben!! AWT, Swing, JavaFX & SWT 1
J Swing: JFrame nach oben "aufklappen" AWT, Swing, JavaFX & SWT 0
X JFrame erst nach dem Laden sichtbar stellen AWT, Swing, JavaFX & SWT 8
G .jar startet nicht nach Exportierung AWT, Swing, JavaFX & SWT 7
P Swing JTable flimmert nach Zellsortierung AWT, Swing, JavaFX & SWT 3
S JComboBox nach auswahl erneuern AWT, Swing, JavaFX & SWT 4
Thallius Swing Tabelle nach Datumsspalte sortieren AWT, Swing, JavaFX & SWT 4
C JTextPane scrollt mit setText() immer nach oben AWT, Swing, JavaFX & SWT 2
D Swing Bestimmte Berechnung von Spalten durchführen und dann die Zeilen nach bestimmten Kriterien einfärben AWT, Swing, JavaFX & SWT 5
A JPanel wird nach Buttonklick nicht angezeigt AWT, Swing, JavaFX & SWT 2
P Swing JTable keine Markierung nach Button klick AWT, Swing, JavaFX & SWT 0
S JTable nach aktualisierung - neue Zeile nicht "klickbar" AWT, Swing, JavaFX & SWT 0
K Swing Selectedrows falsch nach Sortieren AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen


Oben