2010-11-11 16 views
17

Un caso d'uso abbastanza comune si verifica in presenza di un elenco di oggetti Java, da cui è possibile effettuare selezioni su un modulo Web: in genere si utilizza la chiave primaria del oggetto come valore in modo che il controllore possa eseguire una ricerca o semplicemente associare la chiave a qualsiasi oggetto creato/aggiornato.Spring MVC - Selezione oggetto a discesa - Nessun identificativo primario

Il mio problema è che l'elenco da cui scegliere non è persistente, gli oggetti con chiave, sono modelli di business da un servizio che non hanno un modo ragionevole per recuperarli in base ai dati contenuti. Di seguito è riportato un pò di codice psuedo in cui una lista di Foo viene data alla pagina, e possiamo facilmente comunicare al controller suInvia il nome di Foo, ma cosa succede se ci sono altri campi di Foo che devono essere inviati?

regolatore:

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> 

Alcune soluzioni esempio potrebbe essere quello di utilizzare i campi nascosti di presentare altre proprietà di Foo e tenerli in sincronia come la selezione è cambiato, ma preferisco non usare JavaScript in una situazione come questa in cui probabilmente aggiungerà confusione. Ci sono certamente altri modi per ottenere questo risultato.

La mia domanda è: esiste qualche pratica standard per realizzare questo? O dovrei inventarmi il mio modo di farlo? Preferirei non re-inventare le ruote, se possibile, e questo è così apparentemente comune che solo l'ala potrebbe non essere l'approccio migliore.

risposta

7

In base ai propri limiti, è necessario codificare gli altri memebers di dati di foos come valore dell'opzione.
<option label="${foo.name}" value="${foo.encodedValues}"/>
Il metodo encodedValues potrebbe essere simile a questo:

 

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

Se si dispone di un certo numero di seleziona che hanno bisogno di essere codificati valori, è possibile creare una classe che fa la codifica e decodifica di questi valori per centralizzare il codice.

+0

Ho usato questo approccio registrando un raccoglitore personalizzato nel controller per passare dalla stringa all'oggetto rappresentativo (che è il centralizzato codice che suggerisce dwb). – Nate

3

È possibile utilizzare l'indice dell'elemento nell'elenco per recuperarlo nella richiesta 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> 

Nel vostro gestore di posta, utilizzare foos.get(formData.getFooIndex()) Se foos possono cambiare tra la richieste GET e POST, è necessario mettere foos nella sessione in modo che sicuramente fa riferimento lo stesso oggetto nel gestore POST come avete fatto nel Ottieni gestore.

+0

Non riesco a ottenere di nuovo la lista e mi aspetto che sia la stessa, inserirla nella sessione non è l'ideale - se il modulo non è pubblicato, e anche se lo fosse, è possibile che la lista rimanga in la sessione fino alla fine della sessione. Cos'altro posso fare per consentire al gestore di post di avere la lista? La richiesta è troppo breve, ma la sessione è troppo a lungo termine – walnutmon

+0

Quindi è possibile effettuare il marshalling dell'oggetto nel valore

Problemi correlati