2011-11-09 1 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" /> 

A partir du code ci-dessus, les valeurs pouvant être datées peuvent être modifiées dans le champ <h:inputText> et soumises. Ces valeurs modifiées sont vus dans action() méthode de bean StudentBean2. Comme j'ai suivi le journal, il a montré que lorsque je soumets la page dans la phase "Apply Request Values" la méthode getStudentList() est appelée. Dans cette méthode, je fais l'appel JDBC pour récupérer les étudiants de la base de données et définir le nouveau studentlist.Comment Datatable contient mes valeurs modifiées

Mais dans la phase "Invoke Application", dans la méthode action() j'obtiens les données éditées dans la liste que j'ai soumise. Comment cela se passe-t-il exactement? JSF vous les a définies lors de la phase de mise à jour des valeurs du modèle.

Répondre

2

Pendant cette phase, la méthode processUpdates() de chaque composant sera invoquée. Dans le cas du <h:dataTable>, c'est le UIData#processUpdates(). Pour chaque ligne, il appellera alors la même méthode du composant d'entrée, qui est dans votre cas UIInput#processUpdates().

En gros:

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) 
    } 
} 

au Unrelated problème concret, faire l'appel JDBC dans la méthode de lecture est une mauvaise idée. La méthode getter sera appelée plus d'une fois pendant la vie du bean, donc l'appel JDBC sera inutilement fait trop de fois. Vous devriez faire l'appel JDBC dans le constructeur de bean (post) à la place. Voir aussi Why JSF calls getters multiple times.

Questions connexes