2010-11-11 20 views
17

一個相當常見的用例出現在有一個Java對象列表,可以從Web表單上進行選擇 - 通常您可以使用主鍵對象作爲值,以便控制器可以執行查找,或者僅將鍵綁定到創建/更新的任何對象。Spring MVC - 下拉對象選擇 - 沒有主標識符

我的問題是,可供選擇的列表不是持久的,鍵控對象,它們是來自服務的業務模型,它們沒有合理的方式根據所包含的數據檢索它們。下面是一些僞代碼,其中Foo列表被賦予頁面,並且我們可以很容易地與控制器進行通信,提交Foo的名稱,但是如果還有其他Foo字段需要提交,該怎麼辦?

控制器:

referenceData() { 
    ... 
    List foos = fooService.getFoosForBar(bar) 
    return { 'foos', foos } 
} 

的jsp:

<form> 
    ... 
<spring:bind path="formData.foo"> 
    <select name="<c:out value="${status.expression}" />"> 
     <c:forEach items="${foos}" var="foo"> 
      <option value="<c:out value="${foo.name}"/>"> 
       <c:out value="${foo.name}"/> 
      </option> 
     </c:forEach> 
    </select> 
</spring:bind> 
    ... 
</form> 

一些示例解決方案是使用隱藏域提交Foo的其他屬性和保持同步的選擇發生變化,但我更喜歡不要在這種情況下使用JavaScript,這可能會增加混淆。當然還有其他方法可以實現這一點。

我的問題是否存在完成此任務的任何標準操作?或者我應該想出我自己的方式?如果可能的話,我寧願不重新發明輪子,這看起來很普遍,只是說它可能不是最好的方法。

回答

7

根據您的限制,您必須將foos的其他數據記錄編碼爲選項的值。
<option label="${foo.name}" value="${foo.encodedValues}"/>
encodedValues方法可能是這個樣子:

 

    private String SEPARATOR = ","; 

    public String getEncodedValues() 
    { 
     final StringBuffer returnValue = new StringBuffer(); 

     returnValue.append(field1); 
     returnValue.append(SEPARATOR); 
     returnValue.append(field2); 
     returnValue.append(SEPARATOR); 
     returnValue.append(field3); 

     return returnValue.toString(); 
    } 
 

如果你有一個數字,需要有編碼值選擇的,你可能想創建一個類,做的編碼和解碼這些值集中了代碼。

+0

我已經使用這種方法,在控制器中註冊一個自定義綁定器,從字符串轉到代表對象dwb建議的代碼)。 – Nate 2010-11-11 21:19:54

3

您可以使用列表中元素的索引將其返回到POST請求中。

<spring:bind path="formData.fooIndex"> 
    <select name="<c:out value="${status.expression}" />"> 
    <c:forEach items="${foos}" var="foo" varStatus="i"> 
     <option value="<c:out value="${i.index}"/>"> 
      <c:out value="${foo.name}"/> 
     </option> 
    </c:forEach> 
    </select> 
</spring:bind> 

在您的文章處理程序,使用foos.get(formData.getFooIndex()) 如果FOOS可以GET和POST請求之間改變,你需要把foos在會話,這樣,你絕對引用同一個對象在您的文章處理程序,你在做GET處理程序。

+0

我不能再次獲得列表,並期望它是相同的,把它放在會話中並不理想 - 如果表單沒有發佈,並且即使是這樣,也可能列表只會留在直到會議結束。我還能做些什麼來允許郵政處理員擁有清單?請求太短,但會話過長 – walnutmon 2010-11-11 17:48:45

+0

然後,您可以在