Diese Webseite verwendet Cookies. Durch die Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Datenschutzinformationen

12.11.2015Dr. Stefan ReisnerSoftware Manufaktur

VaadinSpring und das Model-View-Presenter-Pattern

Ein interessanter Weg, um schnell Java-Web-Anwendungen zu realisieren, ist die Kombination aus Spring-Framework und Vaadin mit der VaadinSpring-Erweiterung.

Model-View-Presenter-Pattern

Das Model-View-Presenter-Pattern oder MVP hat sich bewährt, um die Business-Logik der Anwendung losgelöst vom UI unit-testen zu können. 

In der Theorie versteht man MVP leicht. Bei der praktischen Umsetzung des Patterns tauchen dann aber oft Fragezeichen auf. Wie baut man das Geflecht aus View-Implementierung, Presenter und Model praktisch auf? Da ist es lobenswert, dass uns Marko Grönroos an einem einfachen Taschenrechner-Beispiel ein MVP-Kochrezept für Vaadin an die Hand gibt. 

Dependency Injection

Allerdings passt dieses Kochrezept nicht so gut in den Kontext von Spring und VaadinSpring. Der Presenter benötigt in der Regel Referenzen auf Spring Data Repositories oder andere Backend-Services. Diese Referenzen sollten über Dependency Injection bereitgestellt werden.

In der View wäre es ebenfalls praktisch, wenn der Presenter einfach per @Autowiring bereitgestellt würde. Dazu muss die View selbst eine Spring-managed @Component sein. Das unterstützt VaadinSpring durch den SpringViewProvider, der @Components, die com.vaadin.navigator.View implementieren, automatisch dem Navigator bekannt macht.

Separation of Concerns

Meine ersten Versuche, das MVP-Pattern „the Spring way“ zu realisieren, waren frustrierend: Spring und VaadinSpring verweigerten die Kooperation wegen den zyklischen Abhängigkeiten zwischen Presenter und View-Implementierung. Den entscheidenden Tipp fand ich in Misko Heverys Blogartikel aus dem Jahr 2008 über zyklische Abhängigkeiten.

 Die Lösung besteht darin, die Zuständigkeiten zu trennen: der Presenter ist keine Spring-managed Bean, sondern wird vom View instanziiert. Sämtliche vom Presenter benötigten Bean-Referenzen sammeln wir in einer @Service-Klasse. Das Spring-Framework injiziert diesen Service in den View-Konstruktor, der damit nichts weiter tut als sie an den Konstruktor des Presenters weiterzugeben. Somit bleiben UI und Logik weiterhin sauber getrennt.

Code-Beispiel

Ein einfaches Code-Beispiel zur Veranschaulichung: eine Like-Funktion bestehend aus einem Like-Button und einer Anzeige der Anzahl der Likes. Jeder Like wird in einer Datenbank persistiert. Das View-Interface LikeView beschreibt die Methode displayLikeCount zum Darstellen der aktuellen Anzahl. LikeViewVn ist die Vaadin-Implementierung und außerdem eine @Component. Der LikePresenter stellt der View die Methode addLike zur Behandlung des Button-Klicks bereit. Diese Methode nutzt den zuvor per Konstruktor übergebenen LikeService, um Zugriff auf die Persistenzschicht zu erhalten. Zum Schluss präsentiert sie die aktuelle Anzahl von Likes, indem sie diese an die Methode LikeView.displayLikeCount übergibt.

Das Model-View-Presenter-Pattern wirft weitere Fragen auf, wenn man aus einfachen Views komplexere komponieren möchte. Dazu mehr in einem weiteren Blogbeitrag.

 
 

Begleiten Sie unseren Mitarbeiter Syngenius

Beiträge filtern

 

nach Kategorie

UnternehmenKarriereDigital PaymentDigitaler KundenzugangSoftware Manufaktur

nach Autor

Alexander LazarevićChristian RäderDirk MögenburgJörg SteinElmar BorgmeierMark SpiesslMichael AitaMichael MaleikaNicole KunzeDr. Stefan ReisnerTanja Everartz

nach Themen

Es sind Themen dabei, die Sie besonders interessieren?

Dann ist unser Infodienst was für Sie. Geben Sie einfach Ihre E-Mail-Adresse an und wählen Sie Ihre Themen aus. Wir benachrichtigen Sie, sobald es dazu etwas Neues gibt.

© SYNGENIO AG EXZELLENZ. BEGEISTERUNG. VERANTWORTUNG. INNOVATION.