List包含在JSF页面中不起作用的方法

时间:2011-11-21 14:29:32

标签: list jsf jstl equals

我有两个由同一个对象组成的列表。

我想检查第一个列表是否包含第二个列表的对象

<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方法,但没有帮助。

1 个答案:

答案 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>

另见: