Как вы обрабатываете запросы Ajax в Spring MVC?

весной MVC (я работаю с 3.0.2), два метода HTTP являются всегда (или в основном, как мне кажется) зарезервировано (т. е. сопоставляется с соответствующими обработчиками), которые GET и POST например

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

     return "admin_side/Temp";
}

вышеуказанный метод вызывается при выполнении запроса 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";
}

вышеуказанный метод вызывается при выполнении запроса POST. Предполагая, что контроллер Spring обозначен с помощью @RequestMapping(value="admin_side/Temp") аннотация.


теперь, что произойдет, если мне нужно использовать Ajax и мне нужно выполнить другую функциональность, чем предыдущие методы? Я не могу обрабатывать другой метод с помощью метода GET или метода POST, потому что уже сопоставлены обработчики (оба метода HTTP, GET и POST зарезервированы для обработки showForm() и onSubmit() методы соответственно).

для демонстрации я использовал method=RequestMethod.PUT подход С Ajax такие как

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

и это сработало, как задумано, но я чувствовал, что это должно не быть лучшим решением. Как вы обрабатываете Ajax-запросы весной MVC, если у вас есть такой сценарий (на самом деле, это кажется мне довольно обычным)? Должен ли я (всегда) использовать RequestMethod.PUT? (или какой лучший метод HTTP для Ajax весной?)

есть ли способ сопоставить более одного метода с тем же методом HTTP в том же контроллере (очевидный ответ должен быть нет)? Снова, какой подход вы используете, когда вам нужно работать с Ajax весной MVC? Надеюсь, вы понимаете, что я имею в виду! Мне довольно трудно выразить это, так как мой английский находится на самом начальном этапе.

3 ответов


нет такой вещи, как лучший метод для AJAX.

Что касается методов, которые вы должны использовать, это зависит от архитектурного стиля. Парадигма REST и ее наиболее распространенная практическая интерпретация ROA (ресурсоориентированная архитектура) делают определенные предположения относительно семантики HTTP-методов. Это все более популярный подход, и я думаю, что об этом стоит прочитать. Полное использование преимуществ отдыха, вероятно, потребует от вас переосмысления всего приложения дизайн, однако. Если вы решите сделать это таким образом, прочитайте REST, ROA и JAX-RS, стандарт Java для RESTful приложений. Свои внедрения можно интегрировать С весной.

кроме того, вы можете просто придерживаться GET и POST, как наиболее широко поддерживаемых методов. Что касается самой весны, разумным способом сделать это было бы предоставить отдельный боб (или, возможно, набор бобов), чтобы позаботиться о вашем API на основе AJAX. Не будет никакого метода"конфликт" Если вы держите URL-адреса разные.


Я думаю, что реальный вопрос заключается в:

Почему вы хотите, чтобы одна и та же комбинация URL/метода действовала по-разному в зависимости от того, как к ней обращаются?

кого волнует, если вы получаете доступ к нему, сделав запрос AJAX на интерфейсе? Если семантика вызова отличается,дайте ему другой URL-адрес. Шаблон URL можно указать непосредственно в методе, а не в классе, чтобы избежать дублирования функций из этого класса.


мы можем иметь несколько методов GET и POST в одном контроллере, нам нужно использовать атрибут value для этой цели

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;
}