当试图让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代替比较。
答案 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>