2011-04-29 3 views
3

데이터베이스에서 데이터를보기 위해 HtmlDataTable을 사용하는 데 문제가 있습니다.h : dataTable binding => 중복 ID

구성 요소를 만들 때 표가 항상 (항상은 아님) 두 번째 열 일 때가 있습니다.

올바르게 표시되고 dtb 등으로 이동하지 않고 몇 번 새로 고침하면 3 대신 6 개의 열이 나타나며 응용 프로그램이 불안정해질 수 있습니다. 그것의 "구성 요소에 대한 중복 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을 유지하는 것입니다.

기능 요구 사항이 현재 선택된 행을 가져 오는 것이면 HtmlDataTable 테이블을 바인딩하는 대신 값으로 DataModel을 사용할 수도 있습니다.

+0

나를 (다시) 구해 줬습니다. 나는 하루 종일 아무것도 보지 못했다. 그리고 이제는 작동합니다! BalusC – gaffcz

+0

감사합니다. 끝났습니다. 다시 한 번 감사드립니다! – gaffcz

+0

BalusC, 요청 범위를 변경 한 후 더 이상 DataTable (저장, 편집, 삭제, dtb에 추가) 작업을 할 수 없습니다. 객체는 응답 후에 만료되므로 null 예외를보고합니다. 어떻게 든 을 사용할 수 있습니까? ViewScope를 사용하려고했지만 HtmlDataTable을 바인딩 할 때 보이지 않습니다. 아니면 해결할 다른 방법이 있습니까? 아니면 DataModel을 사용하려고합니까? – gaffcz

관련 문제