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

时间:2011-09-10 13:10:07

标签: forms jsf jsf-2 nested

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

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

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

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

如果我只是将h:form放在我的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。

由于

2 个答案:

答案 0 :(得分:82)

您可以在JSF页面中安全地使用多个表单。它与使用纯HTML时没有什么不同。

invalid中嵌套<form>元素为HTML。由于JSF只生成一堆HTML,因此在JSF中没有什么不同。因此,嵌套<h:form>在JSF中也无效。

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

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

至于你需要保留哪些形式,拥有一个“神”<h:form>实际上是一种糟糕的做法。因此,您最好从主模板中删除外部<h:form>,并让headersidebarcontent等部分各自定义自己的<h:form>。多个并行表单有效。

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

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

因此请注意,当您提交某份表格时,不会处理其他表格。因此,如果您打算处理另一种形式的输入,那么您就遇到了设计问题。要么将它放在相同的表单中,要么抛出一些丑陋的JavaScript黑客,将所需信息复制到包含提交按钮的表单的隐藏字段中。

在某种形式中,您可以使用ajax将输入的处理限制为较小的子集。例如。 <f:ajax execute="@this">将仅处理(提交/转换/验证/调用)当前组件,而不处理同一表单中的其他组件。这通常用于需要动态填充/渲染/切换相同形式的其他输入的用例。依赖下拉菜单,自动完成列表,选择表等。

另见:

答案 1 :(得分:-1)

我被这个问题困惑了一段时间。我没有使用一系列独立的表单,而是转换为模板,也就是说,而不是使用列出的表单调用xhtml,通常作为ui:include,我调用那些以前的ui:包含xhtml页面,ui:在父模板中捕获的内容。