【问题标题】:Ajax request sent without defining the triggered event发送的 Ajax 请求未定义触发事件
【发布时间】:2026-02-12 14:25:32
【问题描述】:

我有一个按预期工作的最小、完整且可验证的示例,其中有一个我没有完成理解的问题。代码如下所示,其行为主要包括从 PF ajaxified <p:selectOneListbox> 列表中选择一个项目,并在 JSF <h:outputText> 元素上显示项目的值。

<h:form id="myform">
    <p:selectOneListbox id="myselect" value="#{bean.optionSelected}">
        <p:ajax listener="#{bean.onChange}" process="myselect" update="toupdate" onstart="onstart()" oncomplete="oncomplete()" onerror="onerror()" onsuccess="onsuccess()"/>
        <f:selectItem itemLabel="Option 1" itemValue="1" />
        <f:selectItem itemLabel="Option 2" itemValue="2" />
        <f:selectItem itemLabel="Option 3" itemValue="3" />
    </p:selectOneListbox>    

    <h:outputText id="toupdate" value=">#{bean.optionSelected}" />
</form>

看元素,不知道具体是什么事件导致ajax请求发送到服务器,也就是不知道触发的事件是不是valuechange 事件或其他。换句话说,我错过了以这种方式编码的&lt;p:ajax&gt; 元素:

<p:ajax event="name_of_the_event" .../>

而这个疑问让我不知道后备 bean 端的侦听器方法要使用的接收事件的类: public void onChange(??? event)

任何澄清/解释将不胜感激。谢谢。

【问题讨论】:

  • 通常/良好的做法是,如果答案正确且有帮助,至少要“接受”并且如果它有点用处,也可以投票。

标签: ajax jsf primefaces


【解决方案1】:

根据&lt;p:selectOneListbox /&gt; 中的 PrimeFaces dropdown showcase &lt;p:ajax listener="..." /&gt; 将在用户选择不同的项目 (onchange) 时调用侦听器。

ajax tag documentation 表示event 属性是可选的并且:

触发 ajax 请求的客户端事件。默认值由行为附加到的父 ClientBehaviorHolder 组件定义。

p:ajax标签中的监听器不需要包含任何参数就可以了

  • 以默认事件为参数调用方法
  • 调用不带任何参数的方法

所以&lt;p:ajax listener="#{myBean.onAjaxAction}" /&gt;

会打电话

public void onAjaxAction(){
  ...
}

如果没有其他方法具有更匹配的方法签名。

如果您想了解更多关于该事件的信息,您可以留下 EL 标识并在服务器端添加一个事件。每个作为参数的具体事件都应该扩展javax.faces.event.AjaxBehaviorEvent

public void onAjaxAction(javax.faces.event.AjaxBehaviorEvent event) {
  System.out.println(event.getClass())
}

然后您可以检索事件源以及其他内容。如果您需要更多信息(如果可用),则需要使用更具体的事件类。如果您不知道具体的默认事件(及其对应的类)是什么,您可以添加上面的方法并在该方法中尝试检查具体事件(就像在System.out... 中所做的那样)

对于许多 PrimeFaces 组件,文档中提到了事件。并且所有现有的 PrimeFaces 事件(对于所有组件)都可以在 in the org/primefaces/event package 找到,因此在 IDE 中使用代码完成将为您提供选择(请注意,显然并非所有组件都适用于所有组件)。

如果文档中没有明确命名的事件,基本的 dom 事件至少应该可以工作,包括 onchange。大多数情况下,输入“onchange”是默认事件。

由于&lt;p:selectOneListbox /&gt; 在文档中没有提到明确的事件,触发ajax 请求的默认事件将是onchange。为此,javax.faces.event.AjaxBehaviorEvent 应在需要时用作参数。

【讨论】:

  • 请指出一个更新的标签文档...(为您编辑)
  • 方法被称为onchange的事实不应该被认为真正的Ajax事件被称为相同。而且您不会进入方法签名中的事件可能(应该???)是什么。我也加一下
  • 感谢您的广泛解释。只是两件事。 1) SelectOneListBox 上的官方文档将valueChangeListener 描述为处理valuechangeevent 的方法表达式。那么,事件的正确名称是什么?是 onchange 还是 valuechange?并且 2)在提供的“可以找到所有现有 PrimeFaces 事件(对于所有组件)”的链接中,似乎没有出现与 &lt;p:selectOneListBox&gt; 元素的 change 事件相关的任何事件.
  • @Txapeldot:阅读*.com/questions/11879138/…(提示:找到所有 >50 个赞的 JSF Q/A,扫描它们并记住它们的存在。其中许多会派上用场!
  • @txapeldot: 2:onchange 是一个标准的 DOM 事件,而不是 PrimeFaces 特定的事件(就像点击、聚焦、模糊等),因此没有任何额外的类)