h:dataTable绑定=>重复的ID

时间:2011-04-29 19:57:42

标签: java jsf

使用HtmlDataTable查看数据库中的数据时遇到问题。

当我创建组件时,该表有时(并非总是)两列数

正确显示并且经过几次刷新(没有在dtb或其他东西中移动),例如有6列而不是3列,应用程序(有时)变得不稳定。 从那时起,我无法使用表,因为它报告“组件的重复ID”..

简单示例(来源:http://balusc.blogspot.com/2006/06/using-datatables.html):

<h:form id="bde">  
    <h:dataTable id="tbl"  
                 binding="#{myBDE.dataTable}"  
                 value="#{myBDE.dataList}"   
                 var="bdeItem">  
    <h:column>  
      <f:facet name="header">  
        <h:outputText value="S" />  
      </f:facet>  
      <h:outputText value="#{bdeItem.s}" rendered="#{!myBDE.editModeRow}"/>  
      <h:inputText value="#{bdeItem.s}" rendered="#{myBDE.editModeRow}" required="true" size="3"/>  
    </h:column>  

    <h:column>  
      <f:facet name="header">  
         <h:outputText value="ID" />  
      </f:facet>  
      <h:outputText value="#{bdeItem.id}"/>  
    </h:column>  
  </h:dataTable>  
</h:form> 

和java.class

protected HtmlDataTable dataTable;  

public void setDataTable(HtmlDataTable dataTable)   
{  
  this.dataTable = dataTable;  
}  

public HtmlDataTable getDataTable()   
{  
  if (dataTable == null)   
  {  
     dataTable = new HtmlDataTable();  
     dataTable.setRows(DEFAULT_TABLE_ROWS);  
   }  
   return dataTable;  
} 

错误信息:

javax.servlet.ServletException: Component ID j_idt92:bde:tbl:j_idt129 has already been found in the view.    
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:422)  

root cause  

java.lang.IllegalStateException: Component ID j_idt92:bde2:tbl:j_idt129 has already been found in the view.    
    com.sun.faces.util.Util.checkIdUniqueness(Util.java:821)  
    com.sun.faces.util.Util.checkIdUniqueness(Util.java:805)  
    com.sun.faces.util.Util.checkIdUniqueness(Util.java:805)  
    com.sun.faces.util.Util.checkIdUniqueness(Util.java:805)  
    com.sun.faces.util.Util.checkIdUniqueness(Util.java:805)  
    com.sun.faces.util.Util.checkIdUniqueness(Util.java:805)  
    com.sun.faces.application.view.StateManagementStrategyImpl.saveView(StateManagementStrategyImpl.java:144)  
    com.sun.faces.application.StateManagerImpl.saveView(StateManagerImpl.java:133)  
    com.sun.faces.application.view.WriteBehindStateWriter.flushToWriter(WriteBehindStateWriter.java:225)  
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:418)  
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)  
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)  
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)  
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)  
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:410)  

随后是组件树。 我认为代码中没有任何重复,但dataTable创建了一个新列,之后它真的重复了

我有两个工作类似的模块,第三个不起作用。

你遇到过这种问题吗?

感谢您的建议

1 个答案:

答案 0 :(得分:6)

如果bean是会话作用域而不是请求作用域,并且您在多个视图之间共享此bean,则会发生这种情况。最好的方法是在请求范围内保留组件绑定到的bean。

作为替代方案,如果功能要求是获取当前选定的行,您还可以使用DataModel作为值,而不是将表绑定到HtmlDataTable