2013-11-11 3 views
3

Это называется 3 раза, для каждой строки один раз. (Пример таблицы имеет 3 строки)<c:when test> оценивает всегда false

.... 
<ui:param name="rowIndex" value="#{cc.attrs.rowIndex}" /> 
<ui:param name="rowActive" value="#{cc.attrs.activeRow}" /> 
<c:set var="index"   value="#{rowIndex}" type="java.lang.Long"/> 
<c:set var="activeRowIndex" value="#{rowActive}" type="java.lang.Long"/> 

<c:choose> 
    <c:when test="${index == 2}"> 
     ACTIVE 
    </c:when> 
    <c:when test="${index != activeRowIndex}"> 
     ${index} - ${activeRowIndex} - INACTIVE 
    </c:when> 
    <c:otherwise> 
     NONE 
    </c:otherwise> 
</c:choose> 
.... 

Результат:

0 - 1 - НЕАКТИВНО

1 - 1 - НЕАКТИВНО

2 - 1 - НЕАКТИВНО

Я бы ожидал:

0 - 1 - АКТИВНО

NONE

ACTIVE

Я совершенно невежественны, почему результат настолько отличается от того, что я ожидал. Так что я надеюсь, что вы можете мне помочь :-)

+2

Почему вы изначально использовали тег '[jsp]' в вопросе, в то время как вы явно используете его преемники Facelets? (как указано '' и '# {cc.attrs.xxx}') – BalusC

+0

спасибо за изменения –

ответ

5

Используемые имена переменных указывают на то, что вы используете композит внутри повторяющегося компонента, например <h:dataTable> или <ui:repeat>.

JSTL-теги выполняются во время создания времени просмотра, в тот момент, когда дерево компонентов JSF построено на основе исходного кода XHTML. Однако атрибут var повторяющегося компонента доступен только во время визуализации визуализации, в тот момент, когда вывод HTML создается на основе дерева компонентов JSF.

В эффектах, по крайней мере, #{cc.attrs.rowIndex} является всегдаnull когда JSTL работает.

Когда вы в зависимости от условий, которые доступны только во время визуализации зрения, то вы должны использовать атрибут JSF компонента вместо JSTL <c:choose>/<c:if>rendered.

E.g.

Обратите внимание, что эта проблема не влияет на <c:set>. Он просто создает сопоставление переменных EL («псевдоним»), он не сразу оценивает выражение EL и сохраняет его результат где-то (пока scope не определен). Также обратите внимание, что ${} и #{} ведут себя точно так же, когда Facelets используется вместо JSP. Поскольку ${} в основном является наследием старого JSP, вы должны предпочесть исключительно использование #{}, чтобы избежать путаницы самостоятельно и ваших будущих сопровождающих.

+0

Это работает. Теперь я займу некоторое время, почему и как это работает ;-) спасибо за дополнительную информацию. очень полезно! –

+0

Добро пожаловать. Этот ответ может помочь в получении лучшего понимания: http://stackoverflow.com/questions/3342984/jstl-in-jsf2-facelets-makes-sense – BalusC

Смежные вопросы