如何在JSF数据表中显示行索引

如何在JSF数据表中显示行索引,jsf,datatable,Jsf,Datatable,在JSF数据表中,我想在行旁边显示行索引。。。比如: Column A Column B 1 xxx 2 yyy 我想我可以使用一个隐式el变量,比如#{rowIndex},但这不起作用 我发现的一个解决方案是为数据表创建一个绑定,并使用如下绑定: <h:dataTable var="item" value="#{controller.items}" binding="#{controller.dataTable}"> <

在JSF数据表中,我想在行旁边显示行索引。。。比如:

Column A    Column B
1           xxx
2           yyy
我想我可以使用一个隐式el变量,比如#{rowIndex},但这不起作用

我发现的一个解决方案是为数据表创建一个绑定,并使用如下绑定:

<h:dataTable var="item" value="#{controller.items}" binding="#{controller.dataTable}">
    <h:column>#{controller.dataTable.rowIndex}</h:column>
    <h:column>value</h:column>
</h:dataTable>

#{controller.dataTable.rowIndex}
价值
但是这个解决方案很复杂,当我在一个页面中有许多嵌套的数据表时,它不能很好地工作


关于如何更好地解决这个问题,有什么想法吗?

现有的解决方案对我来说并不坏。只要引用嵌套表的模型,行索引就应该在嵌套表中工作

    <h:dataTable border="1" value="#{nestedDataModel}" var="nested">
        <h:column>
            <h:dataTable border="1" value="#{nested}" var="item">
                <h:column>
                    <h:outputText value="#{nested.rowIndex}" />
                </h:column>
                <h:column>
                    <h:outputText value="#{item}" />
                </h:column>
            </h:dataTable>
        </h:column>
    </h:dataTable>
配置:

<managed-bean>
    <managed-bean-name>rowCounter</managed-bean-name>
    <managed-bean-class>tablerows.RowCounter</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

赛艇计数器
tablerows.RowCounter
要求
视图:


这是因为bean是请求范围,并且绑定到表单外部的只读控件。除非您希望行计数器是视图的全局计数器,否则它在嵌套数据表中不起作用。但是,我不认为行索引应该是视图的函数


对于嵌套数据表,最好从rowbean提供行索引。如果您决定也对数据集执行分页之类的操作,它将为您提供更多的控制。

此解决方案由Jamie Williams在上发布。他说它和战斧一起工作。我正在使用primefaces,它也支持它

<t:dataTable rowIndexVar="row" value="#{someBean.value}">  
    <h:column>  
        <h:outputText value="#{row + 1}"/>  
    </h:column>  
</t:dataTable>

在RichFaces中,有一种类似于Brent的解决方案:

<rich:dataTable value="#{backingBean.list}" var="v" rowKeyVar="index">
    <rich:column>
        <f:facet name="header">Index</f:facet>
        <h:outputText value="#{index + 1}" />
    </rich:column>
    <rich:column>
        <f:facet name="header">Name</f:facet>
        <h:outputText value="#{v.name}" />
    </rich:column>
</rich:dataTable>

指数
名称
这是我的工作表

<h:dataTable var="item" value="#{controller.items}">
    <h:column>#{controller.items.indexOf(item)}</h:column>
    <h:column>value</h:column>
</h:dataTable>

#{controller.items.indexOf(item)}
价值

我只是依赖于列表和var在此列表中的位置:

<h:column>
          <f:facet name="header">#</f:facet>
          #{bean.listValue.indexOf(varObject)+1}
</h:column>

#
#{bean.listValue.indexOf(varObject)+1}

Ursula的评论:“感谢您使用rowIndexVar的解决方案。我使用的是JSF 1.2和myFaces,它只在第+1行没有空格的情况下工作
”很好。为什么从JSF数据表中获取行号会如此复杂?维护JSF的人是否憎恨所有其他开发人员,并且他们故意让开发变得困难[.这个答案比下面的答案要新-也很简短。这个解决方案有一个问题:只有当你有一个合适的equals方法时,它才会起作用,否则你总是会得到-1。而且每个对象都必须不同。如果你在数据结构中有几个相等的对象,你总是会得到第一个位置(如果它是一个列表)。
<rich:dataTable value="#{backingBean.list}" var="v" rowKeyVar="index">
    <rich:column>
        <f:facet name="header">Index</f:facet>
        <h:outputText value="#{index + 1}" />
    </rich:column>
    <rich:column>
        <f:facet name="header">Name</f:facet>
        <h:outputText value="#{v.name}" />
    </rich:column>
</rich:dataTable>
<h:dataTable var="item" value="#{controller.items}">
    <h:column>#{controller.items.indexOf(item)}</h:column>
    <h:column>value</h:column>
</h:dataTable>
<h:column>
          <f:facet name="header">#</f:facet>
          #{bean.listValue.indexOf(varObject)+1}
</h:column>