我有一个具有枚举属性的域对象,我想显示一个下拉列表,其中包含该对象表单中所有可能的枚举值。想象一下以下对象:
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";
}
答案 0 :(得分:61)
你可以这样做:
<select>
<option th:each="state : ${T(com.mypackage.Ticket.State).values()}"
th:value="${state}"
th:text="${state}">
</option>
</select>
答案 1 :(得分:19)
此外,如果要将枚举序号与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 。
答案 2 :(得分:0)
这对我有用:
su - ec2-user -c 'cd /usr/local/nginx/html/node && npm install'
}
npm install
答案 3 :(得分:0)
为了提高性能,最好将枚举值存储在控制器的字段中并将其作为模型属性发送,因为每次调用 enum.values 都会生成值数组的新副本。根据枚举的大小,这可以代表一些重复的工作。