我有两个由同一个对象组成的列表。
我想检查第一个列表是否包含第二个列表的对象
<ui:repeat var="item" value="#{userTypeController.permissionItems}">
<c:if test="#{userTypeController.permissionItemsUserType.contains(item)}">
<h:selectBooleanCheckbox value="#{true}"/>
<h:outputText value="#{item.getAction()}" />
</c:if>
<c:if test="#{!userTypeController.permissionItemsUserType.contains(item)}">
<h:selectBooleanCheckbox value="#{false}"/>
<h:outputText value="#{item.getAction()}" />
</c:if>
</ui:repeat>
但这似乎不起作用,我得到的都是假的。
我已经更改了equals和hashcode方法,但没有帮助。
答案 0 :(得分:1)
<c:if>
之类的JSTL标记在视图构建期间运行,结果只是JSF组件。 JSF组件在视图呈现时运行,结果仅为HTML。它们不会同步运行。 JSTL标记首先从上到下运行,然后JSF组件从上到下运行。
在你的情况下,当JSTL标记运行时,在任何地方都没有#{item}
的方法,因为它已被JSF组件定义,因此它总是被评估为JSTL,好像它是null
。您需要使用JSF组件。在您的特定情况下,<h:panelGroup rendered>
应该这样做:
<ui:repeat var="item" value="#{userTypeController.permissionItems}">
<h:panelGroup rendered="#{userTypeController.permissionItemsUserType.contains(item)}">
<h:selectBooleanCheckbox value="#{true}"/>
<h:outputText value="#{item.getAction()}" />
</h:panelGroup>
<h:panelGroup rendered="#{!userTypeController.permissionItemsUserType.contains(item)}">
<h:selectBooleanCheckbox value="#{false}"/>
<h:outputText value="#{item.getAction()}" />
</h:panelGroup>
</ui:repeat>