2013-10-26 38 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示例非常类似于您想要实现的内容。 –