Как Datatable содержит мои отредактированные значения - PullRequest
2 голосов
/ 09 ноября 2011
<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.

. Когда я следил за журналом, он показал, что когда я отправляю страницу на этапе "Применить значения запроса", метод getStudentList()называется.В этом методе я выполняю вызов JDBC для извлечения студентов из базы данных и устанавливаю только что извлеченные studentlist.

Но на этапе "Invoke Application" в методе action() я получаю отредактированные данные всписок, который я представил.Как именно это происходит?

1 Ответ

2 голосов
/ 09 ноября 2011

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

Не связанный с конкретной проблемой, выполнение вызова JDBC внутри метода get является плохой идеей.Метод getter будет вызываться более одного раза в течение жизни bean-компонента, поэтому вызов JDBC будет излишне выполняться слишком много раз.Вместо этого вы должны сделать JDBC-вызов в конструкторе (post) компонента.См. Также Почему JSF вызывает геттеры несколько раз .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...