Java 在JSP中,EL枚举值始终为空

Java 在JSP中,EL枚举值始终为空,java,jsp,enums,jstl,el,Java,Jsp,Enums,Jstl,El,当尝试使EL条件工作时,我发现枚举值被完全忽略。在我看来,这似乎与规范相反 <c:out value='${com.foobar.data.BookingStatus.FAILED}' /> <c:out value='${BookingStatus.FAILED}' /> <c:out value='${com.foobar.data.BookingStatus.failed}' /> <c:out value='${BookingStatus.fai

当尝试使EL条件工作时,我发现枚举值被完全忽略。在我看来,这似乎与规范相反

<c:out value='${com.foobar.data.BookingStatus.FAILED}' />
<c:out value='${BookingStatus.FAILED}' />
<c:out value='${com.foobar.data.BookingStatus.failed}' />
<c:out value='${BookingStatus.failed}' />
<c:if test="${empty BookingStatus.FAILED }">empty</c:if>

我希望避免对FAIL等的整数值进行硬编码,而是使用enum进行比较。

这是因为当前版本的EL不支持访问enum或调用enum常量。此支持仅适用于EL 3.0

不清楚您的意图是什么,但很高兴知道您可以在EL中将枚举属性作为
字符串进行比较。它们即解析为
字符串

假设您有一个如下所示的bean:

<c:when test='${bookingInformation.bookingStatus eq BookingStatus.FAILED.code}'>
    FOOBARFAIL
</c:when>
public class Booking {
    public enum Status { NEW, PROGRESS, SUCCESS, FAILED }

    private Status status;

    public Status getStatus() {
        return status;
    }
}
然后您可以测试
状态。失败的
条件如下:

<c:if test="${booking.status == 'FAILED'}">
    Booking status is FAILED.
</c:if>

预订状态为失败。
另见:

正如BalusC所指出的,您不能使用EL访问枚举,但是,您可以这样做:

<c:set var="enumFailed" value="<%=BookingStatus.FAILED%>"/>

<c:if test="${enumFailed.code == bookingInformation.bookingStatus}">
    ...
</c:if>

...

如果bookingInformation.bookingStatus是一个enum而不是int,这将是一个理想的选择,但是如果由于应用程序的遗留性质,重新分解应用程序是不可能的,那么我上面的示例应该会有所帮助。对于枚举的每个值,您都需要一个
(在您的示例中似乎只有两个)。

您必须在jsp页面中导入枚举类。只要你导入它,你就可以参考它。我在下面写了一个例子

我的枚举是WebSettingType

public enum WebSettingType {

    SMTP_HOSTNAME("smtp_hostname"),
    SMTP_PORT("smtp_port"),
    SMTP_USERNAME("smtp_username");
    private final String value;

    private WebSettingType(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}
我有一个websettings.jsp页面,它使用标记页面等

<%@page import="my.package.WebSettingType"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>

<t:admin>
    <jsp:attribute name="css">
    </jsp:attribute>
    <jsp:attribute name="content">
        <input type="text" name="${WebSettingType.SMTP_HOSTNAME.getValue()}"/>
    </jsp:attribute>
</t:admin>


不,不是。我对这个条件没有问题,但是Enum对象本身是不可访问的,它是空的/null。这是因为Tomcat根本看不到Enum类。问题是我在比较一个整数,即Enum的序数值,而不是另一个Enum。我可以将整数转换为EL中的枚举吗?不要使用序数。使用完整的枚举值。您的
getStatus()
必须返回
Status
,而不是
int
。这是设计糟糕的模型的标志。序数不是常数。无论何时添加/删除/重新排列枚举值,它们都可能更改。这听起来很像是为了在数据库中保存Java枚举而做的(糟糕的)变通方法。这是一个不同的主题。再次阅读你的答案,这是否意味着我基本上不能在EL中使用公共枚举类?不,EL不支持它。它只支持Javabeans,如中所述。您可以添加一个getter来返回状态的所有值,但这显然很笨拙。你必须在另一个层次上解决这个问题:也就是说,不要使用序数,而是枚举。它不仅仅是枚举。EL不支持通过完全限定的类名访问类,也不支持访问公共静态最终常量等等。但是说艾尔很烂太过分了。这根本不是埃尔的意图。它是围绕Javabeans规范设计的。。。您所能做的最好的事情是添加另一个getter,它在模型中完成了所需的工作。另请参见当前接受的答案及其“另请参见”链接:
<%@page import="my.package.WebSettingType"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>

<t:admin>
    <jsp:attribute name="css">
    </jsp:attribute>
    <jsp:attribute name="content">
        <input type="text" name="${WebSettingType.SMTP_HOSTNAME.getValue()}"/>
    </jsp:attribute>
</t:admin>