Spring MVC – 向表单提交多个button

我试图有2个提交button发布到窗体,每个button操作映射到不同的控制器。 这是我的映射

@RequestMapping(value="/save", method=RequestMethod.POST, params="save") @RequestMapping(value="/save", method=RequestMethod.POST, params="renew") 

我的提交button看起来像这些 –

 <input type="submit" name="save" class="button" value="Save" /> <input type="submit" name="renew" class="button" value="Renew" /> 

正如你可以从我的映射中看到的,我依靠使用params来区分哪个button被点击。 问题是,它的工作时间有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) 

奇怪的是,当发生这种情况,我重新提交页面,事后一切正常。 有没有更好的方法来实现我想要做的?

谢谢!

如果表单具有这些button指定:

 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" 

您可以根据按下一个控制器的button来指导不同的url请求。

对于取消button,

 @RequestMapping(params = "cancel", method = RequestMethod.POST) public String cancelUpdateUser(HttpServletRequest request) { return "redirect:/users.html"; } 

如果请求映射包含参数name = cancel,则扫描post请求。

为了保存button,

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

为什么不:

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

如果你有更多的控制器方法具有相同的@RequestMapping ,只有params属性不同,你必须明确地写:

  • 哪个参数应该存在于请求中,例如params="save"
  • 哪个参数不应该出现在请求中,例如params="!save"

在你的情况下:

 @RequestMapping(value="/save", method=RequestMethod.POST, params={"save", "!renew"}) @RequestMapping(value="/save", method=RequestMethod.POST, params={"renew", "!save"}) 

这应该修复错误模糊处理程序方法映射为HTTPpath…

请参阅Spring Web API 4.0.x – RequestMapping#params

用一个类似于这个的方法创build一个控制器

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

另一个解决scheme:

 @RequestMapping(value="/save", method={RequestMethod.POST}, params={"save=Save"}) @RequestMapping(value="/save", method={RequestMethod.POST}, params={"renew=Renew"})