Вопрос:

Получите доступ к значению Enum, используя EL с JSTL

java jsp java-ee jstl

111045 просмотра

13 ответа

5239 Репутация автора

У меня есть Enum с именем Status, который определяется так:

public enum Status { 

    VALID("valid"), OLD("old");

    private final String val;

    Status(String val) {
        this.val = val;
    }

    public String getStatus() {
        return val;
    }

}

Я хотел бы получить доступ к значению VALIDиз тега JSTL. В частности, testатрибут <c:when>тега. Например

<c:when test="${dp.status eq Status.VALID">

Я не уверен, возможно ли это.

Автор: IaCoder Источник Размещён: 23.09.2008 08:18

Ответы (13)


22 плюса

5239 Репутация автора

Поэтому, чтобы полностью решить мою проблему, мне нужно было сделать следующее:

<% pageContext.setAttribute("old", Status.OLD); %>

Тогда я смог сделать:

<c:when test="${someModel.status == old}"/>...</c:when>

который работал как ожидалось.

Автор: IaCoder Размещён: 24.09.2008 09:09

111 плюса

1559 Репутация автора

Решение

Простое сравнение со строковыми работами:

<c:when test="${someModel.status == 'OLD'}">
Автор: Alexander Vasiljev Размещён: 15.12.2008 02:27

10 плюса

0 Репутация автора

Для этого я делаю следующее:

<c:set var="abc">
    <%=Status.OLD.getStatus()%>
</c:set>

<c:if test="${someVariable == abc}">
    ....
</c:if>

Это выглядит некрасиво, но работает!

Автор: Dmitry R Размещён: 10.07.2009 03:32

-1 плюса

29 Репутация автора

Я вообще считаю плохой практикой смешивать код java с файлами jsps / tag. Использование 'eq' должно помочь:

<c:if test="${dp.Status eq 'OLD'}">
  ...
</c:if>
Автор: Eclatante Размещён: 24.11.2009 02:17

2 плюса

39 Репутация автора

Добавьте метод в перечисление как:

public String getString() {
    return this.name();
}

Например

public enum MyEnum {
    VALUE_1,
    VALUE_2;
    public String getString() {
        return this.name();
    }
}

Тогда вы можете использовать:

<c:if test="${myObject.myEnumProperty.string eq 'VALUE_2'}">...</c:if>
Автор: Dean Размещён: 15.12.2010 01:34

3 плюса

128 Репутация автора

У меня нет ответа на вопрос о Корнеле, но у меня есть замечание по поводу других примеров сценариев. Большинство выражений неявно доверяют toString(), но Enum.valueOf()ожидают значение, которое приходит из Enum.name()свойства / соответствует ему . Поэтому следует использовать, например:

<% pageContext.setAttribute("Status_OLD", Status.OLD.name()); %>
...
<c:when test="${someModel.status == Status_OLD}"/>...</c:when>
Автор: eremmel Размещён: 17.03.2011 03:24

54 плюса

7505 Репутация автора

При использовании Spring MVC может быть полезен язык выражений Spring (SpEL):

<spring:eval expression="dp.status == T(com.example.Status).VALID" var="isValid" />
<c:if test="${isValid}">
   isValid
</c:if>
Автор: James Размещён: 02.05.2011 09:57

38 плюса

4412 Репутация автора

У вас есть 3 варианта, ни один из которых не идеален:

  1. Вы можете использовать скриптлет в testатрибуте:

    <c:when test="<%= dp.getStatus() == Status.VALID %>">

    Это использует enum, но также использует скриптлет, который не является «правильным способом» в JSP 2.0. Но самое главное, это не работает, когда вы хотите добавить другое условие к тому же whenиспользованию ${}. А это означает, что все переменные, которые вы хотите протестировать, должны быть объявлены в скриптлете или сохранены в запросе или сеансе ( pageContextпеременная недоступна в .tagфайлах).

  2. Вы можете сравнить со строкой:

    <c:when test="${dp.status == 'VALID'}">

    Это выглядит чисто, но вы вводите строку, которая дублирует значение перечисления и не может быть проверена компилятором. Поэтому, если вы удалите это значение из перечисления или переименуете его, вы не увидите, что эта часть кода больше недоступна. Вы в основном должны выполнять поиск / замену кода каждый раз.

  3. Вы можете добавить каждое из перечисленных значений в контекст страницы:

    <c:set var="VALID" value="<%=Status.VALID%>"/>

    и тогда вы можете сделать это:

    <c:when test="${dp.status == VALID}">

Я предпочитаю последний вариант (3), хотя он также использует скриптлет. Это потому, что он использует его только при установке значения. Позже вы можете использовать его в более сложных выражениях EL вместе с другими условиями EL. В опции (1) нельзя использовать скриптлет и выражение EL в testатрибуте одного whenтега.

Автор: Matt Размещён: 22.05.2013 01:16

-2 плюса

1042 Репутация автора

В классе Java:

    public class EnumTest{
    //Other property link
    private String name;
    ....

        public enum Status {
                ACTIVE,NEWLINK, BROADCASTED, PENDING, CLICKED, VERIFIED, AWARDED, INACTIVE, EXPIRED, DELETED_BY_ADMIN;
            }

        private Status statusobj ;

    //Getter and Setters
}

Итак, теперь POJO и enum obj созданы. Теперь EnumTest вы будете устанавливать в объекте сеанса, используя в классе сервлета или контроллера session.setAttribute ("enumTest", EnumTest);

На странице JSP

<c:if test="${enumTest.statusobj == 'ACTIVE'}">

//TRUE??? THEN PROCESS SOME LOGIC
Автор: Pavan Размещён: 15.06.2016 07:51

12 плюса

8033 Репутация автора

Вот еще две возможности:

Константы JSP EL 3.0

Пока вы используете как минимум версию 3.0 EL, вы можете импортировать константы на свою страницу следующим образом:

<%@ page import="org.example.Status" %>
<c:when test="${dp.status eq Status.VALID}">

Однако некоторые IDE еще не понимают этого (например, IntelliJ ), поэтому вы не получите никаких предупреждений, если сделаете опечатку, до момента выполнения.

Это будет мой предпочтительный метод, когда он получит надлежащую поддержку IDE.

Вспомогательные методы

Вы можете просто добавить геттеры в ваше перечисление.

public enum Status { 
  VALID("valid"), OLD("old");

  private final String val;

  Status(String val) {
    this.val = val;
  }

  public String getStatus() {
    return val;
  }

  public boolean isValid() {
    return this == VALID;
  }

  public boolean isOld() {
    return this == OLD;
  }
}

Тогда в вашем JSP:

<c:when test="${dp.status.valid}">

Это поддерживается во всех IDE и будет работать, если вы еще не можете использовать EL 3.0. Это то, что я делаю в данный момент, потому что это сохраняет всю логику в моем перечислении.

Также будьте осторожны, если возможно, чтобы переменная, хранящая перечисление, была нулевой. Сначала вам нужно проверить это, если ваш код не гарантирует, что он не равен нулю:

<c:when test="${not empty db.status and dp.status.valid}">

Я думаю, что этот метод лучше тех, в которых вы устанавливаете промежуточное значение в JSP, потому что вы должны делать это на каждой странице, где вам нужно использовать enum. Однако с этим решением вам нужно только объявить получатель один раз.

Автор: Rupert Madden-Abbott Размещён: 07.07.2017 08:46

1 плюс

110 Репутация автора

При использовании инфраструктуры MVC я помещаю следующее в мой контроллер.

request.setAttribute(RequestParameterNamesEnum.INBOX_ACTION.name(), RequestParameterNamesEnum.INBOX_ACTION.name());

Это позволяет мне использовать следующее на моей странице JSP.

<script> var url = 'http://www.nowhere.com/?${INBOX_ACTION}=' + someValue;</script>

Это также может быть использовано в вашем сравнении

<c:when test="${someModel.action == INBOX_ACTION}">

Который я предпочитаю вставлять строковый литерал.

Автор: ElectronicBlacksmith Размещён: 10.07.2017 04:21

-1 плюса

1 Репутация автора

Я делаю это так, когда есть много точек, чтобы использовать ...

public enum Status { 

    VALID("valid"), OLD("old");

    private final String val;

    Status(String val) {
        this.val = val;
    }

    public String getStatus() {
        return val;
    }

    public static void setRequestAttributes(HttpServletRequest request) {
        Map<String,String> vals = new HashMap<String,String>();
        for (Status val : Status.values()) {
            vals.put(val.name(), val.value);
        }
        request.setAttribute("Status", vals);
    }

}

JSP

<%@ page import="...Status" %>
<% Status.setRequestAttributes(request) %>

<c:when test="${dp.status eq Status.VALID}">
...
Автор: HS Shin Размещён: 12.11.2018 11:23

0 плюса

2022 Репутация автора

<%@ page import="com.example.Status" %>

1. ${dp.status eq Title.VALID.getStatus()}
2. ${dp.status eq Title.VALID}
3. ${dp.status eq Title.VALID.toString()}
  • Поместите импорт вверху , в заголовок страницы JSP
  • Если вы хотите работать с методом getStatus , следуйте # 1
  • Если вы хотите работать с самим элементом enum , следуйте либо # 2, либо # 3
  • Вы можете использовать == вместо эквалайзера
Автор: Mehdi Размещён: 08.06.2019 12:07
Вопросы из категории :
32x32