问题

我有一个名为Status的枚举定义如下:

public enum Status { 

    VALID("valid"), OLD("old");

    private final String val;

    Status(String val) {
        this.val = val;
    }

    public String getStatus() {
        return val;
    }

}

我想从JSTL标记访问值VALID。具体来说是<c:when>tag的test属性。例如。

<c:when test="${dp.status eq Status.VALID">

我不确定这是否可行。


#1 热门回答(104 赞)

对字符串的简单比较:

<c:when test="${someModel.status == 'OLD'}">

#2 热门回答(53 赞)

如果使用Spring MVC,Spring Expression Language(SpEL)可能会有所帮助:

<spring:eval expression="dp.status == T(com.example.Status).VALID" var="isValid" />
<c:if test="${isValid}">
   isValid
</c:if>

#3 热门回答(36 赞)

这里有3个选择,其中没有一个是完美的:

  • 你可以在test属性中使用scriptlet:<c:when test ="<%= dp.getStatus()== Status.VALID%>">这使用枚举,但它也使用了一个scriptlet,它不是JSP 2.0中的"正确方法"。但最重要的是,当你想在使用$ {}时添加另一个条件时,这不起作用。这意味着你要测试的所有变量都必须在scriptlet中声明,或者保存在请求或会话中(pageContext变量在.tag文件中不可用)。
  • 你可以与字符串进行比较:<c:when test ="$ {dp.status =='VALID'}">这看起来很干净,但是你引入了一个复制枚举值的字符串,并且编译器无法验证。因此,如果你从枚举中删除该值或重命名该值,你将不会再看到这部分代码不可访问。你基本上每次都必须通过代码进行搜索/替换。
  • 你可以将你使用的每个枚举值添加到页面上下文中:<c:set var ="VALID"value ="<%= Status.VALID%>"/>然后你可以执行以下操作:<c:when test ="$ {dp.status == VALID}">

我更喜欢最后一个选项(3),即使它也使用了一个scriptlet。这是因为它仅在你设置值时使用它。稍后你可以在更复杂的EL表达式中使用它,以及其他EL条件。在选项(1)中,你不能在单个whentag的test属性中使用scriptlet和EL表达式。


原文链接