Architektur: GWT als Frontend, Server Spring-basiert

DarthShader

Erfahrenes Mitglied
Hallo,

ich würde gerne eine Applikation aufsetzen, die als Backend das Spring Framework verwendet, und als Frontend das Google Web Toolkit (GWT) - zu dieser Kombination habe ich eine eher grundsätzliche Frage zur Architektur.

Das GWT läuft ja clientseitig ab. Ich möchte, dass die GWT Anwendung via RPC (bzw. RMI) mit dem Server kommuniziert. Meine Server-Software (aufgebaut auf Spring) läuft parallel dazu, und zwar als eigene Anwendung, die auch für andere Zwecke da ist, also nicht exklusiv als Backend für die Webanwendung.

Was ich jetzt gedanklich nicht so recht zusammen bekomme ist, wie der Backend-Teil, der mit dem GWT kommuniziert, mit dem Rest des Servers zusammen läuft. Eigentlich ist meine Server-Anwendung ein eigenständiges Programm, das ohne Servlet-Container auskommt. Muss das Backend für GWT denn als Servlet z.B. in einem Tomcat laufen? Meine Vorstellung ist gerade, dass die GWT Anwendung über RPC/RMI direkt mit der Server-Anwendung kommuniziert ohne im Prinzip seine Anfragen an den Webserver zu stellen.

Ich habe dazu mal eine schematische Grafik erstellt (in der Grafik ist der Einsatz von Tomcat nicht nötig, wenn ich das so überhaupt richtig durchdacht habe):

http://www.the-cr.de/_temp/2009-05-11/GWT-spring-architektur.png

Ist das so ein guter Plan - oder sollte ich die Webserver/Tomcat und Spring-Server Geschichte zusammen sehen?

Ziel ist es im Prinzip, zu einer vorhandenen, fertigen Server-Anwendung (basierend auf Spring) eine Webanwendung zu erstellen, mit der man den Server konfigurieren kann.


Über Eure Gedanken dazu würde ich mich sehr freuen


Vielen Dank!
 
Hallo,

Das GWT läuft ja clientseitig ab. Ich möchte, dass die GWT Anwendung via RPC (bzw. RMI) mit dem Server kommuniziert. Meine Server-Software (aufgebaut auf Spring) läuft parallel dazu, und zwar als eigene Anwendung, die auch für andere Zwecke da ist, also nicht exklusiv als Backend für die Webanwendung.

Was ich jetzt gedanklich nicht so recht zusammen bekomme ist, wie der Backend-Teil, der mit dem GWT kommuniziert, mit dem Rest des Servers zusammen läuft. Eigentlich ist meine Server-Anwendung ein eigenständiges Programm, das ohne Servlet-Container auskommt. Muss das Backend für GWT denn als Servlet z.B. in einem Tomcat laufen? Meine Vorstellung ist gerade, dass die GWT Anwendung über RPC/RMI direkt mit der Server-Anwendung kommuniziert ohne im Prinzip seine Anfragen an den Webserver zu stellen.

Eine GWT Anwendung gliedert sich in der Regel in zwei Teile. Einen Browser-Teil (Client) und einen (optionalen) Service-Teil (Server).
Wenn du GWT RPC verwenden möchtest brauchst du einen ServletContainer, der deine Remote Services hosted (RemoteServiceServlet).
Das RemoteServiceServlet kannst du dann im selben Container laufen lassen wie dein restliches Backend System. Weiterhin kannst du
das GWT Remote Service Servlet auch via Spring konfigurieren und dort deine Services injizieren.

(Einfach ein generisches RemoteServiceServlet definieren und dort die init Methode entsprechend überschreiben: )
Java:
  @Override
  public void init(ServletConfig config) throws ServletException {
    super.init(config);
    WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(config.getServletContext());
    webApplicationContext.getAutowireCapableBeanFactory().configureBean(this,getClass().getSimpleName());
  }

Der Client-Teil (UI) wird von diesem Server geladen und dann im Browser (JavaScript) ausgeführt. Damit die Kommunikation über
GWT RPC (was im Prinzip HTTP-POST calls mit einem JSON ähnlichen proprieatären Textformat sind) reibungslos funktioniert
sollte man die GWT Remote Services in dem selben Servletcontainer laufen lassen wo auch der GWT Client Teil gehosted wird
um probleme mit der SOP (Same Orginin Policy) zu umgehen.

Über RMI kann du von einem GWT client nicht direkt kommunizieren ;-) Es sei denn du fügst der Host-Page noch ein Applet hinzu... aber wer
will das schon ;-)

Alles in allem Funktioniert das wunderbar (hier...) ;-)

Gruß Tom
 
Hallo Thomas,

vielen Dank für Deine ausführliche Antwort. Ich höre raus, dass ich auf dem richtigen Weg bin, und dass die Kombination GWT "vorne" und Spring "hinten" eine gute Sache ist.

Ich denke ich habe alles verstanden, bis auf die folgenden Punkte:

Das RemoteServiceServlet kannst du dann im selben Container laufen lassen wie dein restliches Backend System.

Wie gesagt, ist mein restliches Backend-System ja eine ganz "normale" Anwendung, die ich auf der Linux-Kiste einfach starte, also nicht in einem ServletContainer. Das Programm kommuniziert mit Clients über RMI.

Verstehe ich es richtig, dass ich diese (Spring-) Anwendung auch einfach in einem ServletContainer laufen lassen kann?

Weiterhin kannst du das GWT Remote Service Servlet auch via Spring konfigurieren und dort deine Services injizieren. (Einfach ein generisches RemoteServiceServlet definieren und dort die init Methode entsprechend überschreiben: )

Vielen Dank für den Beispielcode. Ich habe leider noch keine Web-Anwendung in einem Servlet Container erstellt - die Klasse "WebApplicationContext" stammt ja aus Spring - was ich hier nicht verstehe, ist die Verbindung zwischen GWT (RemoteServiceServlet) und Spring. Was genau tut denn der WebApplicationContext in Bezug auf das RemoteServiceServlet bzw. wozu brauche ich den WebApplicationContext? Entschuldige bitte die sicher schlecht formulierte Frage, aber die GWT Backend <-> Spring Verbindung ist für mich gerade noch ein schwarzes Loch.

Über eine (weitere) Antwort würde ich mich sehr freuen

Danke!
 
Hallo,

Verstehe ich es richtig, dass ich diese (Spring-) Anwendung auch einfach in einem ServletContainer laufen lassen kann?
Ja.

Vielen Dank für den Beispielcode. Ich habe leider noch keine Web-Anwendung in einem Servlet Container erstellt - die Klasse "WebApplicationContext" stammt ja aus Spring - was ich hier nicht verstehe, ist die Verbindung zwischen GWT (RemoteServiceServlet) und Spring. Was genau tut denn der WebApplicationContext in Bezug auf das RemoteServiceServlet bzw. wozu brauche ich den WebApplicationContext? Entschuldige bitte die sicher schlecht formulierte Frage, aber die GWT Backend <-> Spring Verbindung ist für mich gerade noch ein schwarzes Loch.

Wie gesagt, das RemoteServiceServlet ist quasi die Basis für die "Remote"-Services in denen du die Logik schreibst du dein GWT Client nachher vom Browser aus aufrufen soll. Diese Remote-Services können nun selbst wieder andere (interne) Services / Komponenten verwenden. Diese können dann von Spring bereit gestellt (= dem RemoteServiceServlet injeziert werden).

Edit:
Schau mal hier:
http://www.tutorials.de/forum/enter...ces-mit-spring-konfigurieren.html#post1759440

Gruß Tom
 
Hallo Thomas,

ich denke jetzt habe ich das Big-Picture erfasst, insofern ist meine Grafik da oben nicht ganz verkehrt, nur dass der Sever-Backend (Spring) dann auch im Servlet Container läuft.

Vielen Dank nochmal, auf für den Link, der ebenfalls sehr hilfreich ist. Mit diesen Informationen an der Hand glaube ich nicht, dass noch irgendwelche Architektur-Fragen offen sind.

Danke!
 

Neue Beiträge

Zurück