2012-08-05 24 views
6

En Spring MVC (Estoy trabajando con 3.0.2), dos métodos HTTP son siempre (o sobre todo como parece a mí) reservada (es decir, asignada a los controladores apropiados) que son GET and POST como¿Cómo se manejan las solicitudes de Ajax en Spring MVC?

@RequestMapping(method=RequestMethod.GET) 
public String showForm(Map model) 
{ 
    //Usually retrieve data from the database when the page is loaded. 

    return "admin_side/Temp"; 
} 

El método anterior se invoca cuando se realiza una solicitud GET.


@RequestMapping(method=RequestMethod.POST) 
public String onSubmit(@ModelAttribute("tempBean") @Valid TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response) 
{ 
    //Perform some basic operations with the database like insert, update or delete when the form is submitted (by clicking a submit button or so). 

    return "admin_side/Temp"; 
} 

El método anterior se invoca cuando se realiza una solicitud POST. Suponiendo que el controlador de primavera está designado con la anotación @RequestMapping(value="admin_side/Temp").


Ahora, ¿qué ocurre si necesito usar Ajax y necesito realizar una funcionalidad diferente a la de los métodos anteriores? No puedo manejar otro método con el método GET ni con el método POST porque ya hay mapas asignados (ambos métodos HTTP, GET y POST están reservados para manejar los métodos showForm() y onSubmit(), respectivamente).

Por el bien de la demostración, he utilizado el enfoque method=RequestMethod.PUTcon el Ajax como

@RequestMapping(method=RequestMethod.PUT) 
public @ResponseBody String getStateList(@ModelAttribute("tempBean") @Valid TempBean tempBean, BindingResult error, HttpServletRequest request, HttpServletResponse response) 
{ 
    return "Message"; 
} 

y funcionó como se esperaba, pero me sentí que debería no ser la mejor solución. ¿Cómo manejas las solicitudes de Ajax en Spring MVC, si tienes ese escenario (en realidad, parece ser bastante habitual para mí)? ¿Debo (siempre) usar RequestMethod.PUT? (¿Cuál es el mejor método HTTP para Ajax en Spring?)

¿Hay alguna forma de asignar más de un método con el mismo método HTTP en el mismo controlador (una respuesta obvia debería ser no)? De nuevo, ¿qué enfoque utilizas cuando necesitas trabajar con Ajax en Spring MVC? Espero que sigas lo que quiero decir! Es bastante difícil para mí expresar que mi inglés está en la etapa inicial.

Respuesta

1

No existe el mejor método para AJAX.

En cuanto a los métodos que debe usar, depende del estilo arquitectónico. El paradigma REST y su interpretación práctica más común, ROA (Resource Oriented Architecture), hacen ciertas suposiciones en cuanto a la semántica de los métodos HTTP. Es un enfoque cada vez más popular y creo que vale la pena leerlo. Sin embargo, hacer un uso completo de los beneficios de REST probablemente requeriría que reconsideraras el diseño de toda la aplicación. Si decide hacerlo de esta manera, lea REST, ROA y JAX-RS, el estándar de Java para aplicaciones RESTful. Sus implementaciones se pueden integrar con Spring.

Como alternativa, puede seguir con GET y POST, como los métodos más compatibles. En cuanto a Spring, la forma razonable de hacerlo sería proporcionar un bean separado (o tal vez un conjunto de beans) para cuidar su API basada en AJAX. No habrá ningún método "conflicto" si mantiene las URL diferentes.

+0

Gracias! Lo hice usando una URL diferente. Ahora, necesito recuperar datos del controlador Spring usando Ajax (generalmente una 'List '). No lo sé ahora, pero Spring MVC 3.0.2 debería ser compatible con algún mecanismo como JSON. ¿Sabes sobre eso? Quiero decir, ¿tienes algunos enlaces, si usaste esas cosas en Spring MVC? Puede rechazar mi solicitud, ya que no es la pregunta original. Gracias. – Tiny

+0

@Tiny aquí hay un ejemplo usando la biblioteca de Jackson: http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/ – toniedzwiedz

2

Creo que la pregunta real es:

¿Por qué quiere la misma combinación de URL/método de actuar diferente dependiendo de cómo se accede?

¿A quién le importa si está accediendo a él haciendo una solicitud de AJAX en la interfaz? Si la semántica de la llamada es diferente, dele una URL diferente. Puede especificar el patrón de URL directamente en el método, en lugar de en la clase, para evitar tener que duplicar la funcionalidad de esa clase.

+0

¡Gracias! Lo hice usando una URL diferente. Ahora, necesito recuperar datos del controlador Spring usando Ajax (generalmente una 'List '). No lo sé ahora, pero Spring MVC 3.0.2 debería ser compatible con algún mecanismo como JSON. ¿Sabes sobre eso? Quiero decir, ¿tienes algunos enlaces, si usaste esas cosas en Spring MVC? Puede rechazar mi solicitud, ya que no es la pregunta original. Gracias. – Tiny

2

Podemos tener GET múltiples y métodos POST en un solo controlador, tenemos que utilizar el atributo de valor para este fin

Ex:

@RequestMapping(method=RequestMethod.GET, value = "/showForm") 
public ModelAndView showForm(){ 
} 

@RequestMapping(method=RequestMethod.GET, value = "/processAjaxRequest") 
public ModelAndView processAjax(){ 

ModelAndView modelAndView = new ModelAndView("page.jsp"); 
modelAndView.addObject("ajax_response", ajax_response); 
    return modelAndView; 
} 
+0

Gracias por su respuesta. – Tiny

Cuestiones relacionadas