2012-01-21 2 views
35

Я пытаюсь отправить 2 сообщения для отправки в форму, причем каждое действие кнопки отображается на разные контроллеры. Вот мои отображения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" /> 

Как вы можете видеть из моего отображения, я полагаться на использование Params различать, что кнопка была нажата на. Проблема заключается в том, что он работает на 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

не уверен, если это ваша проблема, но имейте в виду, что некоторые браузеры обыкновение посылать ключ/значение пары любых кнопок, если пользователь отправляет форму с помощью клавиши ввода или некоторых других методов, кроме нажатия кнопки. Поэтому убедитесь, что вы принимаете действие по умолчанию, которое для совместимости браузера должно быть действием первой кнопки * в источнике HTML этой формы. – goat

ответ

6

Просто создать один контроллер с методом, подобный этому

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

} 
32

Почему не:

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

} 
+7

Кажется немного опасным, поскольку атрибут 'value' в теге' input' содержит текст кнопки. Я думаю, что i18n не будет вашим другом с этим методом. –

+0

У меня были проблемы с IE (10), не проводя значения последовательно, и принял ваш подход. Хотя и не ультра-чистый, он работал для меня. Приветствия. –

34

если форма указал эти кнопки:

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

, что запрос отображение делает сканирование запроса поста, если он содержит имя Params = отменить.

кнопки для сохранения,

@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. 
} 
9

Если у Вас есть несколько методов контроллера с тем же @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

1

еще одно решение:

@RequestMapping(value="/save", method={RequestMethod.POST}, params={"save=Save"}) 
@RequestMapping(value="/save", method={RequestMethod.POST}, params={"renew=Renew"}) 
Смежные вопросы