2015-04-08 2 views
19

Ich habe ein Domain-Objekt, das eine enum-Eigenschaft hat und ich möchte eine Dropdown-Liste mit allen möglichen enum-Werten im Formular für dieses Objekt anzeigen. Stellen Sie sich das folgende Objekt:Wie werden alle möglichen Enum-Werte in einer Dropdown-Liste mit Spring und Thymeleaf angezeigt?

public class Ticket { 

    private Long id; 

    private String title; 

    private State state; 

    // Getters & setters 

    public static enum State { 
    OPEN, IN_WORK, FINISHED 
    } 

} 

In meinem Controller habe ich eine Methode, die eine Form für dieses Objekt macht:

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

Die Vorlage sieht wie folgt aus:

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

Später sollte es in so etwas umgewandelt werden:

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

Wie kann ich das Select-Tag erstellen? Der gewählte Wert sollte auch automatisch auf dem Ticket zugeordnet werden, so dass ich so etwas wie dies in der Steuerung kann:

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

    return "redirect:/tickets"; 
} 

Antwort

43

Sie tun können:

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

Was ist der Zweck des T? – saml

+2

Die Spring-EL-Syntax für den Zugriff auf einen Typ und das Aufrufen statischer Methoden oder das Abrufen statischer Eigenschaften. Siehe http://docs.spring.io/spring/docs/current/spring-framework-reference/html/expressions.html#expressions-types – jchampemont

+1

Am 'th: value = $ {{state}}' verwenden Sie die Conversion-Tags –

15

Darüber hinaus, wenn Sie die trennen wollen enum Ordnungs Namen von der Zeichenfolge in der GUI angezeigt wird, fügen Sie zusätzliche Eigenschaften, zum Beispiel eines display:

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

Und in der html-Datei:

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

Dies präsentiert die display für den Anwender und ermöglicht es Ihnen, leise auf diese Strings später zu ändern, ohne den Code Refactoring. Sie können weitere Eigenschaften wie th: Titel auf diese Weise hinzufügen.

+0

Wie können wir dasselbe Ergebnis erzielen, indem wir toString überschreiben, oder können wir nicht? – atas

+0

@atas ja Sie können toString() überschreiben – Nikki