При попытке заставить работать условие 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 развертывания.
ОБНОВЛЕНИЕ:
Мое намерение состоит в том, чтобы сравнить предоставленное целое число со свойством 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 и т. д. и вместо этого использовать перечисление для сравнения.
Ответ 1 · рейтинг 16 · BalusC
Это связано с тем, что EL в его текущей версии не поддерживает ни доступ к перечислениям, ни вызов констант перечисления. Эта поддержка доступна только для EL 3.0.
Неясно, каково ваше намерение, но приятно знать, что вы можете сравнивать свойства перечисления как String в EL. Именно они разрешены как 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>
Смотрите также
Ответ 2 · рейтинг 7 · Steven Benitez
Как указал BalusC, вы не можете получить доступ к перечислениям с помощью EL, однако вы можете сделать это:
<c:set var="enumFailed" value="<%=BookingStatus.FAILED%>"/>
<c:if test="${enumFailed.code == bookingInformation.bookingStatus}">
...
</c:if>
Было бы идеально, если бы bookingInformation.bookingStatus было перечислением, а не целым числом, но если о рефакторинге вашего приложения не может быть и речи из-за его устаревшего характера, тогда мой приведенный выше пример должен помочь. Вам понадобится <c:set/> для каждого значения перечисления (в вашем примере их всего два).
Ответ 3 · рейтинг 1 · George Siggouroglou
Вы должны импортировать класс enum на свою страницу 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>