<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>
字段中编辑数据表值并提交。这些编辑的值可以在bean action()
的{{1}}方法中看到。
当我按照日志时,它显示当我在“应用请求值”阶段提交页面时,将调用StudentBean2
方法。在这个方法中,我进行JDBC调用以从数据库中获取学生并设置新获取的getStudentList()
。
但是在“调用应用程序”阶段,在方法studentlist
中,我在已提交的列表中获取已编辑的数据。这究竟是怎么发生的?
答案 0 :(得分: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的(post)构造函数中进行JDBC调用。另请参阅Why JSF calls getters multiple times。