Bezdepbonusu7Программирование: статьи и ответы

Вопрос

В JSP EL значение перечисления всегда пустое

Автор вопроса: sibidibaОтветов: 3

При попытке заставить работать условие 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 и т. д. и вместо этого использовать перечисление для сравнения.

  • stackoverflow.com/questions/123598 / jmj 05.01.2011
  • Нет это не так. У меня нет проблем с условием, но тогда сам объект Enum недоступен, он пустой/нулевой. Это как Tomcat вообще не увидит класс Enum. sibidiba 05.01.2011

javaenumsjspjstlel

Ответы

Ответ 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>

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы