【问题标题】:jsf primefaces two datatables and two listsjsf primefaces 两个数据表和两个列表
【发布时间】:2013-12-05 12:56:31
【问题描述】:

我正在使用 jsf hibernate primefaces 开发一个项目。 在我的 xhtml 页面中有两个数据表。 当我单击数据表中的某一行时,它会在第二个数据表中显示详细信息。 我怎样才能做到这一点? 谢谢

InfoProcess.java:

here is my complete InfoProcess.java code 

package com.revir.process;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.primefaces.event.SelectEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.revir.managed.bean.AddressBean;
import com.revir.managed.bean.OgrenimSureciBean;
import com.revir.domain.Adres;
import com.revir.domain.AdresDAO;
import com.revir.domain.Kisi;
import com.revir.domain.KisiDAO;
import com.revir.domain.Kisiadresi;
import com.revir.domain.Ogrenimsureci;
import com.revir.domain.OgrenimsureciDAO;
import com.revir.domain.Ulke;
import com.revir.process.KisiInfoProcess;

@ManagedBean(name = "userOS")
@SessionScoped
public class KisiInfoProcess implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private static final Logger log = LoggerFactory
            .getLogger(KisiInfoProcess.class);

    private List<OgrenimSureciBean> osList;

    private List<AddressBean> adresList;

    private OgrenimSureciBean selectedOS;

    private AddressBean selectedAdres;

    public OgrenimSureciBean getSelectedOS() {
        getSelectedAdres();
        return selectedOS;
    }

    public void setSelectedOS(OgrenimSureciBean selectedOS) {
        this.selectedOS = selectedOS;
    }

    public AddressBean getSelectedAdres() {
        return selectedAdres;
    }

    public void setSelectedAdres(AddressBean selectedAdres) {
        this.selectedAdres = selectedAdres;
    }

    public List<OgrenimSureciBean> getOsList() {
        OgrenimsureciDAO ogrenimsureciDAO = new OgrenimsureciDAO();

        List<OgrenimSureciBean> osList = new ArrayList<OgrenimSureciBean>();

        for (Iterator i = ogrenimsureciDAO.findByMezunOgrenciler((short) 8)
                .iterator(); i.hasNext();) {
            Ogrenimsureci og = (Ogrenimsureci) i.next();
            OgrenimSureciBean osBean = new OgrenimSureciBean();

            osBean.setBolum(og.getBolum());
            osBean.setAd(og.getKisiByKisiid().getAd());
            osBean.setSoyad(og.getKisiByKisiid().getSoyad());
            osBean.setAltbirim(og.getAltbirim());
            osBean.setOgrencino(og.getOgrencino());
            osBean.setKisiid(og.getKisiByKisiid().getKisiid());
            osBean.setOgrencidurum(og.getOgrencidurum());

            osList.add(osBean);
            System.out.println("osBean : " + osBean.toString());

        }
        return osList;
    }

    public void setOsList(List<OgrenimSureciBean> osList) {
        this.osList = osList;
    }

    public void onRowSelect(SelectEvent event) {

        System.out.println("On Row Select Metodu çalıştı");

            try {
                getAdresList();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


    }

    public List<AddressBean> getAdresList() throws Exception {

        log.debug("PersonalInfoProcess - getAddressInfo - Start");
        List<AddressBean> adresList = new ArrayList<AddressBean>();

        KisiDAO kisiDAO = new KisiDAO();
        AdresDAO adresDAO = new AdresDAO();

        Long kisiid = getSelectedOS().getKisiid();
        System.out.println("kisiid :" + kisiid);
        Kisi kisi = kisiDAO.findById(kisiid);

        for (Iterator i = kisi.getKisiadresis().iterator(); i.hasNext();) {

            Kisiadresi kisiAdresi = (Kisiadresi) i.next();
            System.out.println("i :" + i);
            Adres tmpAdres = adresDAO.findById(kisiAdresi.getId().getAdresid());

            if (tmpAdres != null) {
                AddressBean address = new AddressBean(kisiid);

                if (tmpAdres.getAdresturu() == null) {
                    address.setAddressType(null);
                } else {
                    address.setAddressType(tmpAdres.getAdresturu().getAd());
                }

                address.setAddress(tmpAdres.getAdres());

                if (tmpAdres.getIl() == null) {
                    address.setCity(null);
                } else {
                    address.setCity(tmpAdres.getIl().getAd());
                }

                if (tmpAdres.getUlke() == null) {
                    address.setCountry(null);
                } else {
                    address.setCountry(tmpAdres.getUlke().getAd());
                }

                adresList.add(address);

                System.out.println("adres" + address);
                System.out.println("adreslist" + adresList);
            }

            log.debug("PersonalInfoProcess - getAddressInfo - End / Returning");
        }
        return adresList;
    }

    public void setAdresList(List<AddressBean> adresList) {
        this.adresList = adresList;
    }

}

index.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:p="http://primefaces.org/ui">
<h:head></h:head>
<h:body>
    <f:view>
        <h:form id="form">
            <p:dataTable id="users" var="user" value="#{userOS.osList}"
                paginator="true" rows="10" rowKey="#{user.kisiid}"
                selection="#{userOS.selectedOS}" selectionMode="single">
                <f:facet name="header">  
                                        Kullanıcı detaylarını görmek için view butonuna tıklayınız
                                        </f:facet>
                <p:ajax event="rowSelect" listener="#{userOS.onRowSelect}" update=":form:display"
                    oncomplete="userDialog" />

                <p:column headerText="Student No" sortBy="ogrencino"
                    filterBy="ogrencino" id="ogrencino">
                    <h:outputText value="#{user.ogrencino}" />
                    <f:param name="kid" value="#{userOS.osList.rowIndex}" />
                </p:column>

                <p:column headerText="Name" sortBy="ad" filterBy="ad" id="ad">
                    <h:outputText value="#{user.ad}" />
                </p:column>
                <p:column headerText="Surname" sortBy="soyad" filterBy="soyad"
                    id="soyad">
                    <h:outputText value="#{user.soyad}" />
                </p:column>
                <p:column headerText="Faculty" sortBy="altbirim.ad"
                    filterBy="altbirim.ad" id="altbirim">
                    <h:outputText value="#{user.altbirim.ad}" />
                </p:column>
                <p:column headerText="Department" sortBy="bolum.ad"
                    filterBy="bolum.ad" id="bolum">
                    <h:outputText value="#{user.bolum.ad}" />
                </p:column>
                <p:column headerText="Status" sortBy="ogrencidurum.ad"
                    filterBy="ogrencidurum.ad" id="ogrencidurum">
                    <h:outputText value="#{user.ogrencidurum.ad}" />
                </p:column>

                <f:facet name="footer">
                </f:facet>
            </p:dataTable>

            <p:panel id="dialog" header="User Detail" widgetVar="userDialog">

                <h:panelGrid id="panelgrid" columns="2" cellpadding="4">
                    <p:dataTable id="display" var="adres" value="#{userOS.adresList}">
                        <p:column headerText="Adres Tipi">
                            <h:outputText value="#{adres.addressType}" />
                        </p:column>
                        <p:column headerText="Adres">
                            <h:outputText value="#{adres.address}" />
                        </p:column>
                        <p:column headerText="İl">
                            <h:outputText value="#{adres.city}" />
                        </p:column>
                        <p:column headerText="Ülke">
                            <h:outputText value="#{adres.country}" />
                        </p:column>
                    </p:dataTable>
                </h:panelGrid>

            </p:panel>


        </h:form>
    </f:view>
</h:body>
</html>

【问题讨论】:

    标签: hibernate jsf primefaces


    【解决方案1】:

    看起来一个操作系统可以有不同的地址,对吧?第二个数据表不应将 {userOS.selectedOS} 作为其值。相反,它应该指向应该在您的onRowSelect()method 中填充的地址列表。请记住,数据表需要一个作为某种集合的对象的值才能工作。 {userOS.selectedOS} 并非如此。

    这是我要做的:

    1. 将地址列表添加到您的 bean 并在您的 onRowSelect() 方法中填充该列表
    2. 为该列表创建一个 getter
    3. 使您的第二个数据表指向该列表;
    4. 从您的p:ajax 标记中删除oncomplete="userDialog"(它可能会给您一个javascript 错误,除非您在某处有一个带有该名称的p:remoteCommand
    5. 虽然您应该能够直接从p:ajax 更新数据表,但我过去曾遇到过这样的问题,所以我通常只是将一个矿井包装在一个面板组中,然后更新面板组。如果您遇到问题,请尝试一下。

    关于你的操作系统列表(第一个数据表):永远不要使用 getter 来执行复杂的操作(比如访问数据库)。这些 getter 在 JSF 生命周期中被执行了很多次,你不想重复对数据库的一堆查询,对吧?在方法 getOsList() 的开头打印一些东西到控制台,或者如果你不相信我的话,可以在那里设置一个断点。您应该在您的 bean 中声明一个列表并在适当的时候填充该列表。如果您使用会话范围的 bean,则每次导航到该页面时都需要填充列表。如果您使用的是视图/请求范围的 bean,那么 bean 构造函数将是填充列表的好地方。

    编辑

    将此添加到您的 xhtml 中的表单标签中:

    ...
    <h:form prependId="false">
            <f:metadata>
                <f:event type="preRenderView"
                    listener="#{userOS.populateOsList}" />
            </f:metadata>
    ...
    

    这将在您加载页面时填充操作系统列表。在这里执行此操作很重要,因为您的 bean 是会话范围的,并且在构造函数中加载列表可能会引入一些问题。

    我重构了你的 bean 代码。试试这个:

    @ManagedBean(name = "userOS")
    @SessionScoped
    public class KisiInfoProcess implements Serializable {
    
        private static final long serialVersionUID = 1L;
        private static final Logger log = LoggerFactory
                .getLogger(KisiInfoProcess.class);
        private List<OgrenimSureciBean> osList;
        private List<AddressBean> adresList;
        private OgrenimSureciBean selectedOS;
        private AddressBean selectedAdres;
    
        public OgrenimSureciBean getSelectedOS() {
            return selectedOS;
        }
        public void setSelectedOS(OgrenimSureciBean selectedOS) {
            this.selectedOS = selectedOS;
        }
        public AddressBean getSelectedAdres() {
            return selectedAdres;
        }
        public void setSelectedAdres(AddressBean selectedAdres) {
            this.selectedAdres = selectedAdres;
        }
    
        public void setOsList(List<OgrenimSureciBean> osList) {
            this.osList = osList;
        }
    
        public List<OgrenimSureciBean> getOsList(){
            return this.osList;
        }
    
        public void setAdresList(List<AddressBean> adresList) {
            this.adresList = adresList;
        }
    
        public List<AdressBean> getAdresList(){
            return this.adresList;
        }
    
        public void onRowSelect(SelectEvent event) {
            try {
                populateAddresList((OgrenimSureciBean) event.getObject());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public void populateOsList() {
            OgrenimsureciDAO ogrenimsureciDAO = new OgrenimsureciDAO();
    
            osList = new ArrayList<OgrenimSureciBean>();
    
            for (Iterator i = ogrenimsureciDAO.findByMezunOgrenciler((short) 8)
                    .iterator(); i.hasNext();) {
                Ogrenimsureci og = (Ogrenimsureci) i.next();
                OgrenimSureciBean osBean = new OgrenimSureciBean();
    
                osBean.setBolum(og.getBolum());
                osBean.setAd(og.getKisiByKisiid().getAd());
                osBean.setSoyad(og.getKisiByKisiid().getSoyad());
                osBean.setAltbirim(og.getAltbirim());
                osBean.setOgrencino(og.getOgrencino());
                osBean.setKisiid(og.getKisiByKisiid().getKisiid());
                osBean.setOgrencidurum(og.getOgrencidurum());
    
                osList.add(osBean);
                System.out.println("osBean : " + osBean.toString());
    
            }
            return osList;
        }
    
        public void populateAddresList(OgrenimSureciBean selected) throws Exception {
    
            log.debug("PersonalInfoProcess - getAddressInfo - Start");
            adresList = new ArrayList<AddressBean>();
    
            KisiDAO kisiDAO = new KisiDAO();
            AdresDAO adresDAO = new AdresDAO();
    
            Long kisiid = selected.getKisiid();
            System.out.println("kisiid :" + kisiid);
            Kisi kisi = kisiDAO.findById(kisiid);
    
            for (Iterator i = kisi.getKisiadresis().iterator(); i.hasNext();) {
    
                Kisiadresi kisiAdresi = (Kisiadresi) i.next();
                System.out.println("i :" + i);
                Adres tmpAdres = adresDAO.findById(kisiAdresi.getId().getAdresid());
    
                if (tmpAdres != null) {
                    AddressBean address = new AddressBean(kisiid);
    
                    if (tmpAdres.getAdresturu() == null) {
                        address.setAddressType(null);
                    } else {
                        address.setAddressType(tmpAdres.getAdresturu().getAd());
                    }
    
                    address.setAddress(tmpAdres.getAdres());
    
                    if (tmpAdres.getIl() == null) {
                        address.setCity(null);
                    } else {
                        address.setCity(tmpAdres.getIl().getAd());
                    }
    
                    if (tmpAdres.getUlke() == null) {
                        address.setCountry(null);
                    } else {
                        address.setCountry(tmpAdres.getUlke().getAd());
                    }
    
                    adresList.add(address);
    
                    System.out.println("adres" + address);
                    System.out.println("adreslist" + adresList);
                }
    
                log.debug("PersonalInfoProcess - getAddressInfo - End / Returning");
            }
        }
    }
    

    请注意,填充方法不返回列表;他们使用在 bean 本身上声明的列表。这些是您将页面指向的列表。

    【讨论】:

    • 我现在将 selectedUser 更改为 adresList 我收到此错误:javax.el.E​​LException: /index2.xhtml @54,72 value="#{userOS.adresList}": Error reading 'adresList ' 在类型 com.revir.process.InfoProcess 上我还添加了整个 InfoProcess.java 代码
    • 能否请您在我的代码中显示您的清单,如果您在我的代码中进行这些更改,我会很高兴
    • 您的 getAdresList 方法会引发异常。我很确定 JSF 不喜欢这样。为您的地址列表创建一个常规的 getter,它只返回列表。在其他地方填充列表,最好使用另一个名称。
    • 不幸的是,你必须自己弄清楚,因为我也有工作;)
    • 所以我必须用另一个名称创建 adresList,如果我理解正确,只需返回列表
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 2012-12-29
    • 1970-01-01
    相关资源
    最近更新 更多