Hallo zusammen,
ich stelle mir gerade im Moment die Frage, wie man am besten
- ohne Framework,
- die Controller gestaltet und
- den Aufruf des passenden Controllers zu einem Request realisieren könnte.
Meine Lösungsidee war ungefähr die:
- Alle Requests gehen an ein zentrales Servlet, das "Dispatcher"-Servlet.
- In einer HashMap mit <String,String> ordne ich jeweils einem "Action-Wort" (z.B. "invokeMeasurement") den Klassennamen einer Controllerklasse zu (z.B. "MeasurementInvoker").
- Alle Controllerklassen implementieren das Interface "AllgemeinerController", das die Methode verarbeiteRequest vorschreibt.
- In dem "Dispatcher"-Servlet empfange ich das Action-Wort - sagen wir mal als GET-Parameter.
- Das Dispatcher-Servlet führt allerhand Dinge aus, die für jeden Request durchgeführt werden müssen, egal, was für eine Action angefordert wird.
- In der HashMap wird dann nachgeschaut, welcher Klassenname zu dem Action-Wort gehört.
- Für den Request wird eine Instanz dieser Controller-Klasse erzeugt, nur auf Grundlage des Klassennamens als String.
- Da die Controller-Instanzen alle auf das Interface "AllgemeinerController" hören, wird beim frisch erzeugten Objekt (der Controllerklasse XY...) die Methode "verarbeiteRequest" aufgerufen.
Stellt sich die Frage:
Hat es überhaupt Sinn, für jeden Request eine Instanz des jeweiligen Controllers zu erzeugen? Oder reicht eine einzige Instanz für alle Requests (auch exakt gleichzeitige), solange nicht künstlich irgendwelche Threadsafety-kaputtmachenden Dinge gemacht werden (z.B. konkurrierender Zugriff auf Variablen im Klassen- oder Objekt-Scope).
Denn sonst könnte man ja auch statt der eingangs vorgeschlagenen HashMap<String,String> (ActionWort -> Klassenname) auch direkt machen HashMap<String,AllgemeinerController>, sodass jedem Actionwort eine Instanz eines Objekts zugeordnet wäre, das das Interface erfüllt. Diese Zuordnung könnte ja in einem static initializer des Dispatchers erfolgen. So würde die eine (ganz zu Beginn erzeugte) Instanz des Controllers aus der HashMap alle Requests handlen.
D.h. ganz kurz reduziert: Controllerklassenname als String in die HashMap oder gleich eine aufrufbare Instanz der spezifischen Controllerklasse? Was spricht für das eine, was für das andere?
Zum Sinn der Sache: Es geht mir jetzt gerade nicht darum, wie man das am effektivsten und zeitsparendsten in einem Echtprojekt löst (Da implementiert man natürlich nicht alles mühsam zu Fuß, das ist klar, Frameworks gibt es nicht bloß zum Spaß), sondern es ist heute eher die akademische Überlegung, wie MVC in "Java/Servlet-pur" am besten angenähert werden kann, ohne eine bestimmte Third-Party-Framework-Lösung heranzuziehen. D.h. es soll so allgemein gehalten sein wie möglich.
Es geht darum, das Konzept mal in Java-pur zu sehen und nicht es mit Fertigkomponenten möglichst komfortabel und schnell zu produzieren.
Die üblichen Beispiele dazu mit Plain-Servlet sind ja i.d.R. so primitiv (insb. kein zentraler Controller, über den erst mal alle Requests geleitet werden), dass sie sich gedanklich auf reale Probleme kaum übertragen lassen (ein Servlet, eine JSP-Seite als View zum Draufforwarden und eine JavaBean für die View-Daten oder so ungefähr). Klar, man kann für jedes Formular als POST-Datenempfänger ein eigenes Servlet als Controller implementieren, aber das wär ja ziemlich redundant und unübersichtlich, wenn gemeinsamer, gleicher Verarbeitungscode in x verschiedenen Servlets vorkäme.
Gruß und danke euch schon mal für alles Mit-Überlegen,
Hank Scorpio
PS: Achja, und ein schönes Wochenende an alle! ...und ein noch schöneres für alle, die Überlegungen beisteuern...
ich stelle mir gerade im Moment die Frage, wie man am besten
- ohne Framework,
- die Controller gestaltet und
- den Aufruf des passenden Controllers zu einem Request realisieren könnte.
Meine Lösungsidee war ungefähr die:
- Alle Requests gehen an ein zentrales Servlet, das "Dispatcher"-Servlet.
- In einer HashMap mit <String,String> ordne ich jeweils einem "Action-Wort" (z.B. "invokeMeasurement") den Klassennamen einer Controllerklasse zu (z.B. "MeasurementInvoker").
- Alle Controllerklassen implementieren das Interface "AllgemeinerController", das die Methode verarbeiteRequest vorschreibt.
- In dem "Dispatcher"-Servlet empfange ich das Action-Wort - sagen wir mal als GET-Parameter.
- Das Dispatcher-Servlet führt allerhand Dinge aus, die für jeden Request durchgeführt werden müssen, egal, was für eine Action angefordert wird.
- In der HashMap wird dann nachgeschaut, welcher Klassenname zu dem Action-Wort gehört.
- Für den Request wird eine Instanz dieser Controller-Klasse erzeugt, nur auf Grundlage des Klassennamens als String.
- Da die Controller-Instanzen alle auf das Interface "AllgemeinerController" hören, wird beim frisch erzeugten Objekt (der Controllerklasse XY...) die Methode "verarbeiteRequest" aufgerufen.
Stellt sich die Frage:
Hat es überhaupt Sinn, für jeden Request eine Instanz des jeweiligen Controllers zu erzeugen? Oder reicht eine einzige Instanz für alle Requests (auch exakt gleichzeitige), solange nicht künstlich irgendwelche Threadsafety-kaputtmachenden Dinge gemacht werden (z.B. konkurrierender Zugriff auf Variablen im Klassen- oder Objekt-Scope).
Denn sonst könnte man ja auch statt der eingangs vorgeschlagenen HashMap<String,String> (ActionWort -> Klassenname) auch direkt machen HashMap<String,AllgemeinerController>, sodass jedem Actionwort eine Instanz eines Objekts zugeordnet wäre, das das Interface erfüllt. Diese Zuordnung könnte ja in einem static initializer des Dispatchers erfolgen. So würde die eine (ganz zu Beginn erzeugte) Instanz des Controllers aus der HashMap alle Requests handlen.
D.h. ganz kurz reduziert: Controllerklassenname als String in die HashMap oder gleich eine aufrufbare Instanz der spezifischen Controllerklasse? Was spricht für das eine, was für das andere?
Zum Sinn der Sache: Es geht mir jetzt gerade nicht darum, wie man das am effektivsten und zeitsparendsten in einem Echtprojekt löst (Da implementiert man natürlich nicht alles mühsam zu Fuß, das ist klar, Frameworks gibt es nicht bloß zum Spaß), sondern es ist heute eher die akademische Überlegung, wie MVC in "Java/Servlet-pur" am besten angenähert werden kann, ohne eine bestimmte Third-Party-Framework-Lösung heranzuziehen. D.h. es soll so allgemein gehalten sein wie möglich.
Es geht darum, das Konzept mal in Java-pur zu sehen und nicht es mit Fertigkomponenten möglichst komfortabel und schnell zu produzieren.
Die üblichen Beispiele dazu mit Plain-Servlet sind ja i.d.R. so primitiv (insb. kein zentraler Controller, über den erst mal alle Requests geleitet werden), dass sie sich gedanklich auf reale Probleme kaum übertragen lassen (ein Servlet, eine JSP-Seite als View zum Draufforwarden und eine JavaBean für die View-Daten oder so ungefähr). Klar, man kann für jedes Formular als POST-Datenempfänger ein eigenes Servlet als Controller implementieren, aber das wär ja ziemlich redundant und unübersichtlich, wenn gemeinsamer, gleicher Verarbeitungscode in x verschiedenen Servlets vorkäme.
Gruß und danke euch schon mal für alles Mit-Überlegen,
Hank Scorpio
PS: Achja, und ein schönes Wochenende an alle! ...und ein noch schöneres für alle, die Überlegungen beisteuern...
Zuletzt bearbeitet: