h:commandLink 和 p:menuItem 之间的区别

Difference between h:commandLink and p:menuItem

我已经提出了不同的问题,它被重复回答,答案应该在 commandButton issue 中找到。 我尝试遵循所有提示,但首先,示例中并未真正使用 p:menuItem,其次在调试提示中似乎触发了某些内容,但我看不到开头的断点是什么永远不会达到调用的方法。

所以我想我要 post 编写更多代码。这是有效的 jsf 实现:

<ui:composition
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:h="http://java.sun.com/jsf/html">

    <h:outputStylesheet library="css" name="menu.css"/>

    <ul>
        <li>
            <h:commandLink value="Status" immediate="true" 
                action="status.xhtml?faces-redirect=true" />
        </li>
        <h:panelGroup rendered="#{aduserHandler.isAdmin}">
            <li>
                <h:commandLink value="Einstellungen"  immediate="true" 
                    action="parameter.xhtml?faces-redirect=true" />
            </li>
        </h:panelGroup>
        <li>
            <h:commandLink value="Abmelden"  immediate="true" 
                action="#{aduserHandler.logout}" />
        </li>
     </ul>
</ui:composition>    

isAdmin() 和 logout() 方法都被触发并正确执行。

这是不起作用的 primefaces 实现:

<ui:composition
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:h="http://java.sun.com/jsf/html">


    <h:outputStylesheet library="css" name="menu.css"/>

    <h:form id="menuform">
        <p:growl id="messages" showDetail="true"/>
        <div class="card">
            <h5>Menu</h5>
            <p:menu>
                <p:submenu label="ATC">
                    <p:menuitem value="Status" 
                        url="/atc/status.xhtml" 
                        icon="pi pi-list"/>
                </p:submenu>
                <p:submenu label="KV">
                </p:submenu>
                <p:submenu label="Einstellung">
                    <p:menuitem value="Einstellungen" 
                        url="/atc/parameter.xhtml" 
                        icon="pi pi-cog"
                        rendered="#{aduserHandler.isAdmin}"/>
                    <p:menuitem value="Abmelden" 
                        action="#{aduserHandler.logout}" 
                        icon="pi-directions-alt"/>
                </p:submenu>
            </p:menu>
        </div>
    </h:form>
    <h:commandLink value="Abmelden" immediate="true" action="#{aduserHandler.logout}" />
</ui:composition>

出于测试目的,我什至在第一个实现中添加了 h:commandLink,但没有一个按钮触发了 logout() 方法。但更奇怪的是,isAdmin() 方法非常有效。

我尝试使用 update="@form"update="menuform" 的 menuitem,但都没有用。

我真的很想了解这些菜单项是如何工作的,因为我想利用这种可能性将菜单编码为 class。

对自己的 jQuery 导入的引用已被删除。

编辑: 你完全正确。我第一次尝试使用我的 JSF 101-Book 并没有意识到我的 layout.xhmtl 是这样的:

<html   xmlns="http://www.w3.org/1999/xhtml"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <h:outputStylesheet library="css" name="style.css" />
    <title>Asset Tool Connector</title>
        <link type="image/x-icon"
            href="${facesContext.externalContext.requestContextPath}/resources/images/netzwerk.png"
            rel="shortcut icon" />
</h:head>

<h:body>
    <ui:insert name="header"/>
    <f:event listener="#{aduserHandler.checkLoggedIn}" type="preRenderView" />
    <h:form>
        <div id="menu">
            <ui:include src="menu.xhtml" />
        </div>

        <div id="main">
            <ui:insert name="main"/>
        </div>
    </h:form>   
    <div id="footer">
        &#169; ATC - by 5332
    </div>
</h:body>
</html>

但如果我不问,我也不会看。现在什么是 Primefaces 更好的代码?将表单保留在所有内容周围或为每个表单打开一个自己的表单,我们称其为按钮组或功能。

我认为问题在于,在第二种情况下,您将 h:form 嵌入到另一个 h:form 中。 (@BalusC 列表中的第 2 点)。我无法验证这一点,因为尚未发布调用代码,但是当 h:commandLink 的代码片段不包含表单但需要一个表单才能正常工作时,这是可疑的,而 PrimeFaces 片段确实如此。

我还猜测错误并不明显,因为在 web.xml 中 javax.faces.PROJECT_STAGE 参数未设置为 Development,这意味着一些警告和错误被抑制了。请参阅 BalusC 列表的第一部分。

您的 faces-config.xml 文件中也可能没有定义错误处理程序,这也意味着某些错误会被抑制。参见 https://primefaces.github.io/primefaces/8_0/#/core/errorhandling

当我在使用 PrimeFaces 8 和 Wildfly 21 的简单 JSF 应用程序中复制这些情况时,我可以看到与您描述的相似的症状。