我正在使用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之后)。
答案 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>
提醒建议使用提交按钮进行简单的辅助功能。
另见: