RichFaces İle Veritabanı Üzerinden Sayfalama

RichFaces ile sayfalama yapmak istediginizde bunu direkt olarak bean üzerinden yapiyor. Yani tüm datayi çekmis oluyorsunuz. Bu ciddi bir performs ve bellek sorunu yaratabilir. Eger sayfalamayi veritabani üzerinden yapmak istiyorsaniz asagida JPA ile birlikte kullanilan bir örnek bulabilirsiniz.

    <h:form>
     <rich:dataTable value="#{ogrenciBean.ogrenciListesi}" var="ogr" width="600px" rows="#{ogrenciBean.kayitSayisi}">
      <h:column>
       <f:facet name="header">Ad</f:facet>
       #{ogr.ad}
      </h:column>
      <h:column>
       <f:facet name="header">Soyad</f:facet>
       #{ogr.soyad}
      </h:column>
      <f:facet name="footer">
       <rich:datascroller maxPages="5" page="#{ogrenciBean.sayfa}"/>
      </f:facet>
     </rich:dataTable>
    </h:form>
    import java.util.List;
     
    import javax.persistence.EntityManager;
     
    import com.mergeCons.egitim.entity.Ogrenci;
    import com.mergeCons.egitim.util.EntityUtil;
     
    public class OgrenciBean {
     
     private Integer sayfa = 1;
     private Integer kayitSayisi = 10;
     
     public List<Ogrenci> getOgrenciListesi() {
      EntityManager em = EntityUtil.getEntityManager();
     
      List<Ogrenci> sonuclar = em.createQuery("from Ogrenci").setMaxResults(getKayitSayisi())
      .setFirstResult((getSayfa()1) * getKayitSayisi())
      .getResultList();
     
      PagedList<Ogrenci> entityList = new PagedList<Ogrenci>(sonuclar ,toplamKayitlar(), kayitSayisi);
     
      return entityList;
     }
     
     private Long toplamKayitlar(){
      EntityManager em = EntityUtil.getEntityManager();
      return (Long)em.createQuery("select count(o) from Ogrenci o").getSingleResult();
     }
     
     public void setSayfa(Integer sayfa) {
      this.sayfa = sayfa;
     }
     
     public Integer getSayfa() {
      return sayfa;
     }
     
     public void setKayitSayisi(Integer kayitSayisi) {
      this.kayitSayisi = kayitSayisi;
     }
     
     public Integer getKayitSayisi() {
      return kayitSayisi;
     }
    }
    import java.util.AbstractList;
    import java.util.List;
     
    public class PagedList<E> extends AbstractList<E> {
     
     private final List<E> list;
     private final int total;
     private final int pageLimit;
     
     public PagedList(List<E> l, long total, int pageLimit) {
      this.list = l;
      this.total = (int)total;
      this.pageLimit = pageLimit;
     }
     
     public int size() {
      return total;
     }
     
     public E get(int i) {
      i = i % this.pageLimit;
      return list.get(i);
     }
    }
  1. nova
    Jul 18th, 2011 at 10:56 | #1

    JSF kaç versiyonu için kullanılabilir. 1.2 için uygulanabilir mi?

  2. Jul 18th, 2011 at 11:16 | #2

    Evet 1.2 de olabilir

  3. Fatih
    Jul 29th, 2011 at 11:35 | #3

    Merhaba, örnek için teşekkürler. Ancak tabloda örneğin 22 kayıt varsa 3. sayfada IndexOutOfBound hatası veriyor. Biraz inceleme sonrasında şunu fark ettim; PageList constructor methoduna gönderilen toplamKayitsayisi (örnekte 10) değişkeni PageList sınıfında E get(i) methodundaki listenin index sayısından fazla olmasından ötürü exception atıyor. Benim bulduğum çözüm şeklinde.


    if(sonuclar.size() >= kayitSayisi ){
    entityList = new PagedList(sonuclar,toplamKayitlar(), kayitSayisi);
    }
    else{
    entityList = new PagedList(sonuclar,toplamKayitlar(), sonuclar.size());
    }

    yada if-else gerek kalmadan


    entityList = new PagedList(sonuclar,toplamKayitlar(), sonuclar.size());

    denedim, bende çalıştı.

  4. Jul 31st, 2011 at 07:01 | #4

    Tekrar denedim boyle bir hata vermiyor ? Ancak sayfa sayisini asan parametreler hata veriyor olabilir. Count ile bunu guncel tutmak gerekli.

Leave a comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>