【问题标题】:f:ajax execute="@this" does not fire listener methodf:ajax execute="@this" 不会触发监听器方法
【发布时间】:2014-03-21 00:27:20
【问题描述】:

在以下情况下,它永远不会调用侦听器方法。

TestBean.java

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ViewScoped
@ManagedBean(name="testBean")
public class TestBean implements Serializable {

    private int score1;
    private int score2;
    private int score3;

    public void resetPage(){
        score1 = 35;
        score2 = 35;
        score3 = 35;
    }

    public int getScore1() {
        return score1;
    }

    public void setScore1(int score1) {
        this.score1 = score1;
    }

    public int getScore2() {
        return score2;
    }

    public void setScore2(int score2) {
        this.score2 = score2;
    }

    public int getScore3() {
        return score3;
    }

    public void setScore3(int score3) {
        this.score3 = score3;
    }

}

requirements.xhtml

<h:form id="requirementsForm" prependId="false">
    <h:messages style="color: #FF0000; font-size: 13px; margin: 10px; white-space: nowrap;" /> 
    <table>
    <tr>
        <td> Score 1: </td>
        <td>
            <h:inputText value="#{testBean.score1}" required="true" />
        </td>
    </tr>
    <tr>
        <td> Score 2: </td>
        <td>
            <h:inputText value="#{testBean.score2}" required="true" />
        </td>
    </tr>
    <tr>
        <td> Score 3: </td>
        <td>
            <h:inputText value="#{testBean.score3}" required="true" />
        </td>
    </tr>
    <tr>
    <td colspan="2">
        <h:commandLink style="margin-left: 1px;" styleClass="submitLink">
             <img src="#{request.contextPath}/circuit_images/refresh.png" />
                  <f:ajax execute="@this"
                          render="@form" 
                          listener="#{testBean.resetPage}"/>
        </h:commandLink>
    </td>
    </tr>
    </table>
</h:form>

我知道执行的默认值是@this, 我删除了它并尝试了同样的问题。 它从不调用 testBean#resetPage() 方法。

          <f:ajax execute="@this"
                  render="@form" 
                  listener="#{testBean.resetPage}"/>

当我更新 execute="@form" 时,它可以工作。

          <f:ajax execute="@form"
                  render="@form" 
                  listener="#{testBean.resetPage}"/>

表单有一些带有必需和其他验证的输入字段。 但是对于重置按钮,我不希望处理这些验证。

我在&lt;h:commandLink&gt; &amp; &lt;f:ajax&gt; 上都添加了 immediate="true",但没有成功。 我正在使用 JSF 2.2 和 Tomcat 6.0.35。

我也提到了 http://www.primefaces.org/showcase/ui/resetInput.jsf & http://omnifaces.org/docs/javadoc/current/org/omnifaces/eventlistener/ResetInputAjaxActionListener.html 我无法解决这个问题。

【问题讨论】:

  • 你为什么在表单中使用prependId="false"
  • 为了避免表单 id 作为每个字段 id 的前缀,同时也为了避免所有元素的 id 过长,当我需要在 javascript 或 JQuery 中使用它们时,每次我需要转义默认的 prepender '\\:' .
  • 你可以试试这个 button.execute="@form" 和 immediate="true"。
  • 对于按钮或链接,实际上如果我将 execute="@form" 与 immediate=true 一起使用,它正在调用该方法,但如果我提交带有空值的表单,我仍然会看到空字段验证方法调用后的错误,尽管方法用一些默认值更新了它们。

标签: ajax jsf-2 jsf-2.2


【解决方案1】:

将您的 jsf 版本降级到 2.1。只有Tomcat8支持javaee7,jsf 2.2是javaee7特有的。

【讨论】:

  • Tomcat 是一个 servlet 容器。它永远不会支持 JavaEE,无论是什么版本。
  • 比你所了解的,我说:“Apache Tomcat 项目很自豪地宣布发布 Apache Tomcat 8.0.3 (beta) 版。Tomcat 8 与 Java EE 7 保持一致。除了支持 Java EE 规范的更新版本之外,与 Tomcat 7 相比,Tomcat 8 还包括许多改进。" 取自 tomcat.apache.org
  • 既然我们在 SO,让我引用JSF wiki:“JSF 2.2 至少需要 Servlet 3.0,因为新的文件上传组件在内部使用标准 Servlet 3.0 API,没有需要第 3 方库。[...] Servlet 3.0 容器的示例是 Tomcat 7.0.x”。虽然您正确地认为 tomcat-6 不会(完全)支持 JSF-2.2,但您的推理是有缺陷的:tomcat 与 JEE7“对齐”,这意味着它们支持其中的一部分。而 JSF-2.2 是一个独立的规范,包含(非特定)到 JEE7。
  • 当我说具体时,我的意思是它不会在低于 javaee7 的任何东西上运行,并且 javaee7 永远不会在标准安装的 tomcat7 或更低版本上运行,因为我已经阅读了 tomcat 运行 javaee6 的文档即使您的 web 应用程序配置为 javaee7。很久以前的事了,如果我能找到链接,我会发布它。作为一个简单的测试尝试在 netbeans 中创建一个 web 应用程序并选择 Tomcat 作为服务器,它会强制你使用 java6 和 jsf2.1 作为最大值。
  • 如果您不清楚如何在 Tomcat-7 上运行 JSF-2.2,请发布问题。除了 JEE7 包含 JSF-2.2 所需的部分内容之外,它与 JEE7 规范无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2019-08-28
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
相关资源
最近更新 更多