在JSF 2.0中混合Ajax和完整请求

时间:2011-03-10 16:44:51

标签: java ajax jsf jsf-2 listener

给我带来问题的JSF代码如下:

<h:panelGrid columns="3">
          <!-- Minimum Password Length -->
          <h:outputText value="#{i18n['xxx']}:" />
                        <h:inputText id="minLength"
                                     value="#{passwordPolicies.minLength.paramValue}"
                                     required="true">
                            <f:validateLongRange minimum="1"/>
                            <f:ajax event="valueChange"
                                    render="@this minLengthMessage"
                                    listener="passwordPolicies.testListener"/>
                        </h:inputText>
                        <h:message id="minLengthMessage"
                                   for="minLength"
                                   errorClass="error"
                                   tooltip="true"/-->
                <!-- Many other validation fields -->
<h:panelGrid/>

首先,我遇到了一个非常类似的问题:f:ajax listener never fired。我必须在我的JSF页面上组合Ajax和完整请求。 Jim Driscoll @ java.net说为了使这两个工作,必须设置一个Ajax错误监听器?这与 ajax 标记的 listener 属性有很大不同吗?

现在,我知道我可以尝试使用Primefaces p:inputText和p:ajax标签,但是这些将需要我为所有经过验证的字段的个人监听器。有没有办法修复f:ajax错误监听器,以便被触发,不要讨厌:

enter image description here

感谢您的任何意见!

3 个答案:

答案 0 :(得分:3)

您需要使用命令按钮来激发ajax请求。

<h:commandButton value="Submit" action="#{bean.submit}">
    <f:ajax execute="@form" render="@form" />
</h:commandButton>

那些<f:ajax>听众不是强制性的。他们只是在Jim的文章中用来说明竞争条件。首先调用哪个?显然你想首先调用听众。

this chapterthis tutorial中可以找到几乎相同形式的实际示例。仅使用blur而不是valueChange,因为当您模糊保持为空的valueChange字段导致“值为”时,将不会调用required="true"所需的“消息永远不会出现在这样的领域。

答案 1 :(得分:0)

这里只是为了后代记录这个,但是在JavaScript中创建一个错误处理程序然后从f:ajax标记引用它将抑制错误警报并导致错误消息处理器被调用而不是错误消息。 Jim Driscoll在问题中提到但没有具体说明的文章中描述了这种行为。我已经确认它有效:

function onAjaxError( error ) { console.log( error.description ); }

<f:ajax onerror="onAjaxError" ...>

答案 2 :(得分:-1)

if you want to add some monitor this is how :

<h:commandButton value="Submit"  action="#{yourBean.YourAction}" render="thisIsWhereYouWantToDisplay">
<f:ajax onevent="monitor" execute="@form" render="@form" />
                                        </h:commandButton>