HashMap mit Index und Methodenaurufe als Object.

riseX

Mitglied
Hallo,

ist wahrscheinlich nen Anfängerproblem ...

ihr könnt mir sicher helfen.

Ich habe verschiedene Actions die im Servlet ankommen. Je nach Action soll aus einer HashMap eine bestimmte zugehörige Methode aufgerufen werden.

Also ... ich habe als Key einen String der genau gleich mit der Action ist ...

Das Problem ist, das beim Initialisieren der HashMap noch nicht alle Parameter für die einzelnen Methodenaufrufe zur Verfügung stehen. Wenn ich zum Beispiel beim Initialisieren der Service-Klasse (die die HashMap und die einzelnen Methoden, die in der HashMap sind, enthält) am Anfang des Servlets die HashMap zusammenbastele ... dann führt er bereits alle Methoden aus und packt die Rückgabewerte in die HashMap ... das ist ja auch logisch ... aber ich möchte, dass die Methoden erst aufgerufen werden, wenn ich mit der Action den Key anspreche. Wisst ihr was ich meine? ... Sorry ... ich steh da irgendwie aufm Schlauch... hat da einer ne Idee?

Ich hatte es vorher so, dass ich mit else ifs die Action abgefragt habe ... so möchte ich das aber nicht wieder haben. auch keine case anweisung oder so ... dafür sinds einfach zu viele Actions.

Danke schonmal im vorraus

Gruß
vom riseX
 
also momentan hab ichs so gelöst, dass ich die methoden nicht mehr in eine hashmap packe sondern die Methode so aufrufe:

Code:
service.getClass().getMethod("GET"+action, null).invoke(service, null)

Also die Methodennamen setzen sichaus "GET"+actionname zusammen.
Service ist die Klasse, welche die Methoden enthält.

Ist das so richtig oder gibts da vielleicht noch ne elegantere Möglichkeit?

Gruß
vom riseX
 
Deine Variante ist die einfachste Möglichkeit. Wofür brauchst Du das eigentlich?

Normalerweise verwendet man Reflektion um beispielsweise unbekannte Klassen aus z.B. Konfigurationsdateien zu laden und entsprechende Methoden auszuführen.

Ich verwende Reflektion eigentlich höchstens so:
Code:
String configClassName = myPropMap.get("configClass");
String host = myPropMap.get("mailHost");
String port = myPropMap.get("mailPort");
// ...
Class c = Class.forName(configClassName);
Constructor co = c.getConstructor(new Class[]{String.class, String.class}); //NoSuchMethodException, wenn nicht vorhanden
Object o = co.newInstance(new String[]{host, port}); //wird dann auf den entsprechenden Typ gecastet

Einfacher geht's, wenn man den parameterlosen Konstruktor verwenden kann:
Code:
// ...
Class c = Class.forName(configClassName);
Object o = c.newInstance(); //wird dann auf den entsprechenden Typ gecastet
 
Also momentan sieht es so aus ...

Ich klicke in meiner JSP auf irgend nen Knopp ... oder editiere etwas ... oder ich benutze den PeriodicalExecutor oder sowas ... dann wird mittels Ajax nen Request an den "AjaxController" gestellt ... das ist mein Servlet ... das bekommt die action und die Params mit, welche ich für die Verarbeitung des Requests benötige.

Das läuft immer so ab ... egal was ich in der View mache ... erstellt ein XMLHTTPRequest Object und wird vom AjaxController abgefangen und es wird nach der Action geschaut. ...

diese Action übergebe ich dann an die ServiceKlasse welche alle Actions verarbeitet und die benötigten Objekte erstellt und mit dann nen Velocitytemplate zurückgibt... ich wollte halt in der Service-Klasse nicht ne case Anweisung oder nur elseif's machen ... also hatte ich die Idee mit der HashMap ... das funktionierte aber nicht so, wie ich wollte ... nun mache ich es mit dem Aufruf oben.

Beim erstellen der Service Klasse gebe ich den request mit ... da ich dann in der service-klasse einfacher an die Parameter komme ... allerdings werde ich das noch umstellen ...dass ich die Parameter dann direkt aus dem AjaxController dem Methodenaufruf übergebe.

Service verarbeitet die Geschichte ... ich bekomme ein Template zurück ... das wird zurückgegeben und schreib das mit Javascript in das div mit der id welche mir beim funktionsaufruf übergeben wurde ... und ich packs mit .innerHTML auf die Seite ...

ich habe am Anfang alles im Servlet gemacht ... aber irgendwie wollte ich ein wenig aufs MVC-Prinzip achten ... da hab ichs so umgeändert ...

wenn Du da verbesserungsvorschläge hast oder meinst da is was ganz schlecht gelöst, lass es mich wissen ... bin da für jeden Tipp dankbar.

Gruß
vom riseX
 
Zuletzt bearbeitet:
Bei
mit .innerHTML in die Seite schreiben
denke ich immer an benutzerspezifische Tags. Da Du aber die ganze Seite nur einmal anzeigen willst und dem User "vorgaukels", daß nichts im Hintergrund passiert (Ajax...), sind solche benutzerspezifische Tags warscheinlich eher nicht geeignet.

In meinen bisherigen Webanwendungen habe ich immer dem Dispatcher-Servlet die aufzurufende Action mitgegeben, so daß die spezielle Klasse (abgeleitet von einer Basisklasse) dann auch das passende Ergebnis lieferte (z.B. per Ajax POST-Request absetzen und Rückantwort in entsprechender Javascript-Methode parsen und javascripttechnisch reagieren.

So fein auch das Arbeiten mit Ajax ist, sollte man dennoch überdenken, wann man es einsetzt. Optimal finde ich das z.B. beim Prüfen korrekter Namen, die noch nicht in der DB vorhanden sein dürfen oder zum dynamischen Füllen von Auswahllisten. Defaultwerte hingegen lade ich stets sofort.
 
Zurück