Estoy usando Spring MVC y necesito hacer una llamada asíncrona al servidor y actualizar solo una parte de la página.
Lo que realmente tengo es un controlador que devuelve una cadena. Llamo al Controlador usando la función JQuery ( .post() ).
El problema con mi solución es que no puedo representar un JSP como lo hago cuando uso ModelAndView como tipo de retorno.
¿Hay alguna forma de devolver una vista ya renderizada?
Gracias por adelantado.
Neuquino
Esta respuesta es solo para confirmar que la respuesta de axtavt funciona. Me tomó un minuto darme cuenta de lo que estaba sugiriendo, así que pensé en publicar un fragmento de código para ayudar a cualquiera que venga detrás de mí. Sin embargo, ¡felicitaciones para él! :)
MiControlador.java
@Controller public class MyController { @RequestMapping( method=RequestMethod.GET, value="/mainView" ) public ModelAndView getMainView( ... ) { /* do all your normal stuff here to build your primary NON-ajax view * in the same way you always do */ } /* this is the conroller's part of the magic; I'm just using a simple GET but you * could just as easily do a POST here, obviously */ @RequestMapping( method=RequestMethod.GET, value="/subView" ) public ModelAndView getSubView( Model model ) { model.addAttribute( "user", "Joe Dirt" ); model.addAttribute( "time", new Date() ); return new ModelAndView( "subView" ); } }
mainView.jsp
(...) <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script> <script type="text/javascript"> function doAjaxPost() { $.ajax({ type: "GET", url: "subView", success: function(response) { $("#subViewDiv").html( response ); } }); } </script> <input type="button" value="GO!" onclick="doAjaxPost();" /> <div id="subViewDiv"></div> (...)
subView.jsp
(...) <h3> User Access Details </h3> <p> ${user} accessed the system on ${time} </p> (...)
¡Y eso es! Una cosa de belleza; hasta ahora, hacer AJAX en Spring ha sido un gran dolor... analizar grandes @ResponseBody's, construir grandes conjuntos de HTML concatenando cosas en JS... ugh... No puedo creer lo simple e increíble que es este enfoque - ¡y no lo sabía hasta ahora! :)
Puede colocar esta parte de la página en un JSP separado y devolver un ModelAndView
que lo apunte desde su método. No hay diferencia entre las llamadas AJAX y no AJAX desde ese punto.