为什么 primefaces menuitem 需要一个表单?

Why does primefaces menuitem need a form?

为什么我在 primefaces 中的菜单需要一个围绕 is 的表格?这是最好的方法吗?

需要的表格:

<h:form id="menuForm">
    <p:menu>
        <p:menuitem value="Simple Flow" action="simple-flow" ajax="false"/>
    </p:menu>
</h:form>

不需要表格:

<p:menu>
    <p:menuitem value="Simple Flow" outcome="/simple-flow/simple-flow"/>
</p:menu>

带有结果的菜单项会生成一个普通的 html a 标记,其中包含指向内部页面(在应用程序域内)的 href。单击时,会产生对指定页面的获取请求。 url 属性做同样的事情,但是可以用来引用外部页面,通过调查 PrimeFaces menu showcase 的来源可以看出这个功能不需要表单,因为不需要数据发送到服务器。

action 属性也会生成一个 a 标记,但它总是需要向服务器发送数据并能够调用服务器上的方法。 (这就是一般动作的功能在 JSF 中的定义方式)。在这种情况下,菜单项没有功能性的 hfref(它是“#”),但有一个通过 javascript 的 onclick(请参阅展示源)或者执行 ajax 调用(如果指定)或完整提交表格。由于在这两种情况下都需要将表单数据发送到服务器,因此需要一个表单(这就是 html 的工作方式)。

是的,您可以通过指定 process="@this" 排除发送其他数据,或者您可能没有任何数据,但服务器仍然需要知道发生了什么并且行为必须一致与规范。您的示例不调用服务器上的方法(没有#{...}),是一种优化,您现在可以在其中指定 JSF 2 中引入的直接页面。在 jsf 1.2 中,您需要导航规则为了这。 (参见 http://www.mkyong.com/jsf2/implicit-navigation-in-jsf-2-0/

因此您在 ui 中看到的行为可能没有什么不同,但在幕后却有所不同。