É difícil encontrar atualmente uma aplicação web que não suporte Ajax. O Mentawai facilita bastante o uso de Ajax convertendo o output de qualquer action para JSON ou XML.
The Requisição Ajax do navegador:
$.getJSON('<mtw:contextPath />/Hello.hi.mtw', function(actionOutput) { alert(actionOutput.msg); });
NOTE: Estamos usando JQuery como o framework Ajax no client-side. Claro que você pode utilizar outro de sua preferência.
A action, como qualquer outra:
public class HelloAction extends BaseAction { public String hi() { output.setValue("msg", "Hello there!"); return SUCCESS; } }
Setando uma consequência Ajax com um JSON renderer:
@Override public void loadActions() { action("/Hello", HelloAction.class, "hi") .on(SUCCESS, ajax(new JsonRenderer())); }
NOTA: O conversor para JSON do Mentawai pode converter qualquer objeto para JSON logo fique a vontade para colocar o que você quiser no output da action. Isso inclui qualquer collection como List e Map.
Retornando listas como JSON:
public class HelloAction extends BaseAction { public String hi() { List<String> list = new LinkedList<String>(); list.add("Hello there!"); list.add("Hello again!"); output.setValue("msgs", list); return SUCCESS; } }
E no JSP:
$.getJSON('<mtw:contextPath />/Hello.hi.mtw', function(actionOutput) { $.each(actionOutput.msgs, function(i,msg) { alert('item ' + i + ': ' + msg); }); });
Fazendo a mesma action suportar requisições Ajax e não-Ajax:
public class HelloAction extends BaseAction { public String hi() { output.setValue("msg", "Hello there!"); if (isAjaxRequest()) return AJAX; // o método isAjaxRequest() é herdado de BaseAction return SUCCESS; } }
@Override public void loadActions() { action("/Hello", HelloAction.class, "hi") .on(AJAX, ajax(new JsonRenderer())) .on(SUCESS, fwd("/jsp/hello.jsp")); }
Usando um filtro global para fazer qualquer action suportar Ajax:
@Override public void loadFilters() { // qualque requisição Ajax vai fazer a action retornar o resultado AJAX filter(new AjaxFilter(AJAX)); // e com a consequencia global abaixo, o output da action será convertido e retornado como JSON on(AJAX, ajax(new JsonRenderer())); } }
DICA: Uma consequência configurada na action tem precedência sobre uma consequência global. Logo se você tiver uma action que deseja setar uma consequência diferente para o resultado AJAX, fique a vontade para fazer isso na ActionConfig da action.