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">
© 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 应用程序中复制这些情况时,我可以看到与您描述的相似的症状。
我已经提出了不同的问题,它被重复回答,答案应该在 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">
© 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 应用程序中复制这些情况时,我可以看到与您描述的相似的症状。