2015-04-08 19 views
19

我有一個域對象具有一個枚舉屬性,我想顯示一個下拉列表與該對象的窗體中的所有可能的枚舉值。想象一下以下對象:如何使用Spring和Thymeleaf在下拉列表中顯示所有可能的枚舉值?

public class Ticket { 

    private Long id; 

    private String title; 

    private State state; 

    // Getters & setters 

    public static enum State { 
    OPEN, IN_WORK, FINISHED 
    } 

} 

在我的控制器我有呈現此對象的窗體的方法:

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

模板看起來是這樣的:

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

後來它應該被轉換成這樣的東西:

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

如何創建選擇標籤?所選的值也應該被映射到車票自動,這樣我可以做這樣的事情在控制器:

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

    return "redirect:/tickets"; 
} 

回答

43

你可以這樣做:

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

T的目的是什麼? – saml

+2

它是用於訪問類型和調用靜態方法或獲取靜態屬性的Spring EL語法。請參閱http://docs.spring.io/spring/docs/current/spring-framework-reference/html/expressions.html#expressions-types – jchampemont

+1

對'th:value = $ {{state}}'使用轉換標記 –

15

另外,如果你想分開從GUI顯示的字符串枚舉序名稱,添加額外的屬性,例如的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; 
    } 
} 

而在HTML文件:

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

這將顯示顯示名給用戶,並可以讓你悄無聲息改變這一點串不重構代碼。你可以添加更多的屬性,如th:title這樣。

+0

我們如何通過重寫toString來實現相同的結果,或者我們不能? – atas

+0

@atas是你可以覆蓋toString() – Nikki