I am not sure how to reset the primefaces datatable and then reload data into it.
Any ideas?
As soon as I click "Teacher" or "House Leadership Team", i send a ajax call and then I would like to completely reset the datatable and then reload data.
Here are the parts relating to the two panels:
#{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>
This part relates to choosing "House Leadership Team" or "Teacher" which will then trigger a ajax call updating the datatable.
<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>
This part is the 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;
}
This part is apart of the back bean showing the ajax method called and what is done with that method. I don't know what to put into the ajax method to reset the database and then load data back into the datatable.
The problem is that although you are calling your managed bean method, you are not telling the jsf datatable to "update" its contents.
This should help
<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>
The important part here is update="studentTable" which tells that after completing the ajax request, update the jsf component with id studentTable.
PS1: This assumest that your selectOneMenu and datatable are in the same form; if not you should replace update="studentTable" with the correct path. PS2: I kindly suggest you reading about DAO layers so that you can remove your findStudents method from your managed bean.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With