10

各行で削除する commandLink を持つ一連のユーザーを表示する PrimeFaces データ テーブルがあります。リンクをクリックすると、バッキング Bean の「削除」メソッドを呼び出す必要がある「はい」ボタンを含む confirmDialog が表示されます。残念ながら、このメソッドは呼び出されず、ダイアログは非表示になっています。デバッガーで見たのでリンク先のパラメータが設定されています。

ここに私のページがあります:

<?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();
    }
}

確認したところ、ネストされたフォームはありません。これは、バッキング 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 を使用しています

4

1 に答える 1

21

これ<p:confirmDialog ... appendToBody="true">により、確認ダイアログのHTML表現が、<body>DOMの準備中にJavaScriptによってHTML要素の最後に再配置されます。

ただし、これにより、確認ダイアログのHTML表現がフォーム内に存在しなくなります。したがって、事実上、フォームは送信されず、リクエストパラメータも送信されないため、JSFはアクションを識別できません。

確認ダイアログに独自のを与える必要があります<h:form>

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

また、メンテナンス中の混乱を避けるために(つまり、ネストフォームは違法です)、少なくとも「外部」の<h:form>で、そのコンポーネントをテンプレートの最後に移動することをお勧めします。

于 2013-01-11T16:08:38.727 に答える