2017-11-18 160 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) –