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



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

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

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

所以,在我的目录页,我将有另一个h:形式或更多

它只是工作,如果我只是把h:表单在我的模板。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:表单在一个页面。

谢谢

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

在HTML中嵌套<form>元素无效。由于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>,并让header, sidebar, content等部分各自定义自己的<h:form>。多个并行形式是有效的。

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

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

因此请注意,当您提交某个表单时,其他表单不会被处理。因此,如果您打算处理另一种形式的输入,那么您就遇到了设计问题。要么把它放在同一个表单中,要么扔进一些难看的JavaScript技巧,将所需的信息复制到包含提交按钮的表单的隐藏字段中。 但是,在某个表单中,您可以使用ajax将输入的处理限制在较小的子集中。例如,<f:ajax execute="@this">将只处理(提交/转换/验证/调用)当前组件,而不处理同一表单中的其他组件。这通常用于需要动态填充/呈现/切换同一表单中的其他输入的用例,例如依赖的下拉菜单,自动完成列表,选择表等。

参见:

  • commandButton/commandLink/ajax action/listener方法未被调用或输入值未设置/更新-第2点
  • 什么是
  • 了解PrimeFaces process/update和JSF f:ajax execute/render属性
  • & lt; p: commandbutton>p:dialog>

我被这个问题困扰了一段时间。我不再使用一系列独立的表单,而是将其转换为一个模板,也就是说,我不再调用带有列表表单的xhtml(通常为ui:include),而是调用在父模板中捕获的ui:内容的那些以前ui:included的xhtml页面。

相关内容

  • 没有找到相关文章

最新更新