2012-05-12 18 views
5

He estado teniendo un problema con el uso de AJAX con Spring MVC. Tengo un formulario que tiene muchos campos y cada campo recupera datos según el botón asociado al que se hizo clic.Solicitud de Ajax - Llamar a un método diferente en el controlador de primavera

Por lo tanto, cada uno de mis botones debe llamar a una solicitud de AJAX. Cada respuesta se mostrará en el campo asociado.

Me pregunto si es posible llamar a un método diferente en mi controlador Spring una vez que haga clic en un botón diferente?

En otras palabras, quiero hacer múltiples solicitudes de ajax al mismo controlador donde cada solicitud llamará a un método diferente en ese mismo controlador.

ver este ejemplo:

// 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"; 
    };*/ 

Actualmente, sólo puede tener una petición AJAX. ¿Cómo puedo modificar este código para poder tener diferentes funcionalidades para diferentes solicitudes AJAX?

Respuesta

8

En primer lugar, tenga en cuenta que cuando recupera datos de un servidor sin modificar el estado de ese servidor, el estándar comúnmente aceptado es utilizar el método HTTP GET, no POST. Por lo tanto, para sus primeros dos métodos, está haciendo un mal uso de los métodos HTTP.

En segundo lugar, puede asignar patrones de URL individuales a un método específico utilizando la propiedad de valor de la anotación RequestMapping.

En tercer lugar, la forma más REST para representar a su información de cuenta de recurso es utilizar la anotación PathVariable e incluya su accountid la identificación de la ruta real:

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

return somefunct.getAccountDetails(accountid); 

} 

A continuación, puede representar a su resumen de cuenta utilizando un diferente patrón de URL en la que la URL está construido como un árbol, donde las dos primeras partes de la ruta son una vez más "cuenta" y el 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); 

} 

Ahora, su método de envío, por el contrario, tiene efectos secundarios . Esta es solo una forma elegante de decir que el estado de su servidor será diferente al final de esta solicitud, y cualquier solicitud GET realizada a ese recurso será diferente de lo que era antes del cambio. El método HTTP apropiado para usar al modificar un recurso o agregar un recurso a una colección es el método HTTP POST. Al reemplazar una colección, HTTP Method PUT es el método de elección generalmente aceptado.

Otro factor diferenciador entre PUT y POST es que PUT es idempotente, lo que significa que la misma solicitud repetida una y otra vez no cambia el estado en el servidor. Si presionar la misma solicitud varias veces crea más registros, entonces use POST.

Por último, esta solicitud puede asignarse a una URL también. En el siguiente ejemplo, he asumido que está creando un nuevo registro de Cuenta e insertando un nuevo registro en la colección de cuentas en la base de datos. Por lo tanto, he usado POST. También modifiqué su lista de parámetros para usar PathVariable para tomar el accountid de la ruta URL, y agregué una anotación RequestBody para que pueda enviar un objeto en el cuerpo de la solicitud, que podría deserializarse en un objeto 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"; 
} 

Para obtener más información sobre Spring MVC, consulte el Spring documentation on Spring MVC.

+2

wow! Estoy muy agradecido por esa respuesta!¡eso fue muy útil! Dios bendiga tu bondad! ¡¡¡Gracias de nuevo!!! –

+0

Estoy feliz de poder ayudar. ¡Buena suerte! :) – jmort253

Cuestiones relacionadas