我有以下的XHTML文檔:不能理解<p:dataTable>更新過程
<h:body>
<ui:composition template="templates/layout.xhtml">
<ui:define name="content">
<c:if test="#{sessionBean.userCode > 0}">
<h:form id="findStudentForm">
<p:outputPanel id="resultsPanel">
<c:if test="#{studentsBean.student != null}">
<h2><h:outputText value="#{studentsBean.student.fullName}"/></h2>
<h3>Personal data</h3>
. . .
<p align="center">
<p:commandButton value="Search students" update="@form">
<f:setPropertyActionListener value="#{null}"
target="#{studentsBean.student}"/>
</p:commandButton>
</p>
</c:if>
<c:if test="#{studentsBean.student == null}">
<h2>Student search</h2>
. . .
<p align="justify">
First name
<h:inputText value="#{studentsBean.pattern}"/>
<p:commandButton value="Поиск" update="resultsPanel"/>
</p>
<p:dataTable id="resultsTable" var="student"
value="#{studentsBean.studentsList}"
widgetVar="studentsTable" emptyMessage="No records found">
. . .
</p:column>
<p:column headerText="Actions">
<p:commandButton value="Details" update="@form">
<f:setPropertyActionListener value="#{student}"
target="#{studentsBean.student}"/>
</p:commandButton>
</p:column>
</p:dataTable>
</c:if>
</p:outputPanel>
</h:form>
</c:if>
<c:if test="#{sessionBean.userCode == 0}">
<ui:include src="templates/include/error.xhtml"/>
</c:if>
</ui:define>
</ui:composition>
</h:body>
而且我有以下管Bean(StudentsBean): 。 。 。
@Named(value = "studentsBean")
@RequestScoped
public class StudentsBean {
@Inject
SessionBean session;
private Student student = null;
private String pattern = "";
private String groupName = "";
@Inject
private StudentInterface studentProvider;
. . .
public String getPattern() {
return pattern;
}
public void setPattern(String pattern) {
this.pattern = pattern;
}
public List<Student> getStudentsList() {
List<Student> result = new ArrayList<Student>();
if (studentProvider != null) {
try {
result = studentProvider.findStudents(pattern);
} catch (StudentException e) {
session.printError(e.getMessage());
}
}
return result;
}
. . .
最後,我有一個類StudentsProvider:
public class StudentProvider implements StudentInterface {
private Connection connection = null;
. . .
@Override
public List<Student> findStudents(String pattern) throws StudentException {
List<Student> result = new ArrayList<Student>();
String addon = "";
if (pattern.trim().isEmpty()) {
addon = "TOP 10 ";
}
try {
PreparedStatement statement = connection.prepareStatement(
"SELECT " + addon + "st_pcode, gr_Name, st_FullName "
+ "FROM students, groups WHERE (st_grcode = gr_pcode) AND (st_FullName LIKE ?) "
+ "ORDER BY gr_Name, st_FullName;", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
statement.setString(1, pattern + "%");
ResultSet rs = statement.executeQuery();
while (rs.next()) {
result.add(getStudent(rs.getString("st_pcode")));
}
rs.close();
statement.close();
} catch (Exception e) {
throw new StudentException("Error reading list: " + e.getMessage());
}
return result;
}
public StudentProvider() throws StudentException {
try {
ConnectionProvider provider = new ConnectionProvider();
connection = provider.getConnection();
} catch (ConnectionException e) {
throw new StudentException("Connect error: " + e.getMessage());
}
}
@Override
public void finalize() throws Throwable {
connection.close();
super.finalize();
}
}
如果變量 「模式」 空字符串,返回的PreparedStatement 10 「第一」 的記錄。但是如果「模式」有內容 - PreparedStatement會找到一些記錄。在調試期間,似乎PreparedStatement運行良好並返回結果集,但沒有記錄顯示在「sultsTable」中。另外,我發現,雖然更新處理方法
studentProvider.findStudent(pattern)
多次調用。我認爲,這個方法調用的數量取決於「resultsTable」中記錄的數量。
在注入之前,硬連接的對象一切正常。怎麼了?
順便說一句,我不明白一件事。說,我有一個按鈕
<p:commandButton value="Details" update="@form">
<f:setPropertyActionListener value="#{student}"
target="#{studentsBean.student}"/>
</p:commandButton>
在「resultsTable」的每個記錄(請參閱前面的xhtml列表更多詳細信息)。我發現,這個按鈕有時不起作用。 如果resultsTable在開始時爲空 - 按鈕不起作用,但如果resultsTable不爲空 - 按鈕工作。那麼我怎樣才能讓按鈕始終工作?
隨着讀取整個q',datable會更好地放在視圖或會話範圍內,否則它會更難以正確地工作 – Daniel
我解決了搜索結果中缺少數據的問題。這是一個例外,這是一個嚴重的問題。我現在只需要知道 - 爲什麼數據表數據調用的getter方法多次?什麼樣的電話號碼取決於以及如何最大限度地減少電話數量。 – gooamoko
只需在getter方法中不要執行業務邏輯! – BalusC