2011-01-27 63 views
24

Estoy usando Spring MVC y necesito hacer una llamada asincrónica al servidor y actualizar solo una parte de la página.Cómo renderizar una vista usando AJAX en Spring MVC

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 devolución.

¿Hay alguna forma de devolver una Vista ya procesada?

Gracias de antemano.

Neuquino

Respuesta

15

Usted puede poner este pedazo de la página JSP en una separada y devolver una ModelAndView apuntando a él desde su método. No hay diferencia entre llamadas AJAX y no AJAX desde ese punto.

+0

Tengo el mismo requisito que OP, y esto suena prometedor pero no lo estoy siguiendo ... ¿podría elaborar o vincular a un tutorial que adopte este enfoque? – Bane

+0

Soy tonto. Después de jugar durante un minuto, hizo clic en lo que quería. :) Elaboraré un breve ejemplo aquí en un minuto una vez que tenga algo funcionando. – Bane

51

Esta respuesta es 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 cualquier persona que venga detrás de mí. ¡Los elogios van a él, sin embargo! :)


MyController.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 todo! Una cosa de belleza; hasta ahora, hacer AJAX en Spring ha sido un gran dolor ... analizar Big ResponseBody's, crear enormes conjuntos de HTML al concatenar cosas en JS ... ugh ... No puedo creer lo simple y sorprendente que es este enfoque - ¡y no estaba al tanto hasta ahora! :)

+1

¡Absolutamente genial! Con esto, básicamente podemos olvidarnos de js en absoluto, ya que el resultado final se procesa en html siempre que sea necesario, podemos sustituir divs con fragmentos necesarios de jsp y personalmente creo que jsp es mucho más fácil de mantener que el código jquery/js. Todo lo bueno es generalmente simple. – Aubergine

+1

Impresionante .... He estado sufriendo durante los últimos tres días por usar JS para escupir contenido HTML. Esta solución es asombrosa Gracias por la explicación. Ojalá pudiera votar esto más arriba. –

+5

Por lo tanto, la pregunta con sus respuestas debe estar realmente configurada como protegida. ;-) – Aubergine

Cuestiones relacionadas