为了回答您的问题的标题,它们之间的区别是表单提交发送整个表单并重新加载视图,而 ajax 表单执行也提交整个表单,但是使用ajax 请求,可用于在响应发生之前仅呈现视图的特定部分。
关于你的问题内容,Enter键提交的表单在主流浏览器中实现单输入表单。无需对 onkeypress 事件进行 javascript 处理,因为浏览器会检测到该事件并默认发送表单。
所以下一个代码段在服务器端具有相同的结果,或者按下 Send 按钮或 Enter 键:value 属性正在设置。请注意,在第二种形式中,<h:inputText /> 具有 ajax 行为,当按下 Enter 键时,h:outputText 值也会刷新(即使没有指定 render 属性),即因为完整的提交请求优先于 ajax 请求并且整个页面被重新加载。只有谷歌浏览器似乎能说明这个冲突:httpError:The 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>
提醒建议使用提交按钮来处理简单的可访问性问题。
另请参阅: