2011-08-26 68 views
4

我有一個XHTML頁面上提交回自己。
支持bean是會話作用域。在重定向到它自己的頁面上呈現h:dataable兩次,並給我重複的id錯誤。我可以直觀地看到表格被兩次渲染並且彼此相鄰。
我發現它有一點與backing bean具有faces html表的屬性有關,並且在返回時會再次創建,但最新的解決方案。JSF數據表綁定與會議作用域後臺bean得到渲染一次又一次每個請求

以下內容大致來自JavaBeat的tutorial。唯一的區別是我的支持bean是Session Scoped。

我也releaize我的問題可能不清除它不夠好,但代碼應該在這裏:)這是

支持bean

import java.util.ArrayList; 
import java.util.List; 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 
import javax.faces.component.html.HtmlDataTable; 
import javax.faces.event.ValueChangeEvent; 

import com.example.common.web.bean.BaseBean; 

@ManagedBean(name = "registrationBean") 
@SessionScoped 
public class RegisterationViewManagedBean extends BaseBean { 


    private String field; 
    private List<Employee> employees; 
    private Employee employee; 
    private HtmlDataTable htmlDataTable; 
    private List<Employee> list = new ArrayList(); 

    public void setSelected(ValueChangeEvent event) { 
     employee = (Employee) htmlDataTable.getRowData(); 
     list = new ArrayList<Employee>(); 
     list.add(employee); 
    } 

    public List<Employee> getEmployees() { 
     return employees; 
    } 

    public void setEmployees(List<Employee> employees) { 
     this.employees = employees; 
    } 

    public HtmlDataTable getHtmlDataTable() { 
     return htmlDataTable; 
    } 

    public void setHtmlDataTable(HtmlDataTable htmlDataTable) { 
     this.htmlDataTable = htmlDataTable; 
    } 

    public Employee getEmployee() { 
     return employee; 
    } 

    public void setEmployee(Employee employee) { 
     this.employee = employee; 
    } 

    public String getField() { 
     return field; 
    } 

    public void setField(String field) { 
     this.field = field; 
    } 

    public String dataSubmit() { 
     for (Employee employee : this.list) { 
      System.out.println(employee.getCity()); 
      System.out.println(employee.getName()); 
      System.out.println(employee.getEmpNo()); 
     } 
     return "success"; 
    } 

    public String submit() { 
     this.employees = new ArrayList<Employee>(); 
     Employee employee1 = new Employee(); 
     employee1.setCity("Bangalore"); 
     employee1.setEmpNo("1"); 
     employee1.setName("Krishna"); 
     Employee employee2 = new Employee(); 
     employee2.setCity("Bangalore"); 
     employee2.setEmpNo("2"); 
     employee2.setName("ShunmugaRaja"); 
     Employee employee3 = new Employee(); 
     employee3.setCity("Bangalore"); 
     employee3.setEmpNo("3"); 
     employee3.setName("JoyChristy"); 
     this.employees.add(employee1); 
     this.employees.add(employee2); 
     this.employees.add(employee3); 
     return "success"; 
    } 
} 

XHTML頁面

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core"> 



    <ui:define name="body"> 

     <h:form> 
      <h:dataTable var="loc" value="#{registrationBean.employees}" 
       binding="#{registrationBean.htmlDataTable}"> 
       <h:column> 
        <h:selectOneRadio onclick="radioButton(this);" 
         valueChangeListener="#{registrationBean.setSelected}"> 
         <f:selectItem itemValue="null" /> 
        </h:selectOneRadio> 
       </h:column> 
       <h:column> 
        <h:outputText value="#{loc.name}" /> 
       </h:column> 
       <h:column> 
        <h:outputText value="#{loc.empNo}" /> 
       </h:column> 
       <h:column> 
        <h:outputText value="#{loc.city}" /> 
       </h:column> 
      </h:dataTable> 
      <!-- Summary ends --> 
      <div class="submitButtons"> 
       <h:commandButton id="register" action="#{registrationBean.submit}" 
        value="Perform Some Action" /> 
      </div> 
     </h:form> 
    </ui:define> 
</ui:composition> 

堆棧跟蹤

Caused by: java.lang.IllegalStateException: component with duplicate id "j_id397249623_10fed7a7:j_id397249623_10fed7bd:j_id397249623_10fed793" found 
    at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.checkIds(DefaultFaceletsStateManagementStrategy.java:784) 
    at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.checkIds(DefaultFaceletsStateManagementStrategy.java:800) 
    at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.checkIds(DefaultFaceletsStateManagementStrategy.java:800) 
    at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.checkIds(DefaultFaceletsStateManagementStrategy.java:800) 
    at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.saveView(DefaultFaceletsStateManagementStrategy.java:432) 
    at org.apache.myfaces.application.StateManagerImpl.saveView(StateManagerImpl.java:160) 
    at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1554) 
    at org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:281) 
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:59) 
    at org.apache.myfaces.tomahawk.application.ResourceViewHandlerWrapper.renderView(ResourceViewHandlerWrapper.java:93) 
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:59) 
    at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:85) 
    at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:239) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:191) 

enter image description here

+0

@ Java Ka Baby upvoting我也想知道答案。 – amod

+0

任何想法@BalusC? –

+1

一切看起來都很好。我首先排除Facelet模板組合和MyFaces被懷疑。在基本的''頁面中測試它,沒有任何模板包含/定義/組合。如果解決了這個問題,那麼你必須展示你的頁面是如何組成的,也許你做了一個Facelet模板設計的錯誤。如果不是這樣,用Mojarra而不是MyFaces進行測試。如果解決了這個問題,請將它作爲MyFaces傢伙的錯誤報告,以及一個* complete * SSCCE。 – BalusC

回答

6

的問題是,你正在使用一個會話作用域bean來存儲頁面綁定。第一次按預期呈現網頁。第二次,綁定已經是一個組件,所以所有的孩子都是重複的。這個問題不能解決JSF實現的變化(因爲它們都具有從facelets繼承的相同代碼)。嘗試使用兩個bean,一個會話作用域,另一個請求使用綁定作用域。

+0

是的,這就是我最初的判斷,就像我所說的那樣,但它看起來似乎沒有發生與Mojarra有關的實施問題,但需要在結束之前做更多的調查,所以現在只停留在這一邊,但會在幾天內更新。 –

+0

我明白了。 MyFaces在該部分中進行了優化,以減少構建視圖所花費的時間,因此它不檢查組件是否已經創建,因爲它假設(所有綁定都應該是請求範圍,對嗎?)。當您使用會話作用域綁定在同一瀏覽器上打開兩個窗口時,會發生無效情況。在這種情況下,一種觀點可能會破壞另一種觀點。由於這個原因,在會話範圍bean上使用綁定被認爲是無效的。 – lu4242

+0

你說過「所有綁定應該是請求範圍,對不對?」是否正確的任何文件說明這一點。@ BalusC你同意這種說法。 –