Primefaces 将值从数据表传递到对话框

Primefaces 将值从数据表传递到对话框,primefaces,jsf-2.2,Primefaces,Jsf 2.2,我在将数据从dataTable传递到对话框以编辑值时遇到问题,dataTable是从数据库填充的 izmenaPredmeta.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"> <ht

我在将数据从dataTable传递到对话框以编辑值时遇到问题,dataTable是从数据库填充的

izmenaPredmeta.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://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Obrada predmeta</title>
    </h:head>
<h:body>
    <center>
        <h:form>
            <p:growl id="msgs" showDetail="true"/>
            <h:dataTable var="list" value="#{pred.getPredmets()}" border="1" cellpadding="3" cellspacing="3" bgcolor="lightgray">
                <h:column>
                    <f:facet name="header">Naziv</f:facet>
                    <h:outputText value="#{list.naziv}"/>
                </h:column>
                <h:column>
                    <f:facet name="header">Akronim</f:facet>
                    <h:outputText value="#{list.akronim}"/>
                </h:column>
                <h:column>
                    <f:facet name="header">Semestar</f:facet>
                    <h:outputText value="#{list.semestar}"/>
                </h:column>
                <h:column>
                    <f:facet name="header">Godina</f:facet>
                    <h:outputText value="#{list.god}"/>
                </h:column>
                <h:column>
                    <f:facet name="header">Odsek</f:facet>
                    <h:outputText value="#{list.odsek}"/>
                </h:column>
                <h:column>
                    <f:facet name="header">Aktivan</f:facet>
                    <h:outputText value="#{list.drzise}"/>
                </h:column>
                <h:column>
                    <f:facet name="header">Edit</f:facet>
                    <h:commandButton value="Edit" action="#{pred.edit()}" onclick="PF('dlg3').show();"> 
                        <f:param name="idp" value="#{list.idpred}"/>
                    </h:commandButton>
                    <p:dialog header="Edit" widgetVar="dlg3" showEffect="explode" hideEffect="bounce" height="350">
                        <h:panelGrid id="panel" columns="2" cellpadding="5" border="1" bgcolor="gray">
                            <h:outputText value="Naziv"/>
                            <p:inputText style="width: 97%"  value="#{pred.naziv}" required="true" requiredMessage="Naziv je obavezan"/>
                            <h:outputText value="Akronim"/>
                            <p:inputText style="width: 97%" value="#{pred.akronim}" required="true" requiredMessage="Akronim je obavezan"/>
                            <h:outputText value="Semestar"/>
                            <p:inputText style="width: 97%" value="#{pred.semestar}" required="true" requiredMessage="Semestar je obavezan"/>
                            <h:outputText value="Godina"/>
                            <p:inputText style="width: 97%" value="#{pred.god}" required="true" requiredMessage="Godina je obavezna"/>
                            <h:outputText value="Odsek"/>
                            <p:inputText style="width: 97%" value="#{pred.odsek}" required="true" requiredMessage="Odsek je obavezan"/>
                            <h:outputText value="Drzi se"/>
                            <p:inputText style="width: 97%" value="#{pred.drzise}" required="true" requiredMessage="Drzi se je obavezno"/>
                            <p:commandButton value="Save" action="#{pred.upPredmet()}" />
                        </h:panelGrid>
                    </p:dialog>
                </h:column>
                <h:column>
                    <f:facet name="header">Delete</f:facet>
                    <h:commandButton value="Delete" action="#{pred.delPredmet()}">
                        <f:param rendered="msgs" name="id" value="#{list.idpred}"/>
                    </h:commandButton>
                </h:column>
            </h:dataTable>
        </h:form>
    </center>
</h:body>
来自PredmetBean.java@ViewScoped的函数实现了可序列化

// getter's, setter's and other functions  
public void edit(){
    ArrayList<Predmet> PrList = Predmet.getPredmets();
    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletRequest request = (HttpServletRequest)context.getExternalContext().getRequest();
    int id = Integer.parseInt(request.getParameter("idp"));
    for(Predmet pr : PrList){
        if( pr.getIdpred() == id ){
            this.setIdPred(pr.getIdpred());
            this.setNaziv(pr.getNaziv());
            this.setAkronim(pr.getAkronim());
            this.setSemestar(pr.getSemestar());
            this.setGod(pr.getGod());
            this.setOdsek(pr.getOdsek());
            this.setDrzise(pr.getDrzise());
        }
    }
}
单击“编辑按钮”对话框时,应打开按钮所在行的值。但我唯一得到的是对话框试图打开和打破,然后需要的消息弹出了所有。 在对话框中时,value is list.somename对话框将显示并使用列表中的最后一个对象值填充文件。
如果有人知道如何解决这个问题或其他方法来编辑用户值,而不必转到其他页面,那就太好了。

将p:对话框保留在表单之外,并在数据表中使用binding属性,如下例所示

在下面的行中声明托管bean

private HtmlDataTable dataTable;
在数据表中添加以下行

binding="#{managedBean.htmlDataTable}"
那么您的编辑方法如下

public void edit(){

    Predmet selectedObject = (Predmet) getDataTable().getRowData(); 
}

希望这能帮助您

仔细查看PrimeFaces Showcase尝试删除h:dataTable外的标记。@Fritz thx我现在需要的消息弹出窗口少了一半。。。你能编辑你的帖子并添加更多的细节来说明你是如何将邮件数量减少到一半的吗?这样我们就可以继续检查出了什么问题。thanks@Fritz很抱歉重播拿铁,但我最终还是解决了这个问题。谢谢你的关心和帮助,这让我走上了正确的道路。为什么你需要绑定呢?PrimeFaces showcase有几个例子可以在没有绑定的情况下完全运行…如果我们完全使用prime face组件,那很好,我提供了一个如何在h:dataTable组件中使用它的参考。您可以在没有绑定的情况下使用h:dataTable进行大部分传输。。只是不确定ajax部分