2017-11-18 140 views
0

我试图创建一个数据表与细胞编辑:点击如这里介绍:https://www.primefaces.org/showcase/ui/data/datatable/edit.xhtml号码:dataTable的不是编辑

我的问题是,该表将不会采取修改考虑在内。 我从MySQL数据库显示数据没有问题。该表正确加载,没有错误。当我尝试修改单元格时,它会按预期成为输入。但是当我改变这个值并按下回车键后,单元格就会回到原来的值。如果我在该单元格上重新进入编辑模式,我的修改会再次出现。在数据库中不做修改。

我对JSF和PrimeFaces不太放心,我肯定错过了一些明显的东西。

这里是我的代码:

托管Bean:

package Application; 

import java.io.Serializable; 
import java.util.List; 
import javax.annotation.PostConstruct; 
import javax.ejb.EJB; 
import javax.faces.application.FacesMessage; 
import javax.faces.context.FacesContext; 
import javax.inject.Named; 
import javax.faces.view.ViewScoped; 
import org.primefaces.event.CellEditEvent; 
import org.primefaces.event.RowEditEvent; 


@Named(value = "plantCtrl") 
@ViewScoped 

public class PlantCtrl implements Serializable { 

    @EJB 
    private PlantDAO plantDAO; 

    public PlantCtrl() { 
    } 

    @PostConstruct 
    public void init(){ 
    } 

    public List<Plant> getPlants() { 
     return plantDAO.allPlants(); 
    } 

    public PlantDAO getPlantDAO() { 
     return plantDAO; 
    } 

    public void setPlantDAO(PlantDAO plantDAO) { 
     this.plantDAO = plantDAO; 
    } 

    public void onRowEdit(RowEditEvent event) { 
     FacesMessage msg = new FacesMessage("Plant Edited"); 
     FacesContext.getCurrentInstance().addMessage(null, msg); 
    } 

    public void onRowCancel(RowEditEvent event) { 
     FacesMessage msg = new FacesMessage("Edit Cancelled"); 
     FacesContext.getCurrentInstance().addMessage(null, msg); 
    } 

    public void onCellEdit(CellEditEvent event) { 
     Object oldValue = event.getOldValue(); 
     Object newValue = event.getNewValue(); 

     if(newValue != null && !newValue.equals(oldValue)) { 
      FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cell Changed", "Old: " + oldValue + ", New:" + newValue); 
      FacesContext.getCurrentInstance().addMessage(null, msg); 
     } 
    } 
} 

PlantDAO:

package Application; 

import java.util.List; 
import javax.ejb.Stateless; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.persistence.Query; 

@Stateless 
public class PlantDAO { 

    @PersistenceContext(unitName = "CarnivorousGardenPU") 
    private EntityManager em; 

    public List<Plant> allPlants() { 
     Query query = em.createNamedQuery("Plant.findAll"); 
     return query.getResultList(); 
    } 

    public void add(Plant p) { 
     em.persist(p); 
     em.flush(); 
    } 

    public void edit(Plant p) { 
     em.merge(p); 
     em.flush(); 
    } 

    public void remove(Plant p) { 
     em.remove(em.merge(p)); 
     em.flush(); 
    } 
} 

XHTML:

<?xml version="1.0" encoding="UTF-8"?> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://xmlns.jcp.org/jsf/html" 
     xmlns:p="http://primefaces.org/ui" 
     xmlns:f="http://xmlns.jcp.org/jsf/core" 
     xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> 

    <h:head> 
     <title>Dashboard</title> 
    </h:head> 

    <h:body> 

     <ui:include src="inc/header.xhtml" /> 

     <h:form id="plantAdminList"> 

      <p:growl id="msgs" showDetail="true"/> 

      <p:dataTable id="plantsTable" var="plant" value="#{plantCtrl.plants}" editable="true" editMode="cell" widgetVar="cellPlants"> 
       <f:facet name="header"> 
        Cell Editing with Click and RightClick 
       </f:facet> 

       <p:ajax event="cellEdit" listener="#{plantCtrl.onCellEdit}" update=":plantAdminList:msgs, :plantAdminList:plantsTable" /> 

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

       <p:column headerText="Price"> 
        <p:cellEditor> 
         <f:facet name="output"><h:outputText value="#{plant.pricePlant}" /></f:facet> 
         <f:facet name="input"><p:inputText value="#{plant.pricePlant}" style="width:96%" label="Price"/></f:facet> 
        </p:cellEditor> 
       </p:column> 

      </p:dataTable> 

     </h:form> 

     <ui:include src="/inc/footer.xhtml" /> 

    </h:body> 

</html> 

Plant.java由Netbeans的自动生成的一个来自数据库的实体类。我不会因为没有超载这篇文章而发表它,但如果需要的话,请不要犹豫,问。

+0

嗨,我们需要的是一个[MCVE] 。这可以帮助你解决问题(有时甚至可以帮助你自己解决问题),它可以帮助我们帮助你... – Kukeltje

+0

99.9%的这些问题不是jsf和数据库相关的。只需将它分开并查看该值是否在服务器上结束。如果不是,它纯粹与jsf有关。如果它是纯数据库相关的abd不是jsf – Kukeltje

回答

1

修改几个这样

//.... 

List<Plant> plants; 

@PostConstruct 
public void init(){ 
    plants=plantDAO.allPlants(); 
} 

public List<Plant> getPlants() { 
    return plants; 
} 

//.... 

,也将努力为您希望您的托管bean的台词:当您更改值,然后按回车,细胞将反映所做的更改。

注意:如果你想坚持更改数据库,你将需要修改p:dataTable了一下,创建托管bean额外的逻辑来检测的修改和通过他们现有的plantDao.edit方法

。编码的最低将是:这样的

p:dataTable id="plantsTable" var="plant" value="#{plantCtrl.plants}" editable="true" widgetVar="cellPlants"> 

    <p:ajax event="rowEdit" listener="#{plantCtrl.onRowEdit}" 
      update=":plantAdminList:msgs, :plantAdminList:plantsTable" /> 
.... 
    <p:column style="width:32px"> 
     <p:rowEditor /> 
    </p:column> 
</p:dataTable> 
  • 修改onEditMethod内部管理的bean

    1. 修改数据表

      public void onRowEdit(RowEditEvent event) { 
          Plant editedPlant = (Plant)event.getObject(); 
          plantDAO.edit(plant); 
      
          FacesMessage msg = new FacesMessage("Plant Edited"); 
          FacesContext.getCurrentInstance().addMessage(null, msg); 
      } 
      
  • +0

    嘿,谢谢你的回答,它的工作!你知道我如何坚持数据吗?事情是,event.getNewValue()将返回字符串,浮点数等...取决于单元格。它不会返回对象本身,因此之后使用我的编辑方法会变得很复杂。有没有办法从事件中获取编辑的对象? – Cephou

    +0

    @Cephou,我用更多的解释更新了我的答案。另请查看关于[主题]的文档(https://www.primefaces.org/showcase/ui/data/datatable/edit.xhtml) –