【问题标题】:h:dataTable binding => duplicate IDh:dataTable 绑定 => 重复 ID
【发布时间】:2011-04-29 19:57:42
【问题描述】:

我在使用 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 创建了一个新列,然后它就真的重复了

我有两个工作相似的模块,第三个不工作。

你遇到过这样的问题吗?

感谢您的建议

【问题讨论】:

    标签: java jsf


    【解决方案1】:

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

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

    【讨论】:

    • 你(再次)救了我。我花了一整天的时间,什么也没有。现在它起作用了!谢谢你,BalusC
    • BalusC,将范围更改为请求后,我无法再使用 DataTable(保存、编辑、删除、添加到 dtb)。它报告空异常,因为对象在响应后过期。我可以以某种方式使用 吗?我尝试使用 ViewScope,但似乎没有使用 Binding HtmlDataTable。还是有其他方法可以解决?还是我真的应该尝试使用 DataModel?
    • 已解决> @ViewScoped + 实现 Serializable + 私有瞬态 HtmlDataTable
    • 哦,您使用的是 JSF 2.0?你应该提到过 :) 你可以在这里找到一个带有 @ViewScopedDataModel&lt;E&gt; 的 CRUD 示例:balusc.blogspot.com/2010/06/…
    • 我是新手,JSF 2.0 是我的首选。例如,谢谢,我已经使用过它了:) 我将尝试在下一个视图中使用 DataModel。但我不明白这一点:“当使用绑定属性将任何 UIComponent 绑定到 bean 时,@ViewScoped 会中断”。它适用于我,数据表绑定和视图范围一起......
    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 2016-10-26
    • 2018-05-07
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2015-10-28
    • 2011-05-21
    相关资源
    最近更新 更多