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



我已经问了不同的问题,答案是重复的,答案应该在commandButton问题中找到。我试着遵循所有提示,但首先,示例中并没有真正使用p:menuItem,其次,在Debug Hints中,它显示有东西被触发了,但我看不出调用方法开头的断点是什么。

所以我想我会发布更多的代码。这是工作的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((都被触发并正确执行。

这是不起作用的素数面实现:

<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"的菜单项,但都不起作用。

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

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

编辑:你完全是对的。我第一次尝试使用JSF 101 Book,但没有意识到我的布局.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.

当我使用PrimeFaces8和Wildfly21在一个简单的JSF应用程序中复制这些情况时,我可以看到与您描述的症状类似的症状。

最新更新