2015-04-08 18 views
19

Ho un oggetto dominio con una proprietà enum e voglio visualizzare un elenco a discesa con tutti i possibili valori enum nel modulo per questo oggetto. Immaginate il seguente oggetto:Come visualizzare tutti i possibili valori enum in un elenco a discesa utilizzando Spring e Thymeleaf?

public class Ticket { 

    private Long id; 

    private String title; 

    private State state; 

    // Getters & setters 

    public static enum State { 
    OPEN, IN_WORK, FINISHED 
    } 

} 

Nel mio controller Ho un metodo che rende una forma per questo oggetto:

@RequestMapping("/tickets/new") 
public String showNewTicketForm(@ModelAttribute Ticket ticket) { 
    return "tickets/new"; 
} 

Il modello si presenta così:

<form th:action="@{/tickets}" method="post" th:object="${ticket}"> 
    <input type="text" th:field="*{title}" /> 
    <select></select> 
</form> 

In seguito si dovrebbe essere trasformato in qualcosa del genere:

<form action="/tickets" method="post"> 
    <input type="text" name="title" /> 
    <select name="state"> 
    <option>OPEN</option> 
    <option>IN_WORK</option> 
    <option>FINISHED</option> 
    </select> 
</form> 

Come posso creare il tag select? Il valore selezionato deve anche essere mappato al biglietto automaticamente in modo che io possa fare qualcosa di simile nel controller:

@RequestMapping(value = "/tickets", method = RequestMethod.POST) 
public String createTicket(@Valid Ticket ticket) { 
    service.createTicket(ticket); 

    return "redirect:/tickets"; 
} 

risposta

43

Si potrebbe fare:

<select> 
    <option th:each="state : ${T(com.mypackage.Ticket.State).values()}" 
      th:value="${state}" 
      th:text="${state}"> 
    </option> 
</select> 
+2

Qual è lo scopo della T? – saml

+2

È la sintassi EL molla per accedere a un tipo e invocare metodi statici o ottenere proprietà statiche. Vedi http://docs.spring.io/spring/docs/current/spring-framework-reference/html/expressions.html#expressions-types – jchampemont

+1

In "th: value = $ {{state}}" usa i tag di conversione –

15

Inoltre, se si vuole separare il enum nome ordinale dalla stringa visualizzata nella GUI, aggiungere ulteriori proprietà, ad esempio, un displayName:

public static enum State { 

    OPEN("open"), 
    IN_WORK("in work"), 
    FINISHED("finished"); 

    private final String displayName; 

    State(String displayName) { 
     this.displayName = displayName; 
    } 

    public String getDisplayName() { 
     return displayName; 
    } 
} 

E nel file html:

<select> 
    <option th:each="state : ${T(com.mypackage.Ticket.State).values()}" th:value="${state}" th:text="${state.displayName}"></option> 
</select> 

Questo presenterà la displayName per l'utente e consente di modificare in silenzio questo corde più tardi senza refactoring del codice. Puoi aggiungere altre proprietà come th: title in questo modo.

+0

Come possiamo ottenere lo stesso risultato sovrascrivendo toString o non possiamo? – atas

+0

@atas yes puoi sovrascrivere toString() – Nikki

Problemi correlati