Jsf 对话框的“保存”按钮未激活bean方法

Jsf 对话框的“保存”按钮未激活bean方法,jsf,jsf-2,primefaces,dialog,Jsf,Jsf 2,Primefaces,Dialog,我试图通过使用从数据表加载行数据的对话框来实现编辑功能。我可以将数据表中的人员详细信息加载到对话框中,并相应地显示保存按钮。但是我的save按钮没有启动我的bean方法来保存对话框中更新的记录。我可能会遗漏什么,这是我的代码 .xhtml文件 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:p="http://primefaces.org/u

我试图通过使用从数据表加载行数据的对话框来实现编辑功能。我可以将数据表中的人员详细信息加载到对话框中,并相应地显示保存按钮。但是我的save按钮没有启动我的bean方法来保存对话框中更新的记录。我可能会遗漏什么,这是我的代码

  • .xhtml文件

    <html xmlns="http://www.w3.org/1999/xhtml" 
        xmlns:h="http://xmlns.jcp.org/jsf/html" 
        xmlns:p="http://primefaces.org/ui" 
        xmlns:ui="http://xmlns.jcp.org/jsf/facelets" 
        xmlns:f="http://xmlns.jcp.org/jsf/core">
        <h:head>
            <title>Asset Manager-Home</title>
        </h:head>
        <h:body>
            <p:layout fullPage="true">
    
                <p:layoutUnit position="north" size="200">
                    <h:outputText value="Home content." />
                </p:layoutUnit>
    
                <p:layoutUnit position="south" size="50">
                    <h:outputText value="All Rights Reserved." />
                </p:layoutUnit>
    
                <p:layoutUnit position="west" size="250" header="">
                    <h:form>
                        <p:panelMenu>
                            <p:submenu label="Home">
                                <p:menuitem value="Home" url="/faces/index.xhtml" />
                            </p:submenu>
                            <p:submenu label="Staff">
                                <p:menuitem value="Create Staff " url="/face/createStaff.xhtml" icon="ui-icon-disk" />
                                <p:menuitem value="Update Staff " url="/faces/updateStaff.xhtml" />
                                <p:menuitem value="All Staff " url="/faces/updateStaff.xhtml" />
                            </p:submenu>
                            <p:submenu label="Categories">
                                <p:menuitem value="Create Category" url="/faces/createCategory.xhtml" icon="ui-icon-disk" />
                                <p:menuitem value="Update Category" url="/faces/updateCategory.xhtml" />
                                <p:menuitem value="View Category" url="/faces/updateCategory.xhtml" />
                            </p:submenu>
                            <p:submenu label="Asset">
                                <p:menuitem value="Create Asset" url="/faces/createAsset.xhtml" icon="ui-icon-disk" />
                                <p:menuitem value="Update Asset" url="/faces/updateAsset.xhtml" />
                                <p:menuitem value="All Asset" url="/faces/updateAsset.xhtml" />
                            </p:submenu>
                            <p:submenu label="Asset Status">
                                <p:menuitem value="Create/Update Status Register" url="/faces/CreateStatus.xhtml" />
                            </p:submenu>
                            <p:submenu label="Assigned Asset">
                                <p:menuitem value="Assign Asset" url="/faces/assignAsset.xhtml" icon="ui-icon-disk" />
                                <p:menuitem value="Do Update" url="/faces/updateAssignAsset.xhtml" />
                                <p:menuitem value="View All" url="/faces/updateAssignAsset.xhtml" />
                            </p:submenu>
                            <p:submenu label="Reports">
    
                            </p:submenu>
                        </p:panelMenu>
                    </h:form>
                </p:layoutUnit>
    
                <p:layoutUnit position="east" size="250" header="Right">
                    <h:outputText value="Right unit content." />
                </p:layoutUnit>
    
                <p:layoutUnit position="center">
    
                    <p:separator id="customSeparator" style="width:1000px;height:20px" />
                    <p:panel header="All Staff" id="allstaff">
    
                        <h:form prependId="false" id="staffform">
    
                            <p:dataTable id="dataTable" var="stf" value="#{allStaffTableBean.staffList}" 
                                paginator="true" rows="10" 
                                paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
                                rowsPerPageTemplate="5,10,15" selectionMode="single" 
                                selection="#{allStaffTableBean.selectedStaff}" 
                                emptyMessage="KoblaGasu:: No data to be found for displaying" 
                                rowKey="#{stf.uniqueID}">
    
    
                                <p:column sortBy="#{stf.uniqueID}" filterBy="#{stf.uniqueID}">
    
                                    <f:facet name="header">
                                        <h:outputText value="Staff ID" />
                                    </f:facet>
    
                                    <h:outputText value="#{stf.uniqueID}" />
                                </p:column>
    
                                <p:column sortBy="#{stf.firstName}" filterBy="#{stf.firstName}">
                                    <f:facet name="header">
                                        <h:outputText value="First Name" />
                                    </f:facet>
                                    <h:outputText value="#{stf.firstName}" />
                                </p:column>
    
                                <p:column sortBy="#{stf.lastName}" filterBy="#{stf.lastName}">
                                    <f:facet name="header">
                                        <h:outputText value="Last Name" />
                                    </f:facet>
                                    <h:outputText value="#{stf.lastName}" />
                                </p:column>
    
                                <f:facet name="footer">
                                    <div>
                                        <p:commandButton id="edit" value="Edit" update=":staffform:display" onclick="PF('StaffEditDialog').show()" />
                                        <p:commandButton id="delet" value="Delete" />
                                    </div>
                                </f:facet>
                            </p:dataTable>
    
                            <p:dialog id="StaffEditDlg" widgetVar="StaffEditDialog" modal="true" resizable="false" appendTo="@(body)" header="Edit Staff" closeOnEscape="true">
                                <h:panelGroup id="display">
                                    <p:panelGrid columns="2" rendered="#{allStaffTableBean.selectedStaff != null}">
                                        <h:outputLabel value="Staff ID" for="staffUniqueID" />
                                        <h:outputText id="staffUniqueID" value="#{allStaffTableBean.selectedStaff.uniqueID}" />
    
                                        <p:outputLabel value="First Name" for="firstName" />
                                        <p:inputText id="firstName" value="#{allStaffTableBean.selectedStaff.firstName}" title="First Name" size="45" maxlength="45" />
    
                                        <p:outputLabel value="Last Name" for="lastName" />
                                        <p:inputText id="lastName" value="#{allStaffTableBean.selectedStaff.lastName}" title="Last Name" size="45" maxlength="45" />
                                    </p:panelGrid>
    
                                    <p:commandButton actionListener="#{allStaffTableBean.update}" value="Save" oncomplete="PF().hide();" />
                                    <p:commandButton value="Cancel" onclick="StaffEditDialog.hide()" />
                                </h:panelGroup>
                            </p:dialog>
                        </h:form>
                    </p:panel>
                </p:layoutUnit>
            </p:layout>
        </h:body>
    </html>
    
  • 和一个数据表bean

    public class AllStaffTableBean implements Serializable
    {
        private List<Staff> staffList;
        private Staff selectedStaff;
    
        /**
         * Creates a new instance of AllStaffTableBean
         */
        public AllStaffTableBean()
        {
            staffList = new ArrayList<>();
    
            staffList = new StaffManager().getAllStaff();
    
            for(Staff stf : staffList)
            {
                System.out.println("allstafftablebean:: " + stf);
            }
            {
                System.out.println("selectedStaff :: " + selectedStaff);
            }
        }
    
        public void update(ActionEvent event)
        {
            RequestContext context = RequestContext.getCurrentInstance();
    
            new StaffManager().saveStaff(selectedStaff.getUniqueID(), selectedStaff.getFirstName(), selectedStaff.getLastName());
            System.out.println("Update callded in allstafftablebean.java :: " + selectedStaff);
        }
    
        /**
         * @return the staffList
         */
        public List<Staff> getStaffList()
        {
            return staffList;
        }
    
        /**
         * @return the selectedStaff
         */
        public Staff getSelectedStaff()
        {
            return selectedStaff;
        }
    
        /**
         * @param selectedStaff
         *            the selectedStaff to set
         */
        public void setSelectedStaff(Staff selectedStaff)
        {
            this.selectedStaff = selectedStaff;
        }
    }
    
    公共类AllStaffTableBean实现可序列化
    {
    私人名单;
    私人员工选择员工;
    /**
    *创建AllStaffTableBean的新实例
    */
    public AllStaffTableBean()
    {
    staffList=newarraylist();
    staffList=newstaffmanager().getAllStaff();
    员工(stf:staffList)
    {
    System.out.println(“allstafftablebean::”+stf);
    }
    {
    System.out.println(“selectedStaff::”+selectedStaff);
    }
    }
    公共无效更新(ActionEvent事件)
    {
    RequestContext=RequestContext.getCurrentInstance();
    新建StaffManager().saveStaff(selectedStaff.getUniqueID()、selectedStaff.getFirstName()、selectedStaff.getLastName());
    System.out.println(“在allstafftablebean.java中调用的更新::”+selectedStaff);
    }
    /**
    *@returnthestafflist
    */
    公共列表getStaffList()
    {
    返回staffList;
    }
    /**
    *@返回所选的Staff
    */
    公职人员getSelectedStaff()
    {
    返回所选员工;
    }
    /**
    *@param selectedStaff
    *要设置的选定人员
    */
    公共无效设置选定员工(员工选定员工)
    {
    this.selectedStaff=selectedStaff;
    }
    }
    

  • 您必须告诉commandButton要处理什么,请尝试:

     <p:commandButton actionListener 
      ="#{allStaffTableBean.update}" value="Save"   oncomplete="PF().hide();"
      process="@this,StaffEditDlg"/>
    
    
    
    或:

    
    
    要处理对话框中的数据,必须处理数据表信息(选定项),以便:

    
    
    我建议使用另一个Staff实例进行编辑,请记住,实例只是引用,因此如果您更改该值(出于任何原因),将更新为所有具有该引用的变量,请查找Shadow clone或deep clone。我想用这些代码会有用的。如果没有,请添加注释


    玩得开心

    下次使用代码时,请格式化它!;)感谢BalusC,我希望按钮现在能够在bean中启动更新方法,但是对话框中编辑的数据没有被捕获。在我看来,bean捕获的数据似乎是数据表中的选定行,而不是对话框中的数据。这可能是因为对话框和数据表的形式相同吗?试着把对话框放在layout和layoutUnit之外。忘记我发表的评论吧,嗯,这很奇怪。我会在晚上下班后尝试复制。你对primefaces的看法是什么?
     <p:commandButton actionListener 
      ="#{allStaffTableBean.update}" value="Save"   oncomplete="PF().hide();"
      process="@this,StaffEditDlg"/>
    
    <p:commandButton actionListener 
      ="#{allStaffTableBean.update}" value="Save"   oncomplete="PF().hide();"
      process="@this,@widgetVar(StaffEditDialog)"/>
    
    <p:commandButton id="edit" value="Edit" update=":staffform:display"   
    onclick="PF('StaffEditDialog').show()" process=":staffform:dataTable" />