2011-04-29 37 views
3

我有一個問題,使用HtmlDataTable查看數據庫中的數據。h:dataTable綁定=>重複ID

當我創建組件時,該表有時(並非總是)列數的兩倍

它顯示正確,並經過多次刷新(無需移動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創建一個新的列,然後它真的重複

我有兩個工作相似的模塊,第三沒有工作。

你有沒有遇到過這種問題?

感謝意見

回答

5

如果Bean是會話範圍,而不是請求範圍和你分享多個視圖中這個bean會發生這種情況。最好的做法是將組件綁定到的bean保留在請求範圍中。

也可以使用DataModel作爲值,而不是將表綁定到HtmlDataTable,如果功能要求是獲取當前選定的行。

+0

你救了我(再次)。我花了整整一天的時間,沒有任何東西。現在它的工作!謝謝,BalusC – gaffcz 2011-04-29 20:24:47

+0

我希望,已經完成了。再次感謝! – gaffcz 2011-04-29 20:36:04

+0

BalusC,在更改範圍請求後,我無法再使用DataTable(保存,編輯,刪除,添加到dtb)。它報告空異常,因爲對象在響應後到期。以某種方式我可以使用嗎?我試圖使用ViewScope,但它似乎不與綁定HtmlDataTable。或者有另一種方法來解決它?或者我應該嘗試使用DataModel? – gaffcz 2011-04-30 09:05:13