Java 在JSP中,EL枚举值始终为空
当尝试使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
<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>