【问题标题】:Primefaces datatable Reset and Reload dataPrimefaces 数据表重置和重新加载数据
【发布时间】:2013-03-24 22:40:48
【问题描述】:

我不确定如何重置 primefaces 数据表,然后将数据重新加载到其中。

有什么想法吗?

当我点击“教师”或“House Leadership Team”时,我会发送一个 ajax 调用,然后我想完全重置数据表,然后重新加载数据。

以下是与两个面板相关的部分:

#{msgs.typeOfLeaderPunishment}
<f:ajax event="valueChange" listener="#{detentionForm.updateData()}" execute="typeOfLeader" render="typeOfPunishment studentTable">
    <p:selectOneMenu id="typeOfLeader" value="#{detentionForm.typeOfLeaderSelectedID}" style="width:400px" panelStyle="width:150px" effect="fade">
       <f:selectItems value="#{detentionForm.teacherTypes}" var="type" itemLabel="#{type.label}" itemValue="#{type.value}" />
    </p:selectOneMenu>
</f:ajax>

这部分涉及选择“House Leadership Team”或“Teacher”,这将触发更新数据表的 ajax 调用。

<p:dataTable id="studentTable" var="student" value="#{detentionForm.students}" paginator="true" rows="10" selection="#{detentionForm.studentSelected}" filterDelay="200" filteredValue="#{detentionForm.filteredStudents}" binding="#{detentionForm.studentTable}">  
      <f:facet name="header">  
           Students:   
      </f:facet>  
                    <p:column id="prefName" headerText="Preferred Name" sortBy="=#{student.prefName}" filterBy="#{student.prefName}" filterMatchMode="contains">  
                        #{student.prefName} 

                    </p:column>  
                    <p:column id="lastName" headerText="Last Name" sortBy="#{student.lastName}" filterBy="#{student.lastName}" filterMatchMode="contains">
                        #{student.lastName}
                    </p:column>
                    <p:column id="house" headerText="House" sortBy="#{student.house}">
                        #{student.house}
                    </p:column>
                    <p:column id="code" headerText="Student Code" sortBy="#{student.studentCode}" >
                        #{student.studentCode}
                    </p:column>
                    <p:column id="gender" headerText="Gender" sortBy="#{student.gender}">
                        #{student.gender}
                    </p:column>
                    <p:column id="formName" headerText="Form" sortBy="#{student.form}">
                        #{student.form}
                    </p:column>
                    <p:column id="yearLevel" headerText="Year Level" sortBy="#{student.yearLevel}">
                        #{student.yearLevel}
                    </p:column>
                </p:dataTable>  

这部分是数据表。

//ajax method called when user clicks on "House Leadership Team" or "Teacher" int the selectOneMenu tag
    public void updateData(){
        this.findStudents();


    }



    //populates the student list with student codes depending on what ledership was chosen (eg. HouseLeader -> import House students only)
    private void findStudents() {
        this.students.removeAll(this.students);
        int houseID =  this.findTeacherHouseID();
        PreparedStatement ps;
        Connection con;
        String sqlStudentsTeacher = "SELECT a.LastName, a.PrefName, a.Code, a.Gender, b.FormName, b.YearLevel, c.HouseName FROM detentioncentredb.tbl_students a, detentioncentredb.tbl_forms b, detentioncentredb.tbl_houses c WHERE a.Form = b.Id AND a.House = c.Id";
        String sqlStudentsHouseLeader = "SELECT a.LastName, a.PrefName, a.Code, a.Gender, b.FormName, b.YearLevel, c.HouseName FROM detentioncentredb.tbl_students a, detentioncentredb.tbl_forms b, detentioncentredb.tbl_houses c WHERE a.Form = b.Id AND a.House = c.Id AND a.House = ?";
        ResultSet rs;
        try {
            con = ds.getConnection();
            if(this.typeOfLeaderSelectedID == 1){
                ps = con.prepareStatement(sqlStudentsTeacher);
            }else{ //typeOfLeaderSelectedID must equal 2. >>>>>>>>>>>Make sure that makeDetention xhtml page has a specific filter and there must be a validator when the user selects a leadership ty.pe
                ps = con.prepareStatement(sqlStudentsHouseLeader);
                ps.setInt(1,houseID);
            }
            rs = ps.executeQuery();
            //Puts a row into a Student object and chucks into the student arraylist
            while(rs.next()){
                Student s = new Student();
                s.setForm(rs.getString("FormName"));
                s.setGender(rs.getString("Gender"));
                s.setHouse(rs.getString("HouseName"));
                s.setLastName(rs.getString("LastName"));
                s.setPrefName(rs.getString("PrefName"));
                s.setStudentCode(rs.getString("Code"));
                s.setYearLevel(rs.getString("YearLevel"));
                this.students.add(s);
            }
            rs.close();
            ps.close();
            con.close();
        } catch (SQLException ex) {
            Logger.getLogger(DetentionFormBean.class.getName()).log(Level.SEVERE, null, ex);
        }

    }


    private int findTeacherHouseID(){
        PreparedStatement ps;
        Connection con;
        String sqlTeacherHouseID = "SELECT House FROM detentioncentredb.tbl_teachers WHERE RegNumber = ?";
        ResultSet rs;
        int id = 0;
        try {
            con = ds.getConnection();
            ps = con.prepareStatement(sqlTeacherHouseID);
            ps.setInt(1, this.details.getUserName());
            rs = ps.executeQuery();
            while(rs.next()){
                id = rs.getInt("House");
            }
            rs.close();
            ps.close();
            con.close();
        } catch (SQLException ex) {
            Logger.getLogger(DetentionFormBean.class.getName()).log(Level.SEVERE, null, ex);
        }

        return id;
    }

这部分是后面 bean 的一部分,显示了调用的 ajax 方法以及该方法的作用。 我不知道在 ajax 方法中放入什么来重置数据库,然后将数据加载回数据表中。

【问题讨论】:

  • 能否给我们展示一下你的jsf页面的相关部分以及bean部分的ajax方法?
  • 添加了 xhtml 代码和一些支持 bean 代码。
  • 这在您的数据表定义中 binding="#{detentionForm.studentTable}" 有什么作用?
  • 哦,我正试图从支持 bean 访问组件,看看我是否可以从 java 代码中重置它。我应该删除它,因为我做不到。对不起。

标签: jsf primefaces datatable reset


【解决方案1】:

问题在于,尽管您正在调用托管 bean 方法,但您并没有告诉 jsf 数据表“更新”其内容。

这应该会有所帮助

<p:selectOneMenu id="typeOfLeader" value="#{detentionForm.typeOfLeaderSelectedID}">
    <f:selectItems value="#{detentionForm.teacherTypes}" var="type" itemLabel="#{type.label}" itemValue="#{type.value}" />
    <p:ajax event="change" update="studentTable" listener="#{detentionForm.updateData()}" />
</p:selectOneMenu>

这里重要的部分是 update="studentTable",它告诉我们在完成 ajax 请求后,更新 id 为 studentTable 的 jsf 组件。

PS1:这假设您的 selectOneMenu 和 datatable 格式相同;如果不是,则应将 update="studentTable" 替换为正确的路径。 PS2:我建议您阅读有关 DAO 层的内容,以便您可以从托管 bean 中删除 findStudents 方法。

【讨论】:

  • 但是我用 f:ajax 标记包装了 selectOneMenu 标记,并且有一个属性 render="StudentTable" 。我尝试了 标签,但它现在没有响应。
  • 是的,它仍然没有响应:(
  • 我可以知道,当您在列表中选择一个项目时,您的 updateData 方法是否被调用?你能调试一下,看看你的 sql 语句是否正常工作并生成一个有效的列表吗?
  • 是的,它正在做这一切。它会生成一个新列表,但是数据表正在更新以显示这个新列表,直到我在输入过滤器区域中输入一个字符(在 Preffered Name 列和 Last Name 列下)
  • @ApoorvKansal 尝试删除&lt;f:ajax&gt;(或&lt;p:ajax&gt;,无论您在代码中使用哪个)上的event 值。另外,请查看此答案的 PS。
【解决方案2】:

每当您使用 ajax 更改选择一个菜单时,您都在调用 updateData 方法。 尝试重建您在 updateData 方法上显示的“学生”列表。

【讨论】:

  • 是的,我就是这么做的。我仍然不知道为什么它没有更新。
  • 尝试调试您的代码。它在做你想做的事吗?
  • 是的。基本上一开始它不会更新,但是一旦我输入一些过滤输入,它就会更新到新列表(带过滤)
  • 有没有办法让我在过滤输入文本字段中自动输入一些数据,然后退格,以便数据表更新?
  • 我认为你必须把
    标签和表单中你必须做这个 ajax 的事情。
【解决方案3】:

我对 primefaces 4 数据表有同样的问题。

  1. 我已将 j2ee 版本从 j2ee6 更改为 j2ee7。
  2. 我已将 glassfish 服务器从 3.1.2 final 更改为 gf 4
  3. 我已将 jsf 版本从 2.2 更改为 2.2.4 并没有改变(仍然没有刷新)

感谢 Mehul Kaklotar,我在创建/编辑/删除数据库并刷新数据表后重建/调用 getList()。

注意:在&lt;p:commandbutton&gt;上添加update=":yourform:yourdatatable"

【讨论】:

    【解决方案4】:

    我已经通过使用 PrimeFaces remoteCommand 调用 dataTable 的 AJAX/jQuery filter() 函数取得了成功:

    <p:selectOneMenu id="typeOfLeader" value="#{detentionForm.typeOfLeaderSelectedID}"
                 style="width:400px" panelStyle="width:150px" effect="fade"
                 onchange="typeOfLeaderUpdate();">
    
    <f:selectItems value="#{detentionForm.teacherTypes}" var="type" itemLabel="#{type.label}" itemValue="#{type.value}" />
    <p:ajax event="change" oncomplete="typeOfLeaderUpdate();"/>
    
    <p:remoteCommand id="typeOfLeaderRemoteCommandId" name="typeOfLeaderUpdate"
                     actionListener="#{detentionForm.updateData()}"
                     update="studentTable"
                     oncomplete="student.filter();"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 2014-12-19
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      相关资源
      最近更新 更多