# Best-Practice? Daten über Tier-Grenzen hinweg?



## SnooP (7. Feb 2007)

Moin... - ich hab hier eine Model-2 Anwendung - bzw. bin dabei eine zu entwerfen und bin gerade auf ein Problem gestoßen... bzw. ich weiß nicht genau, wie man das am Sinnvollsten löst.

Ich habe eine noch simulierte Datenbank, die ich über eine db-Layer Klasse ansprechen kann, die entsprechende Methoden bereitstellt über die ich die Daten aus der db ein- und auslesen kann und mir daraus meine eigene Objektstruktur erstelle (mein Modell mit dem ich dann auch arbeiten will). Das sind im Wesentlichen drei oder vier Klassen, die alle voneinander abhängig sind (ne Art Baumstruktur).

Jetzt gibt es ein Login für einen User, welchen ich über ein entsprechendes Business-Delegate löse... sprich ne login-Methode die ich vom Controller aus aufrufe. Das Ergebnis ist das Einloggen des Users im System und die Anzeige von Details (das Modell) für den User auf einer entsprechenden JSP. Diese Details entsprechen exakt den Feldern eines Objekts meines Modells - das Ding ist auch Bean-artig aufgebaut - hat aber noch zusätzliche Methoden.

Sollte ich jetzt für die Anzeige dieser Details eine weitere UserBean erstellen und dort die Informationen kopieren (klingt redundant aber gekappselter) oder kann ich das Objekt mit dem User direkt an die View zurückgeben... - allerdings könnte ich dort direkt auf Methoden des Modells zugreifen - ist auch mist!

Wie geht man also allgemein vor? Ich hab da auch von entsprechenden J2EE-Patterns gehört, dass man generell Beans für die anzuzeigenden Daten in der View erzeugt? Ist das korrekt?  Gibt es andere Möglichkeiten - wie kann man das noch lösen?

Edit: Ooooder - da ich ja Struts benutze, sollte ich einfach eine ActionForm für dieses Objekt erstellen und das Objekt per Konstruktor übergeben und die getter/setter an das Modell-Objekt delegieren? Dann hätte ich für die Anzeige die entsprechende ActionForm und für Datenänderungen geht das auch erst über die Form und dann erst zum Modell... klingt das gut?


----------



## KSG9|sebastian (7. Feb 2007)

Häufig wird es so gemacht dass deine Form dieselben Attribute hat wie dein Model. Über BeanUtils kannst du dann einfach die Werte vom Model in dein ViewObject kopieren.


```
//execute-Methode der Actionklasse

MyForm myForm = (MyForm)form;
Data model = getPersistenceService().getDataDAO.findById(1);
BeanUtils.copyProperties(model, myForm);

return mapping.findForward("user-details");
```

Eigentlich selbsterklärend, myForm = Strutsform = View, model = Model = Daten aus DB oder sonstwoher

Bei non-Struts-Anwendungen werden öffters auch Modelklassen doppelt erstellt und eben für die View noch etwas angepasst.
Noch eine Möglichkeit: Eine Modelklasse (aka ApplicationModel). Diese Klasse ist dein Model. Eine weitere Klasse InteractionModel welche im View benutzt wird. Diese Klasse hat eine Referenz auf ein eigentliches Model (=ApplicationModel).
So, dein Kontroller kennt das InteractionModel. Im Controller kannst du dann Model-View Bindings anlegen. In der View greifst du dann auf die Bindings zu, nicht direkt auf das ApplicationModel. Zum speichern u.s.w. wird nur das ApplicationModel übermittelt, auf keinen Fall das InteractionModel.

Oder du benutzt eben SDOs (Service Data Objects). In der View arbeitst du mit SDO's (simple Beans mit Attributen). Diese SDO's werden an die Services (Geschäftslogik) übermittelt. Im Middletier werden dann Modellklassen mit den SDOs befüllt und gespeichert. Rückgabe ist wieder ein SDO (gleicher Ansatz wie Möglichkeit 1).


----------



## SnooP (7. Feb 2007)

Genau SDO - des war's und so mach ich's auch grad... und das mit dem Kopieren der Werte hatte ich auch gerade gelesen  - danke jedenfalls, das bestätigt dann ja mein durchaus richtiges Gefühl


----------

