如何使用Spring和Thymeleaf在下拉列表中显示所有可能的枚举值?

2022-09-01 07:07:26

我有一个具有枚举属性的域对象,并且我想以该对象的形式显示一个下拉列表,其中包含所有可能的枚举值。想象一下以下对象:

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

答案 1

你可以做:

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

答案 2

此外,如果要将枚举序号名称与 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>

这将向用户显示 displayName,并允许您稍后以静默方式更改此字符串,而无需重构代码。您可以通过这种方式添加更多属性,例如th:title


推荐