Не с тегами JSTL, нет.Они запускаются во время построения представления, а не во время отображения представления.Вы можете визуализировать это следующим образом: когда JSF создает представление, теги JSTL сначала выполняются снизу, и в результате получается чистое дерево компонентов JSF.Затем, когда JSF отображает представление, компоненты JSF работают сверху вниз, и в результате получается куча HTML.Итак, JSTL и JSF не работают синхронно, как вы ожидаете от кодирования.В момент выполнения <c:if>
#{topicId}
недоступен в области.
Вместо использования <c:if>
необходимо указать условие в атрибуте rendered
компонента JSFпредставляет интерес.Поскольку у вас их фактически нет, вы можете обернуть их в <ui:fragment>
.
<ul>
<ui:repeat value="#{topics.list}" var="topicId" >
<li>#{topicId}</li>
<ui:fragment rendered="#{topicId eq -1}"><br/></ui:fragment>
</ui:repeat>
</ul>
Альтернативы: <h:panelGroup>
<h:panelGroup rendered="#{topicId eq -1}"><br/></h:panelGroup>
или в вашем конкретном случае <h:outputText escape="false">
<h:outputText value="<br/>" escape="false" rendered="#{topicId eq -1}" />
, поскольку оба также не генерируют ничего другого для вывода HTML, когда не указаны атрибуты на стороне клиента.
См.также:
Не связано с конкретной проблемойэто неправильное место для <br/>
.Это будет игнорироваться любым веб-браузером, уважающим спецификацию HTML.Разве вы не имеете в виду, что это будет внутри <li>
?Или лучше, дайте ему class
и позвольте CSS дать ему margin-bottom
.