簡體   English   中英

Spring MVC - 表單的多個提交按鈕

[英]Spring MVC - Multiple submit button to a Form

我試圖將2個提交按鈕發布到表單,每個按鈕操作映射到不同的控制器。 這是我的映射

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

奇怪的是,當這種情況發生並重新提交頁面時,一切都運行良好。 有沒有更好的方法來實現我想要做的事情?

謝謝!

如果表單指定了以下按鈕:

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"

你可以根據一個控制器按下的按鈕指向不同的網址請求。

取消按鈕,

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

為什么不:

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

這應該修復錯誤為HTTP路徑映射的不明確的處理程序方法...

請參閱Spring Web API 4.0.x - RequestMapping #params

只需使用與此類似的方法創建一個控制器

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

} 

還有一個解決方案

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM