Как вы обрабатываете запросы 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;
}