2012-05-12 12 views
5

Ho riscontrato un problema relativo all'utilizzo di AJAX con Spring MVC. Ho un modulo che contiene molti campi e ogni campo recupera i dati in base al pulsante associato su cui è stato fatto clic.Richiesta Ajax - Chiama il metodo diverso su Spring Controller

Quindi, ognuno dei miei pulsanti deve chiamare una richiesta AJAX. Ogni risposta verrà visualizzata sul campo associato.

Mi chiedo se è possibile chiamare un metodo diverso nel mio controller Spring dopo aver fatto clic su un pulsante diverso?

In altre parole, voglio fare più richieste Ajax allo stesso controller dove ogni richiesta chiamerà un metodo diverso nello stesso controller.

Vedi questo esempio:

// when get account detail is clicked it will call this method 
@RequestMapping(method=RequestMethod.POST) 
    public @ResponseBody String getAccountDetails(@RequestParam(value="accountid") String accountid){ 

    return somefunct.getAccountDetails(accountid); 

    } 



// when get account summary is clicked it will call this method 
@RequestMapping(method=RequestMethod.POST) 
    public @ResponseBody String getAccountSummary(@RequestParam(value="accountid") String accountid){ 

     return somefunct.getAccountSummary(accountid); 

    } 



/* when submit button is clicked... Form is submitted for saving*/ 
@RequestMapping(method=RequestMethod.POST) 
    public String submitForm(){ 
     // save here 
     return "myform"; 
    };*/ 

Attualmente, posso avere solo una richiesta AJAX. Come posso modificare questo codice in modo che possa avere funzionalità diverse per le diverse richieste AJAX?

risposta

8

Innanzitutto, considerare che quando si recuperano i dati da un server senza modificare lo stato di quel server, lo standard comunemente accettato è quello di utilizzare il metodo HTTP GET, non il POST. Pertanto, per i tuoi primi due metodi, stai utilizzando in modo improprio i metodi HTTP.

In secondo luogo, è possibile associare modelli di URL individuali a un metodo specifico utilizzando la proprietà value dell'annotazione RequestMapping.

In terzo luogo, il modo più riposante per rappresentare la risorsa dettagli dell'account è quello di utilizzare l'annotazione PathVariable e includere il tuo accountid individuando nel percorso attuale:

@RequestMapping(value="/account/{accountid}/details", method = RequestMethod.GET) 
public @ResponseBody String getAccountDetails(@PathVariable(value="accountid") String accountid){ 

return somefunct.getAccountDetails(accountid); 

} 

Avanti, è possibile rappresentare il riepilogo account utilizzando un diverso modello URL in cui l'URL è costruito come un albero, dove le prime due parti del percorso sono ancora una volta "account" e l'accountid:

// when get account summary is clicked it will call this method 
@RequestMapping(value="/account/{accountid}/summary", method=RequestMethod.GET) 
public @ResponseBody String getAccountSummary(@PathVariable(value="accountid") String accountid){ 

    return somefunct.getAccountSummary(accountid); 

} 

Ora, il vostro presentare metodo, d'altra parte, ha effetti collaterali . Questo è solo un modo elegante per dire che lo stato del tuo server sarà diverso alla fine di questa richiesta e qualsiasi richiesta GET fatta a quella risorsa sarà diversa da quella precedente. Il metodo HTTP appropriato da utilizzare quando si modifica una risorsa o si aggiunge una risorsa a una raccolta è il metodo POST HTTP. Quando si sostituisce una raccolta, il metodo HTTP PUT è il metodo di scelta generalmente accettato.

Un altro fattore di differenziazione tra PUT e POST è che PUT è idempotente, nel senso che la stessa richiesta ripetuta più e più volte non modifica lo stato sul server. Se si colpisce la stessa richiesta più volte si creano più record, quindi utilizzare POST.

Infine, questa richiesta può essere associata anche a un URL. Nell'esempio seguente, ho assunto che tu stia creando un nuovo record Account e inserendo un nuovo record nella raccolta di account nel database. Quindi, ho usato POST. Ho anche modificato l'elenco dei parametri da utilizzare PathVariable per prendere l'accountid dal sentiero URL, e ho aggiunto un'annotazione RequestBody in modo da poter inviare un oggetto nel corpo della richiesta, che potrebbe essere deserializzato in un oggetto Java:

/* when submit button is clicked... Form is submitted for saving*/ 
@RequestMapping(value="/account/{accountid}", method=RequestMethod.POST) 
    public String submitForm(@PathVariable String accountid, @RequestBody Account account){ 
     // save here 
     return "myform"; 
} 

Per ulteriori informazioni su Spring MVC, consultare lo Spring documentation on Spring MVC.

+2

Eeeek !!! Sono molto grato per quella risposta!è stato molto utile! Dio benedica la tua gentilezza! Grazie ancora!!! –

+0

Sono felice di poterti aiutare. In bocca al lupo! :) – jmort253

Problemi correlati