Richfaces:a4j支持(action,actionListener)用于dataTable中的inputText

时间:2011-07-25 15:24:12

标签: datatable richfaces action actionlistener ajax4jsf

我有一个JSP页面,其中必须允许用户编辑列中的数据,并且在提交表单时,更新数据库中的相应表。此表中的行数是可变的。

对于可编辑的信息字段,我在JSP页面中有以下代码片段(我们将其命名为 Block A ):

  <h:inputText value="#{myBackingBean.theFieldValue}" >
    <a4j:support event="onchange" actionListener="#{myBackingBean.theActionListener}" action="#{myBackingBean.theAction}"/>
  </h:inputText>

以下代码段(我们将其命名为 Block B )来自支持bean:

public String theAction() {
    String outcome = null;
    System.out.println("the action method was invoked");
    return outcome;
}

public void theActionListener(ActionEvent actionEvent) {
    System.out.println("the action listener method was invoked");
}

如您所见,每当调用这些方法打印到控制台输出时。

我的问题是: 当我将 Block A 放在下面的块中时(表单中的单个 inputText组件):

<h:form id="myForm">
  (...)
    here I put Block A
  (...)
</h:form>

调用 Block B 没有问题。但是,如果我将 Block A 放在rich:dataTable组件中,因为我需要它(多个 inputText组件在表单中),以便将每行的inputText值存储到数据库(这里是我需要调用action和/或actionListener方法的地方):

<h:form id="myForm">
  <rich:dataTable id="myDataTable" value="#{myBackingBean.myObjectList}" var="item" binding="#{myBackingBean.myObjectHtmlDataTable}" rendered="#{!empty myBackingBean.myObjectList}" rows="20">
    (...)
      <rich:column>
          here I put Block A
      </rich:column>
    (...)
  </rich:dataTable>
</h:form>

在这种情况下,永远不会到达 Block B

我正在使用 JSF 1.2 RichFaces 3.3.3 ,所有需要的bean和导航规则都已正确配置。所有需要的getter和setter都在各自的类中。

请您给我一些建议让我的代码正常工作?提前谢谢。

1 个答案:

答案 0 :(得分:0)

我测试你的代码,它工作得非常好。两种动作方法都可以运行。

由于表单中的其他组件在服务器上处理时可能会出错,因此bean的方法无法运行。

您可以尝试限制服务器仅使用<a4j:region>处理已更改的<h:inputText>。如果可以调用操作方法,则可以确认它是由于表单中的其他组件引起的。

<rich:column>
  <a4j:region>
        <h:inputText value="#{myBackingBean.theFieldValue}" >
                <a4j:support event="onchange" actionListener="#{myBackingBean.theActionListener}"   action="#{myBackingBean.theAction}"/>
        </h:inputText>
    </a4j:region>
</rich:column>

如果您的<h:form>拥有onsubmit()事件处理程序,请确保它返回true以便提交表单。