在JSP EL枚举值中始终为空

时间:2011-01-05 16:42:10

标签: 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.failed}' />
<c:if test="${empty BookingStatus.FAILED }">empty</c:if>

令我惊讶的是,这些都评估为为空。为什么Enum类不被识别? 这发生在当前稳定的Tomcat实例中。

这可能是类路径问题吗? Enum在控制器代码中成功使用,但在JSP中没有其他地方使用。它在部署的lib目录中的jar中提供。

更新

我的目的是将提供的Integer与Enum的属性进行比较,如下所示:

<c:when test='${bookingInformation.bookingStatus eq BookingStatus.FAILED.code}'>
    FOOBARFAIL
</c:when>

不幸的是,检查的值无法更改,并且仍将是整数。 Enum看起来如下(简化):

public enum BookingStatus {

    COMPLETED(0), FAILED(1);

    private final int code;

    private BookingStatus(int code) {
        this.code = code;
    }

    public int getCode() {
        return code;
    }

}

我想避免硬编码FAIL等的Integer值,而是使用enum代替比较。

3 个答案:

答案 0 :(得分:15)

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

目前还不清楚你的意图是什么,但最好知道你可以将枚举属性作为EL中的String进行比较。它们被解析为String

假设你有一个看起来像这样的bean:

public class Booking {
    public enum Status { NEW, PROGRESS, SUCCESS, FAILED }

    private Status status;

    public Status getStatus() {
        return status;
    }
}

然后您可以按如下方式测试Status.FAILED条件:

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

另见:

答案 1 :(得分:7)

正如BalusC指出的那样,你无法使用EL访问枚举,但是,你可以这样做:

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

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

如果bookingInformation.bookingStatus是枚举而不是int,那将是理想的,但如果由于其遗留性质重新分解您的应用程序是不可能的,那么上面的示例应该有所帮助。对于枚举的每个值,您需要<c:set/>(在您的示例中看起来只有两个)。

答案 2 :(得分:1)

您必须在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>