2010-11-11 11 views
17

Web nesnesinde seçimlerin yapılabildiği bir Java nesnesi listesi olduğunda, genellikle yaygın bir kullanım durumu oluşur; kontrolörün bir arama yapabilmesi veya sadece nesnenin oluşturulduğu/güncellenmesi için anahtarı bağlayabilmesi için değer olarak nesne.Spring MVC - Drop Down Nesne Seçimi - Hiçbirincil tanımlayıcı yok

Sorunum, seçim yapılacak listenin kalıcı, anahtarlanmış nesneler olmaması, içerdiği veriler temelinde bunları almak için makul bir yolu olmayan bir hizmetten iş modelleri olmasıdır. Aşağıda, Foo'nun bir listesini sayfaya verdiğimiz bazı psuedo kodları yer alıyor ve kontrolöre kolayca iletişim kurabiliyoruz. Foo'nun ismini gönderin, ama ne yapması gerekiyorsa Foo'nun başka alanları varsa ne olacak?

kontrolör:

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> 

Bazı örnek çözümleri Foo diğer özelliklerindeki göndermek ve seçim olarak senkronize halde tutmak için gizli alanları kullanmak olacaktır değiştirilir, ama ben tercih JavaScript'i böyle bir durumda kullanmamak için muhtemelen karışıklık katacak. Bunu gerçekleştirmenin başka yolları da var.

Sorum, bunun için standart bir uygulama var mı? Yoksa kendi yolumla mı gelmeliyim? Mümkünse tekerlekleri yeniden icat etmemeyi tercih ederim ve bu sadece görünüşe göre en iyi yaklaşım olmayabilir.

cevap

7

Sınırlamalarınıza bağlı olarak, foos'un diğer veri yakalayıcılarını seçeneğin değeri olarak kodlamanız gerekir.
<option label="${foo.name}" value="${foo.encodedValues}"/>
encodedValues yöntem şöyle görünebilir: Değerleri kodlanmış olması gerekir seçer bir dizi varsa

 

    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(); 
    } 
 

, sen kodlama ve kod çözme yapan bir sınıf oluşturmak isteyebilirsiniz kodun merkezileştirilmesi için bu değerlerin

+0

Bu yaklaşımı, dizeden temsilci nesnesine gitmek için denetleyiciye özel bir bağlayıcı kaydederek kullandım (bu merkezi dwb önerdiği kod). – Nate

3

POST isteğinde geri almak için listedeki öğenin dizinini kullanabilirsiniz. senin POST işleyicisi

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

, Foo'larınız GET ve POST istekleri arasında değişebilir Eğer foos.get(formData.getFooIndex()), size olduğu gibi kesinlikle sizin POST işleyicisi aynı nesneye başvuran böylece oturumda foos koymak gerekir kullanmak GET işleyici.

+0

Listeyi tekrar alamıyorum ve aynı olmasını bekliyorum, oturuma koymak ideal değil - form gönderilmemişse ve hatta olsa bile, liste sadece oturum sona erene kadar oturum. Posta işleyicisinin listeye sahip olmasına izin vermek için başka neler yapabilirim? İstek çok kısa vadeli, ancak oturum çok uzun vadeli – walnutmon

+0

Sonra nesneyi