gpt4 book ai didi

jsf - ConfirmDialog中的PrimeFaces commandButton不调用后备bean

转载 作者:行者123 更新时间:2023-12-03 21:39:27 25 4
gpt4 key购买 nike

我有一个PrimeFaces数据表,该表显示一组用户,并在每个行上都带有要删除的commandLink。单击链接时,将显示带有"is"按钮的ConfirmDialog,该按钮应在备用Bean中调用“删除”方法。不幸的是,没有调用此方法,而对话框只是隐藏的。链接中的参数已设置,因为我在调试器中看到了该参数。

这是我的页面:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head><title>Manage users</title></h:head>
<h:body>
<ui:composition template="../../template/commonLayout.xhtml">
<ui:define name="content">
<p:layoutUnit position="center">
<h:form id="datatable">
<p:tabView>
<p:tab title="Users">
<p:button value = "Add user" outcome="addUser.xhtml?faces-redirect=true"/>
<p:growl id="messages" showDetail="true"/>
<p:dataTable id="usersTable" var="user" value="#{userMB.userList}" paginator="true" rows="25"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}">
<p:ajax event="rowEdit" listener="#{userMB.onEditUser}" />
<p:column headerText="First name">
<h:outputText value="#{user.firstName}" />
</p:column>
<p:column headerText="Last name">
<h:outputText value="#{user.lastName}" />
</p:column>
<p:column headerText="E-mail">
<h:outputText value="#{user.email}" />
</p:column>
<p:column headerText="Username">
<h:outputText value="#{user.username}"/>
</p:column>
<p:column headerText="Hire date">
<h:outputText value="#{user.hireDate}">
<f:convertDateTime type="date" pattern="dd.MM.yyyy"/>
</h:outputText>
</p:column>
<p:column headerText="Working hours">
<h:outputText value="#{user.workingHours}" />
</p:column>
<p:column headerText="Vacation days">
<h:outputText value="#{user.vacationDays}"/>
</p:column>

<p:column>
<h:link outcome="addUser" value="Edit">
<f:param name="userID" value="#{user.id}" />
</h:link>
</p:column>
<p:column>
<p:commandLink value="Delete" onclick="deleteConfirmDlg.show()">
<f:setPropertyActionListener value="#{user}" target="#{userMB.currentUser}" />
</p:commandLink>
</p:column>
</p:dataTable>

<p:confirmDialog id="deleteConfirmDialog" message="Are you sure?" header="Delete user" severity="alert" widgetVar="deleteConfirmDlg" appendToBody="true">
<p:commandButton id="confirmDelete" value="Yes" oncomplete="deleteConfirmDlg.hide()" update="usersTable" actionListener="#{userMB.deleteUser}"/>
<p:commandButton id="declineDelete" value="No" onclick="deleteConfirmDlg.hide()" type="button"/>
</p:confirmDialog>
</p:tab>
<p:tab title="Teams">
<p:button value = "Add team" outcome="addTeam.xhtml?faces-redirect=true"/>
<p:dataTable var="team" value="#{userMB.teamList}" paginator="true" rows="25"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}">
<p:column headerText="Name">
<h:outputText value="#{team.name}" />
</p:column>
<p:column headerText="Team leader">
<h:outputText value="#{team.teamLeader.displayName}" />
</p:column>
</p:dataTable>
</p:tab>
</p:tabView>
</h:form>
</p:layoutUnit>
</ui:define>
</ui:composition>


后备 bean 方法:
public void deleteUser(ActionEvent event) {
if (null != currentUser) {
// check if userID is set and delete
System.out.println("delete user with id " + currentUser.getId());
userService.deleteUser(currentUser);
currentUser = new User();
}
}

我检查了一下,但没有嵌套的表单,因为这是不被称为backing bean的最常见情况。

这是我的模板文件:

CommonLayout.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head>
<h:outputStylesheet library="css" name="default.css" />
</h:head>
<h:body>
<p:layout fullPage="true">
<div id ="header">
<ui:insert name="header">
<ui:include src="commonHeader.xhtml"></ui:include>
</ui:insert>
</div>
<div id="left-menu">
<ui:insert name="left-menu">
<ui:include src="leftMenu.xhtml"></ui:include>
</ui:insert>
</div>
<div id ="content">
<ui:insert name="content">
<ui:include src="commonContent.xhtml"></ui:include>
</ui:insert>
</div>
</p:layout>
</h:body>
</html>

CommonHeader.xhtml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body>
<ui:composition>
<p:layoutUnit position="north" size="100">
<h:outputText value="Welcome #{request.remoteUser}!"/> <br />
<a href="#{request.contextPath}/j_spring_security_logout">Logout</a><br />
</p:layoutUnit>
</ui:composition>
</h:body>
</html>

CommonContent.xhtml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body>
<ui:composition>
<p:layoutUnit position="center">
<ui:include src="../widgets/schedule.xhtml"/>
</p:layoutUnit>
</ui:composition>
</h:body>
</html>

LeftMenu.xhtml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body>
<ui:composition>
<p:layoutUnit position="west" size="200">
<h:form>
<p:menu width="100%" rendered="#{request.isUserInRole('ROLE_MANAGER')}">
<p:submenu label="Management">
<p:menuitem value="Manage users" outcome="/pages/management/manageUsers.xhtml?faces-redirect=true"></p:menuitem>
</p:submenu>
</p:menu>
</h:form>
</p:layoutUnit>
</ui:composition>
</h:body>
</html>

我正在使用PrimeFaces 3.4和JSF 2.0

最佳答案

在DOM准备就绪期间,<p:confirmDialog ... appendToBody="true">将使JavaScript将确认对话框的HTML表示重新定位到HTML <body>元素的末尾。

但是,这导致确认对话框的HTML表示不再位于任何形式内。因此,实际上没有提交任何表单,也没有发送请求参数,因此JSF将无法识别该 Action 。

您需要为确认对话框提供自己的<h:form>

<p:confirmDialog ...>
<h:form>
...
</h:form>
</p:confirmDialog>

为了避免维护期间的困惑(嵌套表格即为非法表格),我还建议至少在“外部” <h:form>之后将该组件移至模板的末尾。

关于jsf - ConfirmDialog中的PrimeFaces commandButton不调用后备bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14281605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com