【发布时间】: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">
© ATC - by 5332
</div>
</h:body>
</html>
但如果我没有问的话,我反正也没有看过。现在什么是 Primefaces 更好的代码?将表单保留在所有内容中或为每个表单打开一个自己的表单,我们称之为按钮组或功能。
【问题讨论】:
-
我注意到您的 CommandLinks 上有
immediate="true",但 MenuItems 上没有。
标签: jsf primefaces