Datatable如何保存我编辑的值

时间:2011-11-09 11:51:09

标签: java jsf

<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中,我在已提交的列表中获取已编辑的数据。这究竟是怎么发生的?

1 个答案:

答案 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