【问题标题】:JSF - How to get old and new value when using Primefaces RowEditEvent?JSF - 使用 Primefaces RowEditEvent 时如何获取新旧值?
【发布时间】:2013-10-23 20:14:58
【问题描述】:

我有一个包含 2 列(名称和描述)的数据表,当有人更新一行并单击触发 execBacking.update 方法的复选标记时,我想更新我的数据库。

在这种方法中,我通过转换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>

支持豆

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()));
        }
    }

【问题讨论】:

  • 您是否有兴趣将整行的旧值作为单个对象或单个列获取?
  • 两者都行。我只需要name 的原始值,因为它是PK。

标签: java jsf jsf-2 primefaces


【解决方案1】:

我建议不要name 作为主键,而是添加一个自动递增的id 字段并将其设为主键,不要 strong> 使该字段可由用户编辑。这保证您始终可以访问要更新的记录。

一般来说,尝试按照您尝试的方式修改数据库中的主键是一种不好的做法。

【讨论】:

  • 无法更改数据库。我正在重写一个有 15 年历史的 perl 应用程序,主键是名称。我知道这不是最佳做法,但这是我必须使用的。
  • 好的...计划 B 然后将旧的 name 简单地存储在第二个变量中并以这种方式处理它
  • 理想情况下,我想我想以某种方式通过 f:attribute 或 f:param 或类似的方式传递原始值,而不是向我的 Exec 对象添加重复的“名称”。
  • 最终结果是您必须在某处复制它。如果是我,我会在对象中添加一个“originalName”字段。我能给你的最好的建议。它可以是一个瞬态值
【解决方案2】:

您可以在您有兴趣使用的组件上注册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 的实现,我们在这里使用&lt;f:ajax/&gt; 来确保在文本框上触发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

      }

我按照 JSF 规范的建议使用@ViewScopedhere,以避免不必要的副作用。

【讨论】:

  • 但是如果我使用 valueChangeListener,它不会与 &lt;p:ajax event="rowEdit" listener="#{backing.update}" /&gt; 一起工作吗?
  • @Catfish - 我不能肯定地说,但我想不出为什么不这样做的原因
猜你喜欢
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 2019-10-26
  • 2012-02-21
相关资源
最近更新 更多