Hi Kumaro,
ja der Code ist auch etwas komplizierter, wusste Anfangs auch nicht so genau, was das macht
Aber im Grunde genommen ist es ja nicht viel:
Ich weiß nicht, ob du schon mal Methoden mit generischem Rückgabetyp programmiert hast. Das sieht dann nämlich genau so aus, wie bei der getResponse() Methode. Normalerweise hat man allerdings keine statischen Methoden, die generisch sind. Das schaut dann ungefähr so aus:
Java:
public <T extends Object> T testMethode(Class<T> type)
{
...
}
Was sagt das nun aus? Eigentlich ist es ganz einfach: Der verwendete generische Typ ist <T extends Object> und kann daher alles sein, da ja alles von Object erbt. Der Rückgabetyp der Methode ist T, also genau der generische Typ. Und über den Parameter legst du fest, welcher Typ das ist. Bei Klassen mit generischen Typ (so wie z.B. List / ArrayList) ist der Typ dabei übergreifend in der Klasse deklariert. Bei der Methode gilt er eben auch nur da.
Ein Aufruf bei dem du einen Integer als Rückgabe erwartest sieht dann in etwa so aus:
Java:
int result = testMethode(Integer.class);
Bei der getResponse() Methode fehlt nun aber der Type-Parameter! Dafür haben wir eine andere Besonderheit: Die Methode ist statisch. Damit ist der Rückgabetyp immer die Klasse, von der aus du die Methode aufrufst (wie oben schon beschrieben, ich poste es hier nochmal):
- MessageResponse.getResponse(hier-json-string-einfügen) -> gibt eine MessageResponse zurück.
- TestResponse.getResponse(hier-json-string-einfügen) -> gibt eine TestResponse zurück
- BlablaResonse.getResponse(...) -> ...
Soviel zum Methodenkopf. Nun zum Rest (ist ja nur noch eine Zeile JavaScript
).
Der Code den wir uns nun ansehen müssen:
Javascript:
return eval ('(' + json + ')');
Erstmal ein Wort zu dem nativen Aufruf von Methoden über JSNI (JavaScript Native Interface) - denn nichts anderes machen wir hier:
Die Parameter die du aus der Java-Welt übergibst sind auch in der JavaScript-Welt unter gleichem Namen verfügbar. Es gibt ein paar Einschränkungen, was für Typen du genau übergeben kannst. Näheres dazu findest du hier:
http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html#sharing.
Für uns ist nur wichtig: Der Parameter 'json' heißt auch in JavaScript 'json' und beinhaltet unseren JSON-String. Der Aufruf der eval() Methode ist das nächste:
Jeder Browser kann nativ JavaScript Objekte aus JSON-Strings erstellen. Und zwar genau mit dieser Methode. Also erzeugt uns ein Aufruf von eval() eben unser gewünschtes JavaScript-Objekt. Warum da um den String die Klammern sein müssen weiß ich nicht, aber ich hab auch nur auf google lange gesucht, wie man sowas macht und anscheinend geht es manchmal nicht ohne diese Klammern...ich hatte jedenfalls so mit den Klammern in Google Chrome, Firefox und IE noch nie Probleme
Das erstellte JavaScript Objekt geben wir mit return wieder in unsere Java-Welt zurück. Dort können wir mit weiteren nativen Methoden (wie z.B. deine getContent()) auf die Werte zugreifen, die im eigentlichen Objekt gespeichert sind. Zur Laufzeit ist dass dann natürlich alles JavaScript, der GWT-Compiler macht ja aus deinem Java Code nichts anderes. Aber programmieren musst du es eben so
Ich hoffe das war verständlich, bei Rückfragen, einfach hier rein posten
Gruß
Daniel