Sorgenti – https://github.com/alessandro-aglietti/Simple-JEE-Ajax-Dispatcher
Screencast on Vimeo!
jee ajax dispatcher from Alessandro Aglietti on Vimeo.
JEE AJAX Dispatcher with reflection on Google App Engine
Mi sono ritrovato davanti il seguente problema.
Avevo bisogno di gestire molte richieste AJAX, non volendo creare mille servlet e mille mappature sul web.xml mi sono spremuto.
Option one: unica servlet con if in cascata… X_X – non se ne parla
Option two: montare un framework MVC, tipo struts, grovvy, gayelk… etc.. Purtroppo per le mie app ancora sono troppo macchinosi, non convengono.
Option three: una servlet per ogni richiesta, ognuna da mappare nel file web.xml… Na!
Pensa che ti ripensa, cerca che ti ricerca… Sun ti aiuta! http://java.sun.com/developer/technicalArticles/ALT/Reflection/
Giusto, prechè non ci ho pensato prima, reflection! (Unico dubbio le prestazioni!)
Cosa mi serve…
Una servlet che in base ad un parametro, nel mio caso “action”, crea un oggetto adatto alla risposta e richiama un metodo per servire la risposta JSON.
Gli oggetti che elaborano la risposta devono avere un parente in comune altrimenti addio interfaccia comune.
Partiamo dal padre.
https://github.com/alessandro-aglietti/Simple-JEE-Ajax-Dispatcher/blob/master/src/it/aqquadro/AjaxRequest.java
Il costruttore ha un unico parametro, la request, in questo modo gli si può passare qualsiasi dato custom oltre a quelli della richiesta in atto utilizzando semplicemente:
req.setAttribute(“user”, “user@domain.ext”);
Per poi recuperarlo così:
Enumeration attributes = this.req.getAttributeNames();
while (attributes.hasMoreElements()) {
String object = (String) attributes.nextElement();
msg = object + ” – ” + this.req.getAttribute(object).toString();
printMessage(msg);
}
Ogni nostro oggetto che useremo per risolvere le chiamate dovrà estendere AjaxRequest.java.
Come ad esempio HelloWorld.java
https://github.com/alessandro-aglietti/Simple-JEE-Ajax-Dispatcher/blob/master/src/it/aqquadro/HelloWorld.java
Nella servlet che gestisce le richieste creiamo una mappa che lega un parametro a una classe:
https://github.com/alessandro-aglietti/Simple-JEE-Ajax-Dispatcher/blob/master/src/it/aqquadro/JEE_AJAX_DispatcherServlet.java
private static Map<String, Class> requestMapAction = setRequestMapAction();
private static Map<String, Class> setRequestMapAction() {
/*
* requestMapAction.put(“valoreParametroAction”, MyClass.class);
*/
if (requestMapAction == null) {
requestMapAction = new HashMap<String, Class>();
requestMapAction.put(“hw”, HelloWorld.class);
}
return requestMapAction;
}
Poi come dall’articolo su java.sun.com, possiamo recuperarci il costruttore, creare un istanza.
Poi possiamo fare un cast verso la classe padre e così richiamare il metodo di cui è stato fatto l’override, nel mio caso il metodo è “getJSON”, esso ritorna una stringa JSON che la mia servlet scrivere sulla risposta.
Fine!
Spero possa essere utile, anche se so di aver reinventato l’acqua calda. Ma putroppo mi serviva una cosa semplice ed elegante.
Share