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

Posted

技术标签:

【中文标题】如何使用 Spring 和 Thymeleaf 在下拉列表中显示所有可能的枚举值?【英文标题】:How to display all possible enum values in a dropdown list using Spring and Thymeleaf? 【发布时间】:2015-06-13 10:52:54 【问题描述】:

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

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

为了提高性能,最好将枚举值存储在控制器的字段中并将其作为模型属性发送,因为每次调用 enum.values 都会生成一个新的值数组副本。根据枚举的大小,这可以代表一些重复的工作。

【讨论】:

【参考方案2】:

这对我有用:

Java:

public enum RoleEnum 
    SUPER_ADMIN("SUPER_ADMIN"),
    RESTAURANTE_ADMIN("RESTAURANTE_ADMIN");

    private final String roleCode;

    private RoleEnum(String roleCode) 
        this.roleCode = roleCode;
    

百里香:

<select class="form-control" id="val-skill" name="role_id">
    <option th:each="role : $T(com.users.enumeration.RoleEnum).values()" th:value="$role" th:text="$role"></option>
</select>

【讨论】:

【参考方案3】:

你可以这样做:

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

【讨论】:

T 的目的是什么? 它是用于访问类型和调用静态方法或获取其中的静态属性的 Spring EL 语法。见docs.spring.io/spring/docs/current/spring-framework-reference/… th:value=$state 上使用转换标签 它给了我 java.lang.IllegalArgumentException:迭代变量不能为空 这个解决方案对我帮助很大,谢谢!我实际上使用它来设置图像列表的 src 和工具提示。这可能对某人有帮助: 我已将最终字符串字段添加到枚举并添加了正确的 getter 和构造函数。【参考方案4】:

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

【讨论】:

我们如何通过覆盖 toString 来获得相同的结果,或者我们不能? @atas 是的,你可以覆盖 toString() @Clint "$state" 默认调用 toString() ,因此覆盖 toString() 没有帮助。我尝试使用th:value="$state.name",但出现解析错误

以上是关于如何使用 Spring 和 Thymeleaf 在下拉列表中显示所有可能的枚举值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中使用 Thymeleaf 保存角色?

如何使用 thymeleaf 和 spring 使用列表填充下拉列表

如何使用 Pageable 在 Spring Boot 和 Thymeleaf 中显示按点赞数排序的技能列表?

如何在 Spring Thymeleaf 中提交表格数据

如何使用 thymeleaf 和 Spring Boot 以 json 格式显示用户输入数据

thymeleaf 和 spring 控制器之间的值如何传递,反之亦然