Spring MVC - 表单的多个提交按钮

use*_*122 38 java spring controller

我试图将2个提交按钮发布到表单,每个按钮操作映射到不同的控制器.这是我的映射

@RequestMapping(value="/save", method=RequestMethod.POST, params="save")
@RequestMapping(value="/save", method=RequestMethod.POST, params="renew")
Run Code Online (Sandbox Code Playgroud)

我的提交按钮看起来像这些 -

<input type="submit" name="save" class="button" value="Save" />
<input type="submit" name="renew" class="button" value="Renew" />
Run Code Online (Sandbox Code Playgroud)

从我的映射中可以看出,我依靠使用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)
Run Code Online (Sandbox Code Playgroud)

奇怪的是,当这种情况发生并重新提交页面时,一切都运行良好.有没有更好的方法来实现我想要做的事情?

谢谢!

xyz*_*ast 37

如果表单指定了以下按钮:

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"
Run Code Online (Sandbox Code Playgroud)

你可以根据一个控制器按下的按钮指向不同的网址请求.

取消按钮,

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

请求映射的作用是扫描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.
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*Dan 34

为什么不:

<input type="submit" name="action" value="save" />
Run Code Online (Sandbox Code Playgroud)

然后:

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

} 
Run Code Online (Sandbox Code Playgroud)

  • 看起来有点危险,因为`input`标签上的`value`属性包含按钮的文本.我想i18n不会成为你这个方法的朋友. (8认同)

lu_*_*_ko 10

如果您有更多@RequestMapping只有params属性不同的控制器方法,则必须显式写入:

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

在你的情况下:

@RequestMapping(value="/save", method=RequestMethod.POST, params={"save", "!renew"})
@RequestMapping(value="/save", method=RequestMethod.POST, params={"renew", "!save"})
Run Code Online (Sandbox Code Playgroud)

这应该修复错误为HTTP路径映射的不明确的处理程序方法...

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


小智 7

只需使用与此类似的方法创建一个控制器

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

} 
Run Code Online (Sandbox Code Playgroud)