2012-10-16 26 views
0

我有以下的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不爲空 - 按鈕工作。那麼我怎樣才能讓按鈕始終工作?

+0

隨着讀取整個q',datable會更好地放在視圖或會話範圍內,否則它會更難以正確地工作 – Daniel

+0

我解決了搜索結果中缺少數據的問題。這是一個例外,這是一個嚴重的問題。我現在只需要知道 - 爲什麼數據表數據調用的getter方法多次?什麼樣的電話號碼取決於以及如何最大限度地減少電話數量。 – gooamoko

+0

只需在getter方法中不要執行業務邏輯! – BalusC

回答

2

一個更好的方式來做到這將是(只是一個草圖):

// an action method in your backing bean. 
// This will call your search method and set the values behid your dataTable 
public void searchStudents(String pattern) { 
    setStudentsList(findStudent(pattern)); 
} 

的通話結束後更新您的dataTable後:

<p:commandButton update="resultsTable" action=#{studentProvider.findStudent(pattern)}" 

要回答你的第二個問題:Why JSF calls getters multiple times,這意味着把你的業務邏輯方法放入getter(沒有延遲加載)似乎是一個壞主意(另一個相關問題:JSF calling setter & getter multiple times)。