2011-01-27 19 views
24

Sto utilizzando Spring MVC e devo effettuare una chiamata asincrona al server e aggiornare solo una parte della pagina.Come eseguire il rendering di una vista utilizzando AJAX in Spring MVC

Quello che effettivamente ho è un controller che restituisce una stringa. Chiaro il controller usando la funzione JQuery (.post()).

Il problema con la mia soluzione è che non sono in grado di eseguire il rendering di una JSP come faccio quando uso ModelAndView come tipo restituito.

C'è un modo per restituire una vista già visualizzata?

Grazie in anticipo.

Neuquino

risposta

15

Si può mettere questo pezzo di pagina in una JSP separata e restituire un ModelAndView che punta ad esso dal vostro metodo. Da quel punto non ci sono differenze tra le chiamate AJAX e non-AJAX.

+0

Ho lo stesso requisito di OP, e questo sembra promettente ma non sto seguendo abbastanza ... potresti elaborare o collegare a un tutorial che segua questo approccio? – Bane

+0

Sono stupido. Dopo aver giocato intorno per un minuto, ha fatto clic su quello che volevi. :) Farò un breve esempio qui in un minuto una volta che avrò qualcosa di funzionante. – Bane

51

Questa risposta è solo confermare che la risposta di axtavt funziona. Mi ci è voluto un minuto per rendermi conto di quello che stava suggerendo, quindi ho pensato di pubblicare un frammento di codice per aiutare qualcuno che veniva dietro di me. I Complimenti vanno da lui, però! :)


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> 

(...) 


E questo è tutto! Una cosa di bellezza; fino ad ora, fare AJAX in primavera è stato un grande dolore ... analizzare big @ ResponseBody, costruire enormi set di HTML concatenando cose in JS ... ugh ... Non posso credere quanto sia semplice e fantastico questo approccio è - e non ne ero a conoscenza fino ad ora! :)

+1

Assolutamente fantastico! Con questo, fondamentalmente possiamo dimenticare js, poiché il risultato finale è reso in html ogni volta che è necessario, possiamo semplicemente sostituire i div con i chunks richiesti da jsp e personalmente credo che jsp sia molto meglio mantenibile rispetto al codice jquery/js. Tutto fantastico è solitamente semplice. – Aubergine

+1

Impressionante .... Ho sofferto per gli ultimi tre giorni di utilizzo di JS per sputare contenuti HTML. Questa soluzione è fantastica. Grazie per la spiegazione. Vorrei poter votare questo più alto. –

+5

Quindi la domanda con le sue risposte deve essere realmente impostata come protetta. ;-) – Aubergine

Problemi correlati