JSTL, если тег для одинаковых строк

91

У меня есть переменная из объекта на моей странице JSP:

<%= ansokanInfo.getPSystem() %>

Значение переменной - NAT, что является правильным, и я хочу применить определенные элементы страницы для этого значения. Как использовать тег, чтобы узнать случай? Я пробовал что-то вроде

<c:if test = "${ansokanInfo.getPSystem() == 'NAT'}">      
   process  
</c:if> 

Но приведенное выше ничего не отображает. как мне это сделать? Или я могу использовать скриптлеты, т.е.

<% if (ansokanInfo.getPSystem().equals("NAT"){ %>
process
<% } %>

Спасибо за любой ответ или комментарий.

Никлас Р.
источник
1
Не могли бы вы уточнить getPSystem()и ansokanInfo? вы их задаете в запросе или обращаетесь к ним через import?
Santhosh
1
IIRC Я устанавливал их в запросе, и решение (обходное решение) состояло в том, чтобы обновить веб-сферу, как сказал BalusC, а затем более новая версия может вызывать методы bean-компонентов по тегам. Я использовал стандартную веб-сферу в вопросе и некоторую версию до того, как jsp и jstl могли запускать методы. Пожалуйста, найдите мой другой вопрос, где BalusC сообщает нам, что я использовал версию веб-сферы, для которой требовалась более новая версия, чтобы иметь возможность вызывать методы.
Никлас Р.
1
Итак, вы обновили сервер приложений до версии 8? и это решение терпит неудачу?
Santhosh
@SanKrish Я сейчас не использую JSP. Я надеюсь, что это сработает для вас и что он был обновлен для более новых версий сервера приложений.
Никлас Р.

Ответы:

147

Пытаться:

<c:if test = "${ansokanInfo.PSystem == 'NAT'}">

JSP / Servlet 2.4 (я думаю, это номер версии) не поддерживает вызовы методов в EL, а поддерживает только свойства. Последние контейнеры сервлетов поддерживают вызовы методов (например, Tomcat 7).

Адам Гент
источник
1
Я обновил свой ответ на основе ответа Йорна. Совет к нему.
Адам Гент
3
Я отказался от JSP (X). Я использую Mustache ( github.com/samskivert/jmustache ) или свой собственный язык шаблонов JATL ( code.google.com/p/jatl ).
Адам Гент
1
Как бы вы сыграли несколько струн? Должен быть способ получше, чем<c:if test = "${ansokanInfo.PSystem == 'NAT' || ansokanInfo.PSystem == 'CAT'}">
Диллон
16

Я думаю, что в других ответах упускается одна важная деталь, касающаяся имени свойства, используемого в выражении EL. Правила преобразования имен методов в имена свойств указаны в Introspector.decpitalize, который является частью стандарта java bean-компонентов:

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

Таким образом, «FooBah» становится «fooBah», а «X» становится «x», но «URL» остается как «URL».

Итак, в вашем случае код JSTL должен выглядеть следующим образом, обратите внимание на заглавную букву «P»:

<c:if test = "${ansokanInfo.PSystem == 'NAT'}">
Йорн Хорстманн
источник
2
Получатели и сеттеры с соглашением об именах в значительной степени являются определением java bean-компонента. Думаю, нам нужна дополнительная информация о том, где переменная передается в jsp. Чтобы быть доступным для EL, он должен быть в некоторой области, например, как запрос или атрибут pageContext. Локальная переменная, созданная блоком сценария, не будет доступна для EL.
Йорн Хорстманн
5

Вы можете использовать скриптлеты, но это не выход. В наши дни встроенные скрипты или код JAVA в ваших файлах JSP считаются плохой привычкой.

Вам следует почитать о JSTL немного больше. Если объект ansokanInfo находится в области вашего запроса или сеанса, распечатайте объект (метод toString ()) следующим образом: $ {ansokanInfo} может предоставить вам некоторую базовую информацию. $ {ansokanInfo.pSystem} должен вызвать метод получения объекта. Если все это работает, вы можете использовать это:

<c:if test="${ ansokanInfo.pSystem  == 'NAT'}"> tataa </c:if>
JohanB
источник