表单提交vs ajax execute =“@ form”

时间:2014-01-31 04:35:23

标签: ajax jsf jsf-2

我正在使用JSF2.1。

以下代码中execute="@form"this.submit()之间有什么区别?

<f:ajax execute="@form" render="@form"/>

<h:form onkeypress="if (event.keyCode == 13) this.submit();">

前者似乎提交值并重新呈现表单,而后者导致页面刷新。当在表单中按下回车键时,有没有办法使用ajax?我正在尝试检测inputText框中按下的回车键。我尝试过这样的事情:

<h:inputText value="#{a.name}" >
  <f:ajax execute="@this" />
</h:inputText>

但这只会导致在您点击其他内容时提交值(在valueChange之后)。

1 个答案:

答案 0 :(得分:4)

为了回答你问题的标题,它们之间的区别是表单提交发送整个表单并重新加载视图,而ajax表单执行也提交整个表单,但使用ajax请求,可用于在响应发生之前仅呈现视图的特定部分。

关于您的问题内容,​​通过按 Enter 键提交的表单在单一输入表单的主要浏览器中实现。不需要javascripting onkeypress事件,因为浏览器将检测到并默认发送表单。

因此,下一个代码段对于服务器端具有相同的结果,可以按发送按钮或 Enter 键:正在设置value属性。请注意,在第二种形式中,<h:inputText />具有ajax行为,当点击 Enter <时,h:outputText值也会刷新(即使没有指定render属性) / kbd> key,这是因为完整的提交请求优先于ajax请求并且整个页面正在重新加载。只有谷歌浏览器似乎告诉了这个冲突: httpError:Http Transport返回0状态代码。这通常是混合ajax和完整请求的结果。

完整请求:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html">
<h:head />
<body>
    <h:form>
        <h:inputText value="#{bean.value}" />
        <h:commandButton value="Send" />
    </h:form>
</body>
</html>

Ajax请求:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html">
<h:head />
<body>
    <h:form>
        <h:inputText value="#{bean.value}">
            <f:ajax />
        </h:inputText>
        <h:outputText value="Echo: #{bean.value}" />
    </h:form>
</body>
</html>

当表单具有多个输入字段时,如果没有任何提交按钮,则可以使用此类javascript验证来发送表单,使用完整提交请求。如果有的话,这样做是不必要的。

最后,如果要在按键并更新模型值时执行ajax请求,请使用onkeypress属性:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html">
<h:head />
<body>
    <h:form>
        <h:inputText value="#{bean.value}"
            onkeypress="if (event.keyCode == 13) {onchange(); return false; }">
            <f:ajax render="echo" />
        </h:inputText>
        <h:inputText value="#{bean.value2}" />
        <h:outputText id="echo" value="Echo: #{bean.value}" />
    </h:form>
</body>
</html>

提醒建议使用提交按钮进行简单的辅助功能

另见: