2013-10-15 53 views
6

我有一個數據表2列(名稱和說明),我想更新我的數據庫,當一個人更新一行,並點擊觸發execBacking.update方法的複選標記。JSF - 如何在使用Primefaces RowEditEvent時獲取舊值和新值?

在這種方法中,我通過鑄造event.getObject()來獲得新值,但我怎樣才能獲得舊值?該名稱是我的主鍵,所以我需要舊值來知道在數據庫中更新哪一行。

XHTML頁面

<p:ajax event="rowEdit" listener="#{execBacking.update}" update=":execForm:execMessages" /> 

    <p:column headerText="Name"> 
    <p:cellEditor> 
     <f:facet name="output"> 
      <h:outputText value="#{exec.name}" /> 
     </f:facet> 
     <f:facet name="input"> 
      <h:inputText value="#{exec.name}" /> 
     </f:facet> 
    </p:cellEditor> 
    </p:column> 

    <p:column headerText="Description"> 
    <p:cellEditor> 
     <f:facet name="output"> 
      <h:outputText value="#{exec.description}" /> 
     </f:facet> 
     <f:facet name="input"> 
      <h:inputText value="#{exec.description}" /> 
     </f:facet> 
    </p:cellEditor> 
    </p:column> 

    <p:column headerText="Actions"> 
    <p:rowEditor /> 
    <p:commandLink styleClass="ui-icon ui-icon-trash" type="submit" actionListener="#{execBacking.delete}" update=":execForm:execMessages" > 
      <f:attribute name="execName" value="#{exec.name}" /> 
     </p:commandLink> 
    </p:column> 
</p:dataTable> 

支持bean

public void update(RowEditEvent event) { 

     Dao dao = new Dao(ds); 
     Exec exec = (Exec) event.getObject(); 
     System.out.println("name = "+exec.getName()); //New name 
     System.out.println("desc = "+exec.getDescription()); //New desc 
     try { 
      // If the new exec was updated successfully 
      if(dao.updateExec(accessBacking.getUsername(), null, exec.getName(), exec.getDescription())) { 
       FacesContext.getCurrentInstance().addMessage("growl", new FacesMessage(FacesMessage.SEVERITY_INFO, "Success", "Exec Updated Successfully!")); 
      } else { 
       FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Error Updating Exec!")); 
      } 
     } catch (Exception e) { 
      FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage())); 
     } 
    } 
+0

您是否有興趣將整行的舊值作爲單個對象或單個列? – kolossus

+0

兩者都可以工作。我所需要的就是'name'的原始值,因爲它是PK。 – Catfish

回答

4

我建議name是你的主鍵,而是添加一個自動遞增id場,使您的主鍵,並且不要使該字段可由用戶編輯。這可確保您始終可以訪問要更新的記錄。

一般來說,嘗試修改數據庫中的主鍵的做法是不正確的做法。

+1

無法更改數據庫。有一個15歲的Perl應用程序,我正在重寫,主鍵是名稱。我知道這不是最好的做法,但這正是我需要處理的。 – Catfish

+0

好吧......然後,計劃B將簡單地將舊的'name'存儲在第二個變量中,並以這種方式處理 – StormeHawke

+0

理想情況下,我想我想以某種方式通過f:attribute或f:param傳遞原始值或類似的東西,而不是添加一個重複的「名稱」我的Exec對象。 – Catfish

0

您可以使用註冊的組件上ValueChangeListener你有興趣:

<p:column headerText="Description"> 
    <p:cellEditor> 
     <f:facet name="output"> 
      <h:outputText value="#{exec.name}" /> 
     </f:facet> 
     <f:facet name="input"> 
     <h:inputText value="#{exec.name}"> 
      <f:valueChangeListener binding="#{keyChangedListener}"/> 
      <f:ajax/> 
     </h:inputText> 
     </f:facet> 
    </p:cellEditor> 
</p:column> 

keyChangeListener將對應的ValueChangeListener的實施和我們使用<f:ajax/>這裏,以確保valueChanged事件被觸發上文本框。否則,監聽器將不會被通知。你的聽衆應該是這個樣子:

@ManagedBean(name="keyChangedListener") 
@ViewScoped 
public class KeyChangeListener implements ValueChangeListener{ 

    public void processValueChange(ValueChangeEvent event) throws AbortProcessingException{ 
      Object oldValue = event.getOldValue(); //get the old value 
      Object newValue = event.getNewValue(); //get the new value 

     } 

我使用的@ViewScoped這裏所告知JSF規格,以避免不必要的副作用。

+0

但是,如果我使用valueChangeListener,它將不會與''它會工作嗎? – Catfish

+0

@卡通魚 - 我不能肯定地說,但我想不出它的原因 – kolossus

相關問題