2011-11-09 90 views
2
<h:dataTable value="#{studentBean2.studentList}" var="student"> 
    <h:column> 
     <f:facet name="header"> 
      <h:outputText value="STUDENT-ID" /> 
     </f:facet> 
     <h:outputText value="#{student.studentId}" />  
    </h:column> 
    <h:column> 
     <f:facet name="header"> 
      <h:outputText value="STUDENT-NAME" /> 
     </f:facet> 
     <h:inputText value="#{student.studentName}" /> 
    </h:column> 
    ......... 
    ......... 
</h:dataTable> 
<h:commandButton type="submit" action="#{studentBean2.action}" value="ENTER" /> 

從上面的代碼中,可以在<h:inputText>字段中編輯數據表值並提交。在action()豆的方法StudentBean2中可以看到那些編輯的值。Datatable如何保存我編輯的值

當我跟蹤日誌時,它顯示當我在階段「應用請求值」中提交頁面時,將調用getStudentList()方法。在這種方法中,我執行JDBC調用來從數據庫中提取學生,並設置新提取的studentlist

但在「調用應用程序」階段,在方法action()中,我得到了已提交的列表中已編輯的數據。這究竟發生了什麼?

回答

2

JSF在更新模型值階段爲您設置了它們。在此階段中,將調用每個組件的processUpdates()方法。在<h:dataTable>的情況下,它是UIData#processUpdates()。對於每一行,它會調用輸入組件的相同方法,這在你的情況下是UIInput#processUpdates()

基本上是:

get data model of UIData; // studentList = studentBean2.getStudentList() 
for (every row of data model) { 
    get the current row item by index; // student = studentList.get(index) 
    for (every child UIInput component of UIData) { 
     set its value; // student.setStudentName(value) 
    } 
} 

無關的具體問題,做getter方法內的JDBC調用是一個壞主意。在bean的生命中,getter方法將被多次調用,所以JDBC調用將被不必要地進行太多次。您應該在bean的(後)構造函數中進行JDBC調用。另見Why JSF calls getters multiple times