我有这段代码:
<c:if test="#{utils.getCounterOfCharOccurence(hideTypes, ';') != 0}">
<ui:repeat value="#{document.instanceList}" var="instance">
<c:set var="columnRendered" value="true"></c:set>
<c:forEach items="${hideTypes.split(';')}"
var="hideType">
<h:outputText value="#{hideType eq instance.documentInstanceType.mimeType}"/>
<c:if test="#{hideType eq instance.documentInstanceType.mimeType}">
<c:set var="columnRendered" value="false"></c:set>
<h:outputText value="#{columnRendered}|"/>
</c:if>
</c:forEach>
<a:outputPanel rendered="#{columnRendered == 'true'}">
<up:mimeTypeIcon type="#{instance.documentInstanceType.mimeType}"
icon="#{instance.documentInstanceType.iconPath}"
key="#{instance.instanceKey}" referenced="false"/>
</a:outputPanel>
</ui:repeat>
</c:if>
如您所见,我仅在columnRendered为true时呈现该outputPanel.
好吧,有时会出现这种情况(仅用于测试以批准它应该做什么):
<h:outputText value="#{hideType eq instance.documentInstanceType.mimeType}"/>
是的,所以它应该输入c:if并将columnRendered切换为false.但事实并非如此,所以columnRendered永远是真的……
你知道为什么吗?
解决方法:
JSF和JSTL没有按照您对编码的期望同步运行. JSTL在视图的构建期间运行(当要填充JSF组件树时),并且JSF在视图组件树的渲染时间期间运行(当要生成HTML输出时).您可以按如下方式对其进行可视化:JSTL首先从上到下运行,然后将结果移交给JSF,JSF又从上到下运行.
在您的特定情况下,对象实例永远不会出现在JSTL中.
而不是c:forEach,你应该使用ui:repeat而不是c:如果你应该使用JSF组件的渲染属性.我想重写代码,但hideTypes的使用是一团糟.而是将其转换为List< String>在模型中,使用纯JSF会更容易.这是一个启动示例,假设hideTypes是List< String>:
<h:panelGroup rendered="#{not empty hideTypes}">
<ui:repeat value="#{document.instanceList}" var="instance">
<a:outputPanel rendered="#{!hideTypes.contains(instance.documentInstanceType.mimeType)}">
<up:mimeTypeIcon type="#{instance.documentInstanceType.mimeType}"
icon="#{instance.documentInstanceType.iconPath}"
key="#{instance.instanceKey}" referenced="false"/>
</a:outputPanel>
</ui:repeat>
<h:panelGroup>