【问题标题】:primefaces in-cell-editing not update data in databaseprimefaces 单元内编辑不更新数据库中的数据
【发布时间】:2013-11-27 04:46:25
【问题描述】:

我在 JEE 项目中使用 Primeface 4.0、JSF 2 和 jpa,我在单元格编辑中使用了 Primefaces 展示数据表中显示的示例。这是HTML代码

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
               xmlns:ui="http://java.sun.com/jsf/facelets"
               xmlns:f="http://java.sun.com/jsf/core"
               xmlns:h="http://java.sun.com/jsf/html"
               xmlns:rich="http://richfaces.org/rich"
               xmlns:a4j="http://richfaces.org/a4j"
               xmlns:p="http://primefaces.org/ui"
               xmlns:c="http://java.sun.com/jsp/jstl/core"
               template="/WEB-INF/templates/default.xhtml">


<ui:define name="content">
<center>






 <rich:panel  style="width : 800px; height : 551px; " > 
     <f:facet name="header" >

<h:outputText value="Tableau des articles" align="center" style="FONT-SIZE: small;"/>
            </f:facet>


    <h:form id="form">
  <p:growl id="messages" showDetail="true"/>  

    <p:contextMenu for="cars" widgetVar="cMenu">     
        <p:menuitem value="Edit Cell" icon="ui-icon-search" onclick="PF('carsTable').showCellEditor();return false;"/>    
        <p:menuitem value="Hide Menu" icon="ui-icon-close" onclick="PF('cMenu').hide()"/>    
    </p:contextMenu>  

   <p:dataTable id="cars" var="car" value="#{articlesbean.LMatpilotaccess1}" editable="true" editMode="cell" widgetVar="carsTable">  

        <f:facet name="header">  
            Matériel du pilotage et accessoires 
        </f:facet>  


  <p:ajax event="cellEdit" listenner="#{articlesbean.onCellEdit()}" update=":form:messages" /> 
        <p:column headerText="Serie" style="width:25%">                

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





           <p:column headerText="Prix unitaire HTVA" style="width:25%">               

               <p:cellEditor>  
                   <f:facet name="output"><h:outputText value="#{car.puhtva}" /></f:facet>  
                   <f:facet name="input"><p:inputText id="modelInput5" value="#{car.puhtva}" style="width:96%"/></f:facet>  
               </p:cellEditor>  
           </p:column>





            <p:column headerText="Montant HTVA" style="width:25%">               

               <p:cellEditor>  
                   <f:facet name="output"><h:outputText value="#{car.monthtva}" /></f:facet>  
                   <f:facet name="input"><p:inputText id="modelInput8" value="#{car.monthtva}" style="width:96%"/></f:facet>  
               </p:cellEditor>  
           </p:column>

            <p:column headerText="Montant TTC" style="width:25%">               

               <p:cellEditor>  
                   <f:facet name="output"><h:outputText value="#{car.montttc}" /></f:facet>  
                   <f:facet name="input"><p:inputText id="modelInput9" value="#{car.montttc}" style="width:96%"/></f:facet>  
               </p:cellEditor>  
           </p:column>

    </p:dataTable>  


    </h:form>




</rich:panel>






</center>
</ui:define>



</ui:composition>

这就是豆子

package com.pfe.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;

import org.primefaces.component.datatable.DataTable;
import org.primefaces.event.CellEditEvent;



import com.pfe.data.ArticlesDAO;
import com.pfe.model.Matpilotaccess1;
import com.pfe.model.Matpilotaccess2;
import com.pfe.model.Poteaux;
import com.pfe.model.Travgc1;
import com.pfe.model.Travgc2;
import com.pfe.model.Travresurbain;

@ManagedBean(name="articlesbean")

@ViewScoped
public class ArticlesBean implements Serializable{

    @Inject
    private ArticlesDAO articleDAO;
    @Inject
    private Matpilotaccess1 matpilotaccess1;
    @Inject
    private Matpilotaccess2 matpilotaccess2;
    @Inject
    private Poteaux poteaux ;
    @Inject
    private Travgc1 travgc1;
    @Inject
    private Travgc2 travgc2;
    @Inject
    private Travresurbain travresurbain;


    private List LMatpilotaccess1 = new ArrayList();
    private List LMatpilotaccess2 = new ArrayList();
    private List LPoteaux = new ArrayList();
    private List LTravgc1 = new ArrayList();
    private List LTravgc2 = new ArrayList();
    private List LTravresurbain = new ArrayList();




    public void onCellEdit(CellEditEvent event) {  
        Object oldValue = event.getOldValue();  
        Object newValue = event.getNewValue();  
          System.out.println("////////////////////////);
        if(newValue != null && !newValue.equals(oldValue)) {  

            DataTable s = (DataTable) event.getSource();
            Matpilotaccess1 d = (Matpilotaccess1) s.getRowData();

            articleDAO.Updatetable(d);
              System.out.println("///////////////////");
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cell Changed", "Old: " + oldValue + ", New:" + newValue);  
            FacesContext.getCurrentInstance().addMessage(null, msg);  
        }  
    } ///// getters and setters 

这里的问题是,甚至 ////////////// 都没有显示,这意味着 HTML 代码中存在问题,阻止了 onCellEdit 函数的执行!!!

【问题讨论】:

标签: jsf primefaces datatable


【解决方案1】:

我认为您只有一个问题:您的代码没有调用您的文章bean.onCellEdit() 方法。

这是我的简单方法(但我没有将richfaces 组件与primefaces 混合):

<h:form id="testForm">
            <p:growl id="messages" showDetail="true"/>
            <p:outputPanel id="testContainer">
            <p:dataTable id="testTable" value="#{tableBean.data}" var="entry" editable="true" editMode="cell">

                    <p:ajax event="cellEdit" listener="#{tableBean.onCellEdit}" process="@this" update=":testForm:messages"/>
(...)

用户在表格中编辑后,该消息正确显示。请尝试将richfaces 面板替换为primefaces panel 可能是出现此问题。

如果您在 p:ajax 中有一些更新问题,您可以使用RemoteCommand。但在这种情况下,您需要重新设计articlesbean 中的方法以:

public void onCellEdit() {
//do some thing

和xhtml:

<p:remoteCommand name="onCellEdit" action="#{articlesbean.onCellEdit()}" update=":form:messages" />
<p:dataTable id="cars" var="car" value="#{articlesbean.LMatpilotaccess1}" editable="true" editMode="cell" widgetVar="carsTable">  

        (...)

  <p:ajax event="cellEdit" oncomplete="onCellEdit()" /> 

RemoteCommand 提供了一种直接从 javascript 执行 JSF 支持 bean 方法的方法。

请试一试!

【讨论】:

  • 现在我又遇到了一个错误!!! javax.el.MethodNotFoundException: Method not found: com.pfe.controller.ArticlesBean@1bb3a11.onCellEdit()
  • 我认为 onCellEdit() 函数必须采取一些措施!!
  • 我怎样才能带来新的对象??
  • 抱歉回复晚了。这个问题现在是什么状态?带参数问题解决了吗?
  • 不,同样的错误仍然存​​在!你有什么想法可以帮助我吗?
【解决方案2】:

我解决了类似的问题,但我花了将近 3 天的时间才注意到 JSF 的吸气剂必须是真正的吸气剂(再次)。我的意思是tableBean.getData() 提供的列表必须是一个真正的getter,它提供了理想情况下在带有@PostConstruct 注释的void 方法中初始化的列表。 JSF 将围绕 bean 和所有代码生成一个Proxy 类以反映表中的更改。您只需编写代码实现对更改做出反应的操作(数据库中的持久更改、异步操作等)。

如果“list getter”不是真正的getter并返回另一个列表(在我的示例中,我过滤了原始字段中的列表),则在调用“listener method”之前所有更改都将丢失-它们被原始替换列表。

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 2014-08-03
    • 2014-01-20
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    相关资源
    最近更新 更多