【问题标题】:Difference between h:commandLink and p:menuItem [duplicate]h:commandLink 和 p:menuItem 之间的区别 [重复]
【发布时间】:2021-03-12 11:35:59
【问题描述】:

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

所以我想我会发布更多代码。这是有效的 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,但都没有成功。

我真的很想了解这些菜单项是如何工作的,因为我想利用在类中对菜单进行编码的可能性。

对自己的 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 更好的代码?将表单保留在所有内容中或为每个表单打开一个自己的表单,我们称之为按钮组或功能。

【问题讨论】:

  • 我注意到您的 CommandLinks 上有 immediate="true",但 MenuItems 上没有。

标签: jsf primefaces


【解决方案1】:

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

我也猜想这个错误并不明显,因为在 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 应用程序中复制这些情况时,我可以看到与您描述的类似的症状。

【讨论】:

    猜你喜欢
    • 2014-08-16
    • 2011-04-08
    • 2012-11-24
    • 2013-06-05
    • 2021-09-29
    • 2020-05-27
    • 2016-03-23
    • 2012-08-11
    • 2012-11-24
    相关资源
    最近更新 更多