Подтвердить что ты не робот

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)

Странно, когда это произойдет, и я снова отправлю страницу, все будет хорошо после этого. Есть ли лучший способ достичь того, что я пытаюсь сделать?

Спасибо!

4b9b3361

Ответ 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"})