У меня есть 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">
Я не уверен, возможно ли это.
java
jsp
jakarta-ee
jstl
IaCoder
источник
источник
При использовании Spring MVC может быть полезен язык выражений Spring (SpEL):
источник
<c:if>
и<c:when>
(они терпят неудачу).У вас есть 3 варианта, ни один из которых не идеален:
Вы можете использовать скриптлет в
test
атрибуте:<c:when test="<%= dp.getStatus() == Status.VALID %>">
Здесь используется перечисление, но также используется скриптлет, что не является «правильным» способом в JSP 2.0. Но самое главное, это не работает, если вы хотите добавить еще одно условие к тому же самому
when
using${}
. А это означает, что все переменные, которые вы хотите протестировать, должны быть объявлены в скриптлете или сохранены в запросе или сеансе (pageContext
переменная недоступна в.tag
файлах).Вы можете сравнить со строкой:
<c:when test="${dp.status == 'VALID'}">
Это выглядит чистым, но вы вводите строку, которая дублирует значение перечисления и не может быть проверена компилятором. Поэтому, если вы удалите это значение из перечисления или переименуете его, вы не увидите, что эта часть кода больше не доступна. Вы в основном должны каждый раз выполнять поиск / замену кода.
Вы можете добавить каждое из используемых значений перечисления в контекст страницы:
<c:set var="VALID" value="<%=Status.VALID%>"/>
а затем вы можете сделать это:
<c:when test="${dp.status == VALID}">
Я предпочитаю последний вариант (3), хотя он также использует скриптлет. Это потому, что он использует его только тогда, когда вы устанавливаете значение. Позже вы можете использовать его в более сложных выражениях EL вместе с другими условиями EL. В варианте (1) нельзя использовать скриптлет и выражение EL в
test
атрибуте одногоwhen
тега.источник
Enum.valueOf(Class<T> enumType, String name)
которого будет срабатывать,ELException
если перечисление не имеет константы с таким именем. Выражение не всегда будет ложным.Итак, чтобы полностью решить мою проблему, мне нужно было сделать следующее:
Тогда я смог:
который работал, как ожидалось.
источник
Вот еще две возможности:
Константы JSP EL 3.0
Если вы используете EL версии не ниже 3.0, вы можете импортировать константы на свою страницу следующим образом:
Однако некоторые IDE этого еще не понимают (например, IntelliJ ), поэтому вы не получите никаких предупреждений, если сделаете опечатку, до времени выполнения.
Это был бы мой предпочтительный метод, когда он получит надлежащую поддержку IDE.
Вспомогательные методы
Вы можете просто добавить геттеры в свое перечисление.
Затем в вашем JSP:
Это поддерживается во всех IDE и также будет работать, если вы еще не можете использовать EL 3.0. Это то, что я делаю сейчас, потому что это сохраняет всю логику в моем enum.
Также будьте осторожны, если переменная, хранящая перечисление, может иметь значение null. Вам нужно сначала проверить это, если ваш код не гарантирует, что он не равен нулю:
Я думаю, что этот метод превосходит те, в которых вы устанавливаете промежуточное значение в JSP, потому что вам нужно делать это на каждой странице, где вам нужно использовать перечисление. Однако с этим решением вам нужно только один раз объявить получатель.
источник
${MyEnum.}
вводе, ставит курсор сразу после точки и нажимает,Ctrl+Space
чтобы отобразить предложения.Для этого делаю следующее:
Выглядит некрасиво, но работает!
источник
У меня нет ответа на вопрос Корнеля, но есть замечание по поводу других примеров скриптов. Большинство выражений неявно доверяют свойству
toString()
, ноEnum.valueOf()
ожидает, что значение, полученное из / соответствуетEnum.name()
свойству. Поэтому следует использовать, например:источник
Добавьте в перечисление метод, например:
Например
Тогда вы можете использовать:
источник
При использовании инфраструктуры MVC я помещаю в свой контроллер следующее.
Это позволяет мне использовать на моей странице JSP следующее.
Его также можно использовать при сравнении
Я предпочитаю вводить строковый литерал.
источник
источник
Я вообще считаю плохой практикой смешивать код java с файлами jsps / tag. Использование 'eq' должно помочь:
источник
==
вместоeq
? Они оба делают одно и то же, так что здесь нет никакого «трюка».Я так делаю, когда есть много точек ...
JSP
источник
В классе Java:
Итак, теперь созданы POJO и enum obj. Теперь EnumTest вы установите в объект сеанса, используя класс сервлета или контроллера session.setAttribute ("enumTest", EnumTest);
На странице JSP
источник