如何在JSF页面中使用<h:form>? 单一forms? 多种forms? 嵌套表单?

我正在使用Facelet模板技术在我正在处理的JSF 2应用程序中布置页面。

在我的header.xhtml中,primefaces要求将菜单栏包含在h:form中。

<h:form> <p:menubar autoSubmenuDisplay="true"> Menu Items here! </p:menubar> </h:form> 

所以,在我的内容页面中,我会有另一个h:或更多的forms。

如果我只是将h:表单放在我的template.xhtml中,它会工作吗?

 <h:body> <h:form> <div id="top"> <ui:insert name="header"><ui:include src="sections/header.xhtml"/></ui:insert> </div> <div> <div id="left"> <ui:insert name="sidebar"><ui:include src="sections/sidebar.xhtml"/></ui:insert> </div> <div id="content" class="left_content"> <ui:insert name="content">Content</ui:insert> </div> </div> <div id="bottom"> <ui:insert name="footer"><ui:include src="sections/footer.xhtml"/></ui:insert> </div> <h:form> </h:body> 

我实际上正在考虑一个用例,我需要在页面中使用多个h:form。

谢谢

您可以安全地在JSF页面中使用多个表单。 这与使用纯HTML时没有区别。

嵌套<form>元素在HTML中 无效 。 由于JSF只是生成一堆HTML,所以在JSF中并没有什么不同。 嵌套<h:form>在JSF中也是无效的。

 <h:form> ... <h:form> <!-- This is INVALID! --> ... </h:form> ... </h:form> 

浏览器提交嵌套表单的行为是未指定的。 它可能会或可能不会按照您的预期工作。 它可能只是刷新页面而不调用bean操作方法。 即使你使用dom操作(或通过使用PrimeFaces appendTo="@(body)" )移动父窗体之外的嵌套窗体(或包含它的组件),它仍然不起作用,应该加载页面时没有嵌套的表单。

至于你需要保持哪种forms,拥有一个“神” <h:form>实际上是一个不好的习惯。 所以,最好从主模板中删除外层的<h:form> ,并让headersidebarcontent等部分都定义自己的<h:form> 。 多个平行forms是有效的。

 <h:form> ... </h:form> <h:form> <!-- This is valid. --> ... </h:form> 

每个表格都有一个明确的责任。 例如login表单,search表单,主表单,对话框表单等。当您提交某个表单时,您不希望不必要地处理所有其他表单/input。

因此请注意,当您提交某个表单时,其他表单不会被处理。 所以,如果你打算处理另一种forms的input,那么你有一个devise问题。 要么把它放在同一个表单中,要么抛出一些丑陋的JavaScript黑客,将需要的信息复制到包含提交button的表单的隐藏字段中。

在某种forms下,可以使用ajax将input的处理限制为较小的子集。 例如<f:ajax execute="@this">将只处理(提交/转换/validation/调用)当前组件,而不处理同一表单中的其他组件。 这通常用于需要dynamic填充/呈现/切换同一表单中的其他input的使用情况,例如从属下拉菜单,自动完成列表,自选列表等。

也可以看看:

  • commandButton / commandLink / ajax操作/侦听器方法未被调用或input值未设置/更新 – 点2
  • 什么是<f:ajax execute =“@ all”>真的该怎么办? 它只发布封闭的表单
  • 了解PrimeFaces进程/更新和JSF f:ajax执行/渲染属性
  • <p:commandbutton>操作在<p:dialog>中不起作用

我被这个问题困扰了一会儿。 而不是一系列独立的forms,我转换为一个模板,而不是一个调用xhtml列表forms,通常作为用户界面:包括,我打电话给那些以前的用户界面:包括XHTML页面,用户界面:在父模板中捕获的内容。