Spring MVC - кнопка отправки в форму
Я пытаюсь отправить две кнопки отправки в форму, причем каждое действие кнопки отображается на разные контроллеры. Вот мои сопоставления
@RequestMapping(value="/save", method=RequestMethod.POST, params="save")
@RequestMapping(value="/save", method=RequestMethod.POST, params="renew")
И мои кнопки отправки выглядят так:
<input type="submit" name="save" class="button" value="Save" />
<input type="submit" name="renew" class="button" value="Renew" />
Как вы можете видеть из моего сопоставления, я полагаюсь на использование параметров, чтобы различать, на какую кнопку нажали. Проблема в том, что она работает 90% времени, но иногда я получаю исключение ниже -
java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path 'http://localhost:8090/myapp/save': {public java.lang.String com.myapp.SaveController.save(MyEntity,javax.servlet.http.HttpSession), public java.lang.String com.myapp.SaveController.saveAndRenew(MyEntity,javax.servlet.http.HttpSession)}
org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:248)
org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:194)
Странно, когда это произойдет, и я снова отправлю страницу, все будет хорошо после этого. Есть ли лучший способ достичь того, что я пытаюсь сделать?
Спасибо!
Ответы
Ответ 1
если форма имеет указанные кнопки:
input type="submit" class="button" name="save" value="Save"
input type="submit" class="button" name="delete" value="Delete"
input type="submit" class="button" name="cancel" value="Cancel"
вы можете направить на другой запрос URL в соответствии с нажатой кнопкой с одним контроллером.
для кнопки отмены,
@RequestMapping(params = "cancel", method = RequestMethod.POST)
public String cancelUpdateUser(HttpServletRequest request) {
return "redirect:/users.html";
}
что такое сопоставление запросов, это сканировать post-запрос, если он содержит params name = cancel.
для кнопки сохранения,
@RequestMapping(params = "save", method = RequestMethod.POST)
public String saveUser(HttpServletRequest request, @ModelAttribute User user, BindingResult result, SessionStatus status) {
// validate your result
// if no errors, save it and redirect to successView.
}
Ответ 2
Почему бы и нет:
<input type="submit" name="action" value="save" />
а затем:
@RequestMapping(value="/save", method=RequestMethod.POST)
public String handlePost(@RequestParam String action){
if( action.equals("save") ){
//handle save
}
else if( action.equals("renew") ){
//handle renew
}
}
Ответ 3
Если у вас больше методов контроллера с тем же @RequestMapping
, который отличается только атрибутом params
, вы должны явно написать:
- какой параметр должен присутствовать в запросе, например.
params="save"
- какой параметр НЕ должен присутствовать в запросе, например.
params="!save"
В вашем случае:
@RequestMapping(value="/save", method=RequestMethod.POST, params={"save", "!renew"})
@RequestMapping(value="/save", method=RequestMethod.POST, params={"renew", "!save"})
Это должно исправить ошибку Методы нечеткого обработчика, сопоставленные для HTTP-пути...
См. Spring Web API 4.0.x - RequestMapping # params
Ответ 4
Просто создайте один контроллер с помощью метода, аналогичного этому
@RequestMapping(value="/save", method=RequestMethod.POST)
public String handlePost(@RequestParam(required=false , value = "save") String saveFlag , @RequestParam(required=false , value = "renew") String renewFlag){
if(saveFlag != null{
//handle save
}
else if(renewFlag !=null{
//handle renew
}
}
Ответ 5
Еще одно решение:
@RequestMapping(value="/save", method={RequestMethod.POST}, params={"save=Save"})
@RequestMapping(value="/save", method={RequestMethod.POST}, params={"renew=Renew"})