Jsf p:数据表未编辑

Jsf p:数据表未编辑,jsf,primefaces,datatable,Jsf,Primefaces,Datatable,我正在尝试创建一个DataTables,通过单击单元格编辑,如下所示: 我的问题是,该表不考虑修改。 我可以显示MySQL数据库中的数据。该表已正确加载,没有错误。当我尝试修改一个单元格时,它会按预期变成一个输入。但当我更改值并按enter键时,单元格将返回到其原始值。如果我在该单元格上重新进入编辑模式,我的修改将重新出现。不在数据库中进行任何修改 我对JSF和PrimeFaces不是很放心,我肯定错过了一些明显的东西 这是我的密码: 托管Bean: package Application;

我正在尝试创建一个DataTables,通过单击单元格编辑,如下所示:

我的问题是,该表不考虑修改。 我可以显示MySQL数据库中的数据。该表已正确加载,没有错误。当我尝试修改一个单元格时,它会按预期变成一个输入。但当我更改值并按enter键时,单元格将返回到其原始值。如果我在该单元格上重新进入编辑模式,我的修改将重新出现。不在数据库中进行任何修改

我对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);
        }
    }
}
包应用;
导入java.io.Serializable;
导入java.util.List;
导入javax.annotation.PostConstruct;
导入javax.ejb.ejb;
导入javax.faces.application.FacesMessage;
导入javax.faces.context.FacesContext;
导入javax.inject.Named;
导入javax.faces.view.ViewScoped;
导入org.primefaces.event.CellEditEvent;
导入org.primefaces.event.RowEditEvent;
@命名(value=“plantCtrl”)
@视域
公共类PlantCtrl实现可序列化{
@EJB
私人种植园;
公共PlantCtrl(){
}
@施工后
公共void init(){
}
公众植物名录{
返回plantDAO.allPlants();
}
公共PlantDAO getPlantDAO(){
返回plantDAO;
}
公共空间setPlantDAO(PlantDAO PlantDAO){
this.plantDAO=plantDAO;
}
公共无效onRowEdit(RowEditEvent事件){
FacesMessage msg=新的FacesMessage(“工厂编辑”);
FacesContext.getCurrentInstance().addMessage(null,msg);
}
公共作废onRowCancel(RowEditEvent事件){
FacesMessage msg=新的FacesMessage(“编辑已取消”);
FacesContext.getCurrentInstance().addMessage(null,msg);
}
public void onCellEdit(CellEditEvent事件){
对象oldValue=event.getOldValue();
Object newValue=event.getNewValue();
if(newValue!=null&!newValue.equals(oldValue)){
FacesMessage msg=新的FacesMessage(FacesMessage.SEVERITY_信息,“单元格已更改”,“旧的:+oldValue+”,新的:+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();
    }
}
包应用;
导入java.util.List;
导入javax.ejb.Stateless;
导入javax.persistence.EntityManager;
导入javax.persistence.PersistenceContext;
导入javax.persistence.Query;
@无国籍
公共类PlantDAO{
@PersistenceContext(unitName=“CarnivorousGardenPU”)
私人实体管理者;
公开列出所有植物(){
Query Query=em.createNamedQuery(“Plant.findAll”);
返回query.getResultList();
}
公共空间添加(工厂p){
em.p;
em.flush();
}
公共空间编辑(工厂p){
em.merge(p);
em.flush();
}
公共空间移除(工厂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>

仪表板
使用单击和右键单击进行单元格编辑

java由Netbeans自动生成,作为数据库中的实体类。我不是为了不让这篇文章超载而发帖的,但是如果需要,请毫不犹豫地询问。

像这样修改托管bean的几行代码

//....

List<Plant> plants;

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

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

//....
  • 在托管bean中修改
    onEditMethod

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

  • 嗨,现在需要的是一个。这有助于您解决问题(有时甚至可以帮助您自己解决问题),也有助于我们帮助您……而且99.9%的此类问题与jsf和数据库无关。只需将其分开,然后查看值是否在服务器上结束。如果不是,那么它完全与jsf相关。如果是这样的话,那纯粹是数据库相关的abd而不是JSF嘿,谢谢你的回答,它成功了!你知道我如何保存数据吗?问题是event.getNewValue()将返回字符串、float等。。。取决于单元的类型。它不会返回对象本身,这使得以后使用我的编辑方法变得复杂。有没有办法从事件中获取已编辑的对象?@Cephou,我更新了我的答案,并添加了其他解释。还可以查看有关此的文档
    public void onRowEdit(RowEditEvent event) {
        Plant editedPlant = (Plant)event.getObject();
        plantDAO.edit(plant);
    
        FacesMessage msg = new FacesMessage("Plant Edited");
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }