2011-01-27 14 views
24

Używam Spring MVC i muszę wykonać asynchroniczne wywołanie na serwerze i odświeżyć tylko kawałek strony.Jak renderować widok przy użyciu AJAX wiosną MVC

To, co aktualnie mam, to kontroler, który zwraca ciąg. Wywołuję kontroler za pomocą funkcji JQuery (.post()).

Problem z moim rozwiązaniem polega na tym, że nie mogę renderować stron JSP tak jak robię, gdy używam ModelAndView jako typu zwracanego.

Czy istnieje sposób zwrócenia widoku już renderowane?

Z góry dziękuję.

Neuquino

Odpowiedz

15

Możesz umieścić ten kawałek strony do osobnego JSP i zwracają ModelAndView wskazując na niego ze swojej metody. Nie ma różnicy między połączeniami AJAX i nie-AJAX z tego punktu.

+0

Mam taki sam wymóg jak OP, a to brzmi obiecująco, ale nie całkiem podążam ... czy mógłbyś rozwinąć, lub link do samouczka, który przyjmuje takie podejście? – Bane

+0

Jestem głupi. Po chwili gry kliknął, co chciałeś. :) Podam krótki przykład tutaj za minutę, gdy tylko coś zadziała. – Bane

51

Ta odpowiedź jest po prostu potwierdzić, że odpowiedź przez axtavt działa. Zajęło mi chwilę, zanim zdałem sobie sprawę z tego, co sugerował, więc pomyślałem, że opublikuję fragment kodu, by pomóc każdemu, kto będzie za mną. Ale Kudos do niego! :)


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> 

(...) 


I to jest to! Rzecz piękna; do tej pory robienie AJAX na wiosnę było ogromnym bólem ... parsowanie wielkich @ ResponseBody, budowanie ogromnych zestawów HTML przez łączenie rzeczy w JS ... ugh ... Nie mogę uwierzyć, jak proste i niesamowite jest to podejście - i nie wiedział o tym aż do teraz! :)

+1

Absolutnie świetnie! Dzięki temu możemy w zasadzie zapomnieć o js, ​​ponieważ wynik końcowy renderowany jest w html, ilekroć jest to wymagane, możemy po prostu zastąpić div z wymaganymi fragmentami z jsp i osobiście uważam, że jsp jest znacznie łatwiejszy w utrzymaniu niż kod jquery/js. Wszystko, co wspaniałe, jest zazwyczaj proste. – Aubergine

+1

Niesamowite .... Przez ostatnie trzy dni przeżywałem ból nad używaniem JS do wypluwania treści HTML. To rozwiązanie jest niesamowite. Dziękuję za wyjaśnienie. Chciałbym móc głosować na to wyżej. –

+5

Tak więc pytanie z odpowiedziami musi być naprawdę ustawione jako chronione. ;-) – Aubergine

Powiązane problemy