2010-01-08 84 views
4

在我的Spring應用程序中,我有一個jsp,它有一個表單,我想要多個提交按鈕到同一個控制器。我需要能夠確定在控制器中按下哪個按鈕。該表格向用戶顯示多個項目,他們可以選擇其中一個項目,唯一的區別是所選項目的ID。在窗體中有多個提交按鈕,並確定在控制器中按下了哪個按鈕

在JSP中,我創建的形式是這樣的:

<form:form method="post" commandName="myCommand"> 

    <c:forEach items="${model.availableitems}" var="item"> 
     <span class="item">${item.description}</span> 
     <input type="hidden" name="id" value="${item.ID}"/> 
     <input type="submit" name="SelectButton" value="Select" /> 
    </c:forEach> 

    </div> 
</form:form> 

然而,這給了我一個「數據綁定錯誤:1」不會提交到日誌中的消息和形式控制器。

我試圖將myCommand.id從int更改爲String,但是當它提交時的值是id1,id2,id3 ...(逗號分隔列表中的所有ID)無法確定按下了哪個按鈕。我不希望爲每個按鈕指定不同的操作,因爲項目數量可能會增加,並且對於它們的操作都是相同的,只是使用不同的ID。

如何在此表單中獲得多個按鈕並獲取控制器中的值?

回答

7

爲什麼不爲每件物品使用單獨的表格?的

<c:forEach items="${model.availableitems}" var="item"> 
    <form:form method="post" commandName="myCommand"> 
    <span class="item">${item.description}</span> 
    <input type="hidden" name="id" value="${item.ID}"/> 
    <input type="submit" name="SelectButton" value="Select" /> 
    </form:form>   
</c:forEach> 
0

而不是使用提交按鈕使用一個按鈕,用於調用函數,設置隱藏字段的值,並調用form.submit()

您可以使用循環

+2

請不要對此使用Javascript hack。這並不完全合理。 – BalusC 2010-01-08 03:32:56

0

生成按鈕你有3個選擇 -
1 。使用多個表單並在每個表單中有一個提交按鈕,如上所示。生成的代碼看起來不太漂亮,通常認爲在頁面中有多個表單是不好的做法。
2.當按下提交按鈕時,使用Javascript hack設置隱藏變量。
3.如果你必須處理回退(沒有JavaScript),那麼有一個迂迴的方式來找出哪個按鈕被點擊。下面是一個例子 -

<form:form method="post" commandName="myCommand">    
    <c:forEach items="${model.availableitems}" var="item">    
     <span class="item">${item.description}</span>    
     <input type="submit" name="${item.ID}" value="Select" />    
    </c:forEach> 
</form:form>      

這爲每個按鈕設置一個唯一的ID。由於請求參數是鍵值對,因此我們必須在這種情況下進行反向查找,因爲我們在關鍵位置中具有值。這是Java的一面..不知道這是否是最有效的方式,但它的工作原理。

String searchButtonName(final HttpRequest request) { 
    String buttonName = ""; 
    Map<String, String[]> paramMap = request.getParameterMap(); 
    if (MapUtils.isNotEmpty(paramMap)) { 
      for (Map.Entry<String, String[]> entry : paramMap.entrySet()) { 
        /* Search for the button name as given in 
         the 'value' attribute for the input tag */ 
        if ("Select".equals(entry.getValue()[0])) { 
          buttonName = entry.getKey(); 
          break; 
        } 
      } 
    } 
    return buttonName; 
} 
0

您可以在控制器的參數列表中使用註釋參數@RequestParam("SelectButton") String submit

+1

這是不是隻給你輸入元素的'value',這將是每個按鈕的「選擇」? – RustyTheBoyRobot 2012-07-02 17:29:22

相關問題