Primefaces修改包含数据库数据的数据表

时间:2013-12-21 21:23:24

标签: jsf primefaces datatable

我想修改从mysql数据库显示数据的数据表:

                <p:dataTable id="contrats" var="contrat" value="${contrat.getContratFromDataBase()}" rowKey="#{contrat.idContrat}"
                 selection="#{tabBeanContrat.contratTab}" editable="true" editMode="cell" >
                 <p:column selectionMode="multiple"  style="width:2%" /> 

                    <p:column headerText="Ref Propale">
                                <p:cellEditor> 
                        <f:facet name="output"><h:outputText id="refPropale" value="#{contrat.refPropale}" ></h:outputText></f:facet>
                        <f:facet name="input"><p:inputText id="modelInputrefPropale" value="#{contrat.refPropale}"/></f:facet>                      
                        </p:cellEditor>
                    </p:column>
                    <p:column headerText="Ref Commande">
                            <p:cellEditor> 
                        <f:facet name="output"><h:outputText value="#{contrat.refCommande}"></h:outputText></f:facet>
                        <f:facet name="input"><p:inputText id="modelInputrefCommande" value="#{contrat.refCommande}"/></f:facet> 
                        </p:cellEditor>
                    </p:column>
                    <p:column headerText="Description">
                                <p:cellEditor> 
                        <f:facet name="output"><h:outputText value="#{contrat.description}"></h:outputText></f:facet>
                        <f:facet name="input"><p:inputText id="modelInputdescription" value="#{contrat.description}"/></f:facet> 
                        </p:cellEditor>
                    </p:column>
                    <p:column headerText="Total jh vendus">
                            <p:cellEditor> 
                        <f:facet name="output"><h:outputText value="#{contrat.chargeVendue}"></h:outputText></f:facet>
                        <f:facet name="input"><p:inputText id="modelInputchargeVendue" value="#{contrat.chargeVendue}"/></f:facet> 
                        </p:cellEditor>
                    </p:column>
                    <p:column headerText="Budget (€HT)">
                            <p:cellEditor> 
                        <f:facet name="output"><h:outputText value="#{contrat.budget}"></h:outputText></f:facet>
                        <f:facet name="input"><p:inputText id="modelInputbudget" value="#{contrat.budget}"/></f:facet> 
                        </p:cellEditor>
                    </p:column>
                    <p:column headerText="Statut">
                            <p:cellEditor> 
                        <f:facet name="output"><h:outputText value="#{contrat.statut}"></h:outputText></f:facet>
                        <f:facet name="input"><p:inputText id="modelInputstatut" value="#{contrat.statut}"/></f:facet> 
                        </p:cellEditor>
                    </p:column>
                </p:dataTable>

方法getContratFromDataBase()从我的msql数据库中的表中检索数据。 所以问题是当我想要修改单元格时,不考虑新值(不显示新值),因为我使用value =“$ {contrat.getContratFromDataBase()}”因此它将始终显示值的数据库。有没有人有想法解决我的问题。

谢谢!

2 个答案:

答案 0 :(得分:0)

诀窍在于您的托管bean getContractsFromDataBase()方法。 每次调用属性时,该方法都不应该询问数据库。

  • 考虑使用返回Contract对象列表的新方法“getContracts”。
  • 必须在PostConstruct时或第一次调用getContracts时填充列表(使用getContractsFromDataBase)。
  • 检查bean范围是否适合您的需求
  • 设置p:dataTable value =“$ {yourbean.contracts}”...

示例:

  ArrayList<Contract> contracts = null;
  Public List<Contract> getContracts {
    if (contracts == null)
      contracts = getContractsFromDatabase();
    return contracts;
  }

修改

您想要编辑数据表中的值(editable =“true”editMode =“cell”),因此添加ajax事件以触发单元格更改:

 <p:ajax event="cellEdit" listener="#{tabBeanContrat.onCellEdit}" />

在托管bean上添加事件 tabBeanContrat

 public void onCellEdit(CellEditEvent event) {  
        Object oldValue = event.getOldValue();  
        Object newValue = event.getNewValue();  
        if(newValue != null && !newValue.equals(oldValue)) {  
            // apply changes here (call method to update DB)
        }  
    }  

答案 1 :(得分:0)

嗨,谢谢你的回答,

更准确地说,这是我的tabBeanContrat bean:

            public static ArrayList<Contrat> getContratFromDB() {
            try {

                PreparedStatement ps = conec.prepareStatement("select * from contrats");
                ArrayList<Contrat> al = new ArrayList<Contrat>();
                ResultSet rs = ps.executeQuery();
                boolean found = false;
                while (rs.next()) {
                    Contrat c = new Contrat();
                    c.setRefPropale(rs.getString("RefPropale"));
                    c.setRefCommande(rs.getString("RefCommande"));
                    c.setDescription(rs.getString("Description"));
                    c.setChargeVendue(rs.getDouble("ChargeVendue"));
                    c.setBudget(rs.getFloat("Budget"));
                    c.setStatut(rs.getString("StatutCharge"));     

                    al.add(c);
                    found = true;
                }
                rs.close();
                if (found) {
                    return al;
                } else {
                    return null; // no entires found
                }
            } catch (Exception e) {
                System.out.println("Error In getContratFromDB() -->" + e.getMessage());
                return (null);
            }
        }

然后在我的Contrat课程中,我有这个方法:

   public ArrayList<Contrat> getContratFromDataBase() {
    return TabBeanContrat.getContratFromDB();
}

所以我必须把它放在我的tabBeanContrat @ManagedBean(name =“tabBeanContrat”)中:

   private List<Contrat> contrats = new ArrayList<Contrat>();

    public List<Contrat> getContrats() {            
            if (contrats == null)
              contrats = getContratFromDB();
            return contrats;            
    }

Finnaly我必须将我的数据表的值从value="${contrat.getContratFromDataBase()}"更改为value="${tabBeanContrat.contrats}"