有条件地在<h:datatable> </h:datatable>中呈现一行

时间:2014-02-04 15:53:40

标签: html jsp jsf jsp-tags

我正在尝试更改现有数据表(由以前的开发人员编写),以便您以sysadmin身份登录时可以看到整个表,但只有在以其他人身份登录时才能看到您自己的详细信息。

我尝试过为表中的每个值添加rendered标记。这让我看到我的检查工作正常,并使基本测试工作。该部分代码按预期运行。然而,有一个明显的缺陷,即无论是否填满,额外的行仍会生成。

这是我的代码:

<h:dataTable value="#{userBean.users}" var="userAccount"
                binding="#{userBean.userTable}"
                styleClass="defaultTable"
                headerClass="tableHeader"
                rowClasses="evenRow,oddRow"
                columnClasses="col512">

    <h:column>
        <f:facet name="header">
            <h:outputText value="Username"/>
        </f:facet>
        <h:commandLink value="#{userAccount.userName}"
                       action="#{userBean.edit}"
                       rendered="#{(userAccount.userName == settings.user.userName) 
                                       || settings.user.systemAdministrator}"/>
    </h:column>

    <h:column>
        <f:facet name="header">
            <h:outputText value="User Group"/>
        </f:facet>
        <h:outputText id="userGroup" value="#{userAccount.userGroup.userGroupName}"
                      rendered="#{(userAccount.userName == settings.user.userName)
                                       || settings.user.systemAdministrator}"/>
    </h:column>
</h:dataTable>

当不是systemAdministrator时(可预测)输出如下内容:

image

生成所有行但仅为当前用户填写。

我理解为什么会这样做,但我不知道如何让它去做我想做的事情。这就像我想要render /而不是render整行,但数据表是由列而不是行生成的,所以我看不到如何添加它。即使添加<c:if>,我也需要在行周围添加它,所以我不知道如何在列生成它时如何做到这一点。

我的另一个想法是,我可以检查一下该行是否为空,如果是这样,那就隐藏它?但这对我来说感觉有点脏。

哪些选项最好,如何在没有row标签的情况下绕过检查/隐藏行?或者我需要重组整个表格吗? (可能高于我的能力。)


编辑:

@xild建议的showClass / hideClass rowClasses如下所示:

enter image description here

即。相同但没有行之间的间断。

1 个答案:

答案 0 :(得分:1)

如果您不想看到该物品,请不要放入您的藏品。

List<Users> usersAllowed= new ArrayList<Users>();
for (Users user : allUsers) {
    if(condition){
       usersAllowed.add(user); 
    }
}

并使用此列表显示在数据表中。

如果您不想这样做,您也可以将渲染设置为“h:column”。

    <h:column rendered="#{(userAccount.userName == settings.user.userName)
                                       || settings.user.systemAdministrator}">
    </h:column>

或者最后你可以使用dataTable的rowClasses参数。 如果您不想看到该行,请使用:

  rowClasses="#{((userAccount.userName == settings.user.userName)
                                   || settings.user.systemAdministrator)) ? 'showClass' : 'hideClass'}"