提问人:Mark Estrada 提问时间:9/10/2011 最后编辑:BalusCMark Estrada 更新时间:10/18/2017 访问量:58731
如何在JSF页面中使用<h:form>?单一形式?多种形式?嵌套表单?
How to use <h:form> in JSF page? Single form? Multiple forms? Nested forms?
问:
我正在使用 Facelet 模板技术在我正在开发的 JSF 2 应用程序中布局我的页面。
在我的标题.xhtml中,primefaces要求菜单栏用h:form括起来。
<h:form>
<p:menubar autoSubmenuDisplay="true">
Menu Items here!
</p:menubar>
</h:form>
因此,在我的内容页面中,我将有另一个或更多 h:form。
如果我只是将 h:form 放在我的模板 .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 时没有什么不同。
嵌套元素在 HTML 中无效。由于 JSF 只生成一堆 HTML,因此在 JSF 中没有什么不同。因此,嵌套在 JSF 中也是无效的。<form>
<h:form>
<h:form>
...
<h:form> <!-- This is INVALID! -->
...
</h:form>
...
</h:form>
未指定提交嵌套表单的浏览器行为。它可能会也可能不会按照您预期的方式工作。例如,它可能只是刷新页面而不调用 Bean 操作方法。即使您使用 dom 操作(或例如使用 PrimeFaces)将嵌套表单(或包含它的组件)移动到父表单之外,它仍然不起作用,并且在加载页面时不应有嵌套表单。appendTo="@(body)"
至于你需要保留哪些形式,只有一个“神”实际上是一种不好的做法。因此,您最好从主模板中删除外部部分,并让 、 等 部分各自定义自己的 .多个并行形式有效。<h:form>
<h:form>
header
sidebar
content
<h:form>
<h:form>
...
</h:form>
<h:form> <!-- This is valid. -->
...
</h:form>
每个表格必须有一个明确的责任。例如,登录表单、搜索表单、主表单、对话框表单等。当您提交某个表单时,您不希望不必要地处理所有其他表单/输入。
请注意,当您提交某个表格时,不会处理其他表格。因此,如果您打算处理另一个表单的输入,那么您就遇到了设计问题。要么把它放在同一个表格中,要么加入一些丑陋的 JavaScript hack,将所需的信息复制到包含提交按钮的表格的隐藏字段中。
但是,在某种形式中,您可以使用 ajax 将输入的处理限制为较小的子集。例如 将仅处理(提交/转换/验证/调用)当前组件,而不处理同一表单中的其他组件。这通常用于需要动态填充/呈现/切换同一表单中的其他输入的用例,例如依赖下拉菜单、自动完成列表、选择表等。<f:ajax execute="@this">
另请参阅:
- commandButton/commandLink/ajax 操作/侦听器方法未调用或输入值未设置/更新 - 第 2 点
- <f:ajax execute=“@all”>真正应该做什么?它仅对封闭形式进行 POST
- 了解 PrimeFaces 进程/更新和 JSF f:ajax 执行/渲染属性
- <p:commandbutton>操作在 <p:dialog 中不起作用>
评论
javax.faces.ViewState
javax.faces.ViewState
p:remoteCommand
process
process
我被这个问题迷惑了一段时间。我没有将一系列独立的表单转换为模板,也就是说,我不是调用具有列出的表单的 xhtml(通常为 ui:include),而是调用那些以前 ui:included 的 xhtml 页面,这些页面是 ui:content 捕获在父模板中的。
评论
ajax="false"
MenuBar
TabView