2013-10-26 87 views
0

嗨,大家好,我有一個來自primefaces庫的數據表,我試圖包括編輯每個單元格的功能,當用戶在該行按下「保存」按鈕時,它將更新編輯的值到數據庫,但是當前當用戶編輯一個單元格時,他們將單元格更改爲第二個單元格,然後單擊單元格上的值與之前的值相同,但它不保存新值,另一個問題是當用戶在行末按下save時,傳遞給數據庫的值始終爲空,我如何解決這兩個問題?datatable不保存任何編輯

這裏是XHTML

<p:dataTable id="dataTable" var="u" value="#{userBean.getUserList()}" 
           paginator="true" rows="10" 

           paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
           rowsPerPageTemplate="5,10,15,25" 
           editable="true" editMode="cell" 
           > 
         <p:column> 
          <!-- 
          <p:ajax event="rowEdit" listener="{u.onEdit}" update=":form:messages" /> 
          <p:ajax event="rowEditCancel" listener="{u.onCancel}" update=":form:messages" /> 
          --> 

          <f:facet name="header"> 
           User ID 
          </f:facet> 
          #{u.userID} 
         </p:column> 

         <p:column headerText="Name" > 
          <p:cellEditor> 
           <f:facet name="output"> 
            <h:outputText value="#{u.name}" /> 
           </f:facet> 
           <f:facet name="input"> 
            <p:inputText id="NameInput" value="#{u.name}" 
               style="width:96%" /> 
           </f:facet> 
          </p:cellEditor> 
         </p:column> 

         <p:column headerText="Email"> 
          <p:cellEditor> 
           <f:facet name="output"> 
            <h:outputText value="#{u.email}" /> 
           </f:facet> 
           <f:facet name="input"> 
            <p:inputText id="EmailInput" value="#{u.email}" 
               /> 
           </f:facet> 
          </p:cellEditor> 
         </p:column> 

         <p:column headerText="Address"> 
          <p:cellEditor> 
           <f:facet name="output"> 
            <h:outputText value="#{u.address}" /> 
           </f:facet> 
           <f:facet name="input"> 
            <p:inputText id="AddressInput" value="#{u.address}" 
               /> 
           </f:facet> 
          </p:cellEditor> 
         </p:column> 

         <p:column> 
          <f:facet name="header"> 
           Created Date 
          </f:facet> 
          #{u.created_date} 
         </p:column> 

         <p:column> 
          <f:facet name="header"> 
           Delete 
          </f:facet> 
          <h:commandButton value="Delete" action="#{user.delete(u.userID)}" /> 
         </p:column> 

         <p:column> 
          <f:facet name="header"> 
           Save Edit 
          </f:facet> 
          <h:commandButton value="Save" action="#{user.editData(u.userID)}" /> 
         </p:column> 
        </p:dataTable> 

,這裏是支持bean雖然目前這只是從databale

public void editData(long userID) { 
     System.out.println(name); 
     PreparedStatement ps = null; 
     Connection con = null; 
     if (userID != 0) { 
      try { 
       Class.forName("com.mysql.jdbc.Driver"); 
       con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root"); 
       System.out.println(name); 
       String sql = "UPDATE user1 set name = '" + name + "', email = '" + email + "', address = '" + address + "' WHERE userId=" + userID; 
       ps = con.prepareStatement(sql); 
       int i = ps.executeUpdate(); 
       if (i > 0) { 
        System.out.println("Row updated successfully"); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 
       try { 
        con.close(); 
        ps.close(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

的確定年代最初獲得從它的值更新與值數據庫數據庫

謝謝

這裏我我就是這樣填充從數據庫中值的數據表,/ *

* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package richard.test; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 

import richard.test.User; 

@ManagedBean(name = "userBean") 
@SessionScoped 
public class UserBean { 

    List<User> list; 
    PreparedStatement ps = null; 
    Connection con = null; 
    ResultSet rs = null; 

    public List<User> getList() { 
     return list; 
    } 

    public List<User> getUserList() { 
     list = new ArrayList<User>(); 

     try { 
      Class.forName("com.mysql.jdbc.Driver"); 
      con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root"); 
      String sql = "select * from user1"; 
      ps = con.prepareStatement(sql); 
      rs = ps.executeQuery(); 
      while (rs.next()) { 
       User usr = new User(); 
       usr.setUserID(rs.getLong("userId")); 
       usr.setName(rs.getString("name")); 
       usr.setEmail(rs.getString("email")); 
       usr.setAddress(rs.getString("address")); 
       usr.setCreated_date(rs.getDate("created_date")); 
       list.add(usr); 
       Map<Long, Boolean> checked = new HashMap<Long, Boolean>(); 
       List<User> checkedItems = new ArrayList<User>(); 
       for (User item : list) { 
        if (checked.get(item.getUserID()) != null) { 
         checkedItems.add(item); 
         usr.delete(usr.getUserID()); 
        } 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       con.close(); 
       ps.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return list; 
    } 
} 

以下是完整的用戶bean代碼

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package richard.test; 

import javax.faces.application.FacesMessage; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.RequestScoped; 
import javax.faces.context.FacesContext; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import javax.faces.component.UIColumn; 
import javax.faces.event.ActionEvent; 
import org.primefaces.component.datatable.DataTable; 
import org.primefaces.event.CellEditEvent; 
import org.primefaces.event.RowEditEvent; 

@ManagedBean 
@RequestScoped 
public class User { 

    List<User> list; 
    PreparedStatement ps = null; 
    Connection con = null; 
    ResultSet rs = null; 
    private long userID = 1; 
    private String name; 
    private String address; 
    private Date created_date; 
    private String email; 
    boolean editable; 

    public boolean isEditable() { 
     return editable; 
    } 

    public void setEditable(boolean editable) { 
     this.editable = editable; 
    } 

    public String editAction(User order) { 
     order.setEditable(true); 
     return null; 
    } 

    public long getUserID() { 
     return userID; 
    } 

    public void setUserID(long userID) { 
     this.userID = userID; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String getAddress() { 
     return address; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 

    public Date getCreated_date() { 
     return created_date; 
    } 

    public void setCreated_date(Date created_date) { 
     this.created_date = created_date; 
    } 

    public String add() { 

     System.out.println("In add"); 
     SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); 
     int i = 0; 

     if (userID != 0) { 
      PreparedStatement ps = null; 
      Connection con = null; 
      try { 
       System.out.println("about to add to db"); 
       Class.forName("com.mysql.jdbc.Driver"); 
       con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root"); 
       String sql = "INSERT INTO user1(name, email, address, created_date) VALUES(?,?,?,?)"; 
       ps = con.prepareStatement(sql); 
       ps.setString(1, name); 
       ps.setString(2, email); 
       ps.setString(3, address); 
       if (created_date != null) { 
        String date = fmt.format(created_date); 
        Object obj = date; 
        if (obj == null) { 
         ps.setDate(4, null); 
        } else { 
         java.sql.Date dt = java.sql.Date.valueOf(new String(date)); 
         ps.setDate(4, dt); 
        } 
       } 

       i = ps.executeUpdate(); 
       System.out.println("Data Added Successfully"); 

      } catch (Exception e) { 
       System.out.println(e); 
      } finally { 
       try { 
        con.close(); 
        ps.close(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      if (i > 0) { 
       return "output"; 
      } else { 
       return "invalid"; 
      } 
     } else { 
      return "invalid"; 
     } 
    } 

    public void delete(long userID) { 
     PreparedStatement ps = null; 
     Connection con = null; 
     if (userID != 0) { 
      try { 
       Class.forName("com.mysql.jdbc.Driver"); 
       con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root"); 
       String sql = "DELETE FROM user1 WHERE userId=" + userID; 
       ps = con.prepareStatement(sql); 
       int i = ps.executeUpdate(); 
       if (i > 0) { 
        System.out.println("Row deleted successfully"); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 
       try { 
        con.close(); 
        ps.close(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 



    public void editData(long userID) { 
     PreparedStatement ps = null; 
     Connection con = null; 
     if (userID != 0) { 
      try { 
       Class.forName("com.mysql.jdbc.Driver"); 
       con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root"); 
       System.out.println(name); 
       String sql = "UPDATE user1 set name = '" + name + "', email = '" + email + "', address = '" + address + "' WHERE userId=" + userID; 
       ps = con.prepareStatement(sql); 
       int i = ps.executeUpdate(); 
       if (i > 0) { 
        System.out.println("Row updated successfully"); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 
       try { 
        con.close(); 
        ps.close(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

} 
+1

你用兩個不同的managedBeans(首批命名'userBean'的產生DataTable的名單,其中第二名爲'user'在您的行動。方法被放置)?你使用了哪個範圍?請有足夠的信息來找出問題的原因。 – Diganta

+0

我們需要更多關於「名稱」/「電子郵件」/等的細節。變量,用在你的editData方法中。你如何確保他們持有用戶輸入的值? –

+0

您好,是的,首先檢查我正在使用另一個名爲userBean的bean的細節,我已經發布了上面的代碼,並且@The學徒,這是我目前擁有它的問題並不包含編輯第二個用戶將該值恢復爲該字段中的原始值,但是一個用戶提交給它傳遞的數據庫爲空 – user1924104

回答

1

的主要問題是,你有兩個用戶對象:

  • 用戶ü - 當前選定的用戶。
  • 用戶用戶 - 只是一個ManagedBean,很可能沒有狀態(沒有ID,沒有名字,沒有地址)。

當執行編輯操作您嘗試使用u.iduser.nameuser.address等 你需要做的,是採取從所有的值u對象。

有許多不同的方法(我從來沒有使用第三個,但它應該工作,它是最接近你已經擁有):

A1。你可以保持當前選擇的對象在你的UserBean並與setPropertyActionListener設置:

<f:setPropertyActionListener target="#{userBean.selectedUser}" value="#{u}" /> 

然後你就可以調用同一個bean實現的編輯方法(它已完全進入selectedUser對象,它可以實現編輯本身的只需將操作委託給編輯方法實現的對象)。

A2。您可以將您的編輯方法中的UserBean並通過整個用戶對象作爲參數:

<h:commandButton value="Save" action="#{userBean.editData(u)}" /> 

A3。或者你可以叫:

<h:commandButton value="Save" action="#{u.editData()}" /> 

代替:

<h:commandButton value="Save" action="#{user.editData(u.userID)}" /> 
+0

非常感謝,我已經嘗試了所有三個建議但我仍然只是將空值放到數據庫中,可能是因爲當我將數據輸入到數據表中單擊單元格時,它將恢復到之前的值,並因此傳遞空值? – user1924104

+0

就是這樣。如何實現rowEdit/cellEdit事件(就像在PrimefacesShowcase中一樣)? RowEdit示例非常類似於您想要實現的內容。 –