什么是<f:ajax execute =“@ all”>真的应该做什么?它只发布封闭的表格</f:ajax>

时间:2010-06-08 16:07:30

标签: ajax jsf-2

对不起,如果我很厚,但f:ajax标签中的execute =“@ all”真的应该做什么?我希望它能够提交页面上的所有元素,但它似乎只发布封闭形式的值,而不是页面上的所有表单。

例如

<h:body>
    <h:form id="form1">
        Input1/Form1 <h:inputText id="testinput" value="#{testBean.input1}" />                              
    </h:form>

    <h:form id="form2">
        Input2/form2 <h:inputText id="testinput2" value="#{testBean.input2}" />                             
        <h:commandButton value="Ok" actionListener="#{testBean.al}">
        <f:ajax execute="@all" />
        </h:commandButton>
    </h:form>
</h:body>

点击时只发布form2。

使用mojarra 2.0.2 ..

4 个答案:

答案 0 :(得分:8)

在设计JSF2规范时,execute="@all"只是一个主要的疏忽。 JSF有点抽象掉了基于HTML表单的本质,忘记了它最终实际上是一个HTML代码生成器。

HTML中,提交与封闭格式不同的格式不允许。所以execute="@all"永远不会从那个角度出发。它的行为与execute="@form"完全相同。鉴于JSF只是一个HTML代码生成器,同样的“问题”也将触及JSF。一次处理多个<h:form>组件是不可能的。

如果由于某种原因确实需要使用此功能,则应该退后一步并重新考虑不正确的HTML表单查看方式。您需要确保您的表单的设计方式使您永远不需要其他表单中的信息。

另见:

PrimeFaces早已意识到@allfundamentally wrong。这正是他们从未在@all属性中支持process的原因,它们等同于execute。他们最初也从未在@all中支持update,相当于render。但是,唯一真实世界的用例是在ajax异常期间处理完整的错误页面,所以他们在创建FullAjaxExceptionHandler后最终将update="@all"带回来。 process="@all"仍具有与process="@form"完全相同的效果。

但是,同样的PrimeFaces库也无意中通过其后来引入的partialSubmit="true"功能使execute="@all"的想象行为成为可能,您可以明确指定下面的所有其他形式(PFS { {1}}只是为了简化,像@(form)等硬编码集合也是可能的。

:formId1 :formId2 :formId3

这是有效的,因为<p:commandButton ... process="@(form)" partialSubmit="true" /> 在客户端而不是服务器端准备partialSubmit="true"。换句话说,它不是将整个封闭表单从服务器发送到客户端然后处理指定的输入,而是仅将指定的输入从服务器发送到客户端,然后全部处理它们。请注意,当process="xxx"不存在或设置为partialSubmit时,它仍会发送封闭表单。不应该依赖这种不当行为。他们迟早会在这方面纠正这种不端行为。

另见:

答案 1 :(得分:4)

以下是JavaServer Faces 2.0 - The complete reference的引用,第352页:

  

execute和render关键字接受一组特殊关键字,每个关键字的含义如下表所示:

     

@all(与execute一起使用):页面上的每个组件都是已提交已处理。当您想要进行整页提交时,这非常有用。

我认为这清楚地表明所有表单中的字段都应该与AJAX请求一起提交。

然而,即使使用Mojarra 2.0.3,也不会发生这种情况。尽管execute属性的内容(无论您是放置表单列表还是@all),只有封闭表单才会提交其“字段”。所以这看起来像个bug。除非有改变观点,否则我提出了一个问题?

答案 2 :(得分:1)

它必须是execute =“:form1 form2”(如果你有默认的分隔符),但不管怎么说,它没有。它只发送第二个。

如果你把@all放在第一个表单中,它只发送第一个表单。至少在Safari 5 / Firefox 3.6.3上。我想我们不得不看一下mojarra javascript以了解更多信息。

答案 3 :(得分:0)

你试过这个吗?

<f:ajax execute="form1 form2" />

如果你明确提到它们,它会发送两个表格的数据吗?

AFAIK,你是对的:@all代表整个页面。