2012-01-21 57 views
35

我想有2提交按鈕發佈到窗體,每個按鈕操作映射到不同的控制器。這裏是我的映射春季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) 

奇怪的是,當這種情況發生,我重新提交頁面,一切工作正常之後。有沒有更好的方法來實現我想要做的事情?

謝謝!如果指定了表格這些按鈕

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

} 
+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" /> 

然後

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

似乎有點危險,因爲'input'標籤上的'value'屬性包含按鈕的文本。我認爲i18n不會成爲你使用這種方法的朋友。 –

+0

我IE瀏覽器(10)的問題一直沒有發佈值,並且採用了你的方法。雖然不是超潔淨的,但它爲我工作。乾杯。 –

9

如果您有與不同之處僅params屬性相同@RequestMapping多個控制器的方法,你必須明確地寫:

  • 哪個參數應該是出現在請求中,例如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"})