java - example - thymeleaf spring 5
¿Cómo mostrar todos los valores de enumeración posibles en una lista desplegable con Spring y Thymeleaf? (2)
Además, si desea separar el nombre ordinal de la enumeración de la cadena que se muestra en la GUI, agregue propiedades adicionales, por ejemplo, una persona:
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;
}
}
Y en el archivo html:
<select>
<option th:each="state : ${T(com.mypackage.Ticket.State).values()}" th:value="${state}" th:text="${state.displayName}"></option>
</select>
Esto le presentará la información al usuario y le permite cambiar esta cadena de manera silenciosa más tarde sin tener que refactorizar el código. Puedes agregar más propiedades como th: title de esta manera.
Tengo un objeto de dominio que tiene una propiedad de enumeración y quiero mostrar una lista desplegable con todos los valores de enumeración posibles en el formulario para este objeto. Imagina el siguiente objeto:
public class Ticket {
private Long id;
private String title;
private State state;
// Getters & setters
public static enum State {
OPEN, IN_WORK, FINISHED
}
}
En mi controlador tengo un método que representa un formulario para este objeto:
@RequestMapping("/tickets/new")
public String showNewTicketForm(@ModelAttribute Ticket ticket) {
return "tickets/new";
}
La plantilla se ve así:
<form th:action="@{/tickets}" method="post" th:object="${ticket}">
<input type="text" th:field="*{title}" />
<select></select>
</form>
Más tarde debería transformarse en algo como esto:
<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>
¿Cómo puedo crear la etiqueta de selección? El valor seleccionado también debe asignarse al ticket automáticamente para que pueda hacer algo como esto en el controlador:
@RequestMapping(value = "/tickets", method = RequestMethod.POST)
public String createTicket(@Valid Ticket ticket) {
service.createTicket(ticket);
return "redirect:/tickets";
}
Podrías hacerlo:
<select>
<option th:each="state : ${T(com.mypackage.Ticket.State).values()}"
th:value="${state}"
th:text="${state}">
</option>
</select>