Merhaba. Primefaces ile datatable kullanirken anlamadigim olaylar oluyor.Ben projeyi refresh yaparken aynı(listEmpDetail ) method 2 kez calisiyor.Datatablenin rowSelection özelliğini kullandığım zaman ise listEmpDetail methodu defalarca çalışıyor ,halbuki o methodun çalışmaması gerek.Projeye bu linkden ulaşa bilirsiniz : LINK

Yardımcı olursanız sevinirim.Teşekkürler Kaynak kod :

<h:form id="fsearch">
        <p:growl id="growl5" showDetail="true" life="10000" />

        <p:dataTable var="e"  value="#{ec.employee}" 
                     id="dypdatatable" scrollable="true"  scrollHeight="600" scrollWidth="1500"
                     selection="#{ec.selectedEmp}" selectionMode="single" rowKey="#{e.id}"

                     >

            <f:facet name="header" >
                List of Employee
            </f:facet>
            <p:ajax event="rowSelect" listener="#{ec.onRowSelect}" update=":fsearch:growl5" />

            <p:column headerText="Id" style="width:50px;" filterStyle="width: 45px;" filterBy="#{e.id}" sortBy="#{e.id}">
                <h:outputText value="#{e.id}"  />
            </p:column>
            <p:column headerText="Name" style="width:350px;" filterStyle="width: 345px;" filterBy="#{e.name}" sortBy="#{e.name}">
                <h:outputText value="#{e.name}"  />
            </p:column>
            <p:column headerText="Surname" style="width:60px;" filterStyle="width: 55px;" filterBy="#{e.surname}" sortBy="#{e.surname}">
                <h:outputText value="#{e.surname}" />
            </p:column>
            <p:column headerText=" Country" style="width:60px;" filterStyle="width: 35px;" filterBy="#{e.country}" sortBy="#{e.country}">
                <h:outputText value="#{e.country}" />
            </p:column>
            <p:column headerText="City" style="width:30px;" filterStyle="width: 25px;" filterBy="#{e.city}" sortBy="#{e.city}">
                <h:outputText value="#{e.city}" />
            </p:column>
        </p:dataTable>

    </h:form>

Database işləmi :

public List<empdetail> listEmpDetail() { try { System.out.println("listEmpDetail girir connect olmayib - "+new Date()); connection();

        System.out.println("listEmpDetail girir - "+new Date());
        System.out.println();
        String sql = "SELECT * from  emp_detail";
        System.out.println(sql+"-"+new Date());
        psmt = connection.prepareStatement(sql);
        resultSet = psmt.executeQuery();

        resultSet.last();
        System.out.println(resultSet.getRow()+" - "+new Date());
        resultSet.first();
        System.out.println(resultSet.getRow()+" - "+new Date());
        List<EmpDetail> data = new ArrayList<EmpDetail>();
        while (resultSet.next()) {
            EmpDetail p = new EmpDetail();
            p.setId(resultSet.getInt(1));
            p.setName(resultSet.getString(2));
            p.setSurname(resultSet.getString(3));
            p.setCountry(resultSet.getString(4));
            p.setCity(resultSet.getString(5));
            data.add(p);
        }
        System.out.println("listEmpDetail return - "+new Date());
        return data;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    } finally {
        close();
    }
}

Managed Bean :

@ManagedBean(name = "ec") @javax.faces.bean.SessionScoped public class EmployeeController implements Serializable {

 private List<EmpDetail> employee= new ArrayList<EmpDetail>();
private DbSQL db = new DbSQL();

private EmpDetail selectedEmp;

public EmployeeController() {
}

public List<EmpDetail> getEmployee() {
    employee = db.listEmpDetail();
    return employee;
}

public void setEmployee(List<EmpDetail> employee) {
    this.employee = employee;
}

public EmpDetail getSelectedEmp() {
    return selectedEmp;
}

public void setSelectedEmp(EmpDetail selectedEmp) {
    this.selectedEmp = selectedEmp;
}

    public void onRowSelect(SelectEvent event) {
    System.out.println("----- Secilenenin Idsi : "+String.valueOf(((EmpDetail) event.getObject()).getId())+"--------");
    FacesMessage msg = new FacesMessage("Employee Selected", String.valueOf(((EmpDetail) event.getObject()).getId()));
    FacesContext.getCurrentInstance().addMessage(null, msg);
}
public void onRowUnselect(UnselectEvent event) {
    System.out.println("----- Secilenenin Idsi : "+String.valueOf(((EmpDetail) event.getObject()).getId())+"--------");
    FacesMessage msg = new FacesMessage("EmpDetail UNSelected", String.valueOf(((EmpDetail) event.getObject()).getId()));
    FacesContext.getCurrentInstance().addMessage(null, msg);
}

}

soruldu: 08 Eyl '14, 02:58

Elxan's gravatar image

Elxan
135161924
cevap kabul oranı: 14%

değiştirildi: 08 Eyl '14, 03:49

Bunu debug yaparken mi fark ediyorsun ?

(08 Eyl '14, 03:14) Tugrul Asik Tugrul%20Asik's gravatar image

Glassfish-in consolundan bakıyorum

(08 Eyl '14, 03:16) Elxan Elxan's gravatar image

Metodun 2 defa çalışması doğaldır. İlk sorgu kayıtları getirirken ikincisi kayıtların sayısını getirir.

Fazla çalışması ise metodunuzu kaynak kodda nereye eklediğiniz ile alakalı bir durum olduğunu düşünüyorum. Kaynak kodu sorunuzun içine ekleyiniz lütfen.

(08 Eyl '14, 03:35) Turgay Can Turgay%20Can's gravatar image

@J2EE elave etdim

(08 Eyl '14, 03:50) Elxan Elxan's gravatar image

rowSelect üzerinde bu şekilde update="growl5" denermisin eğer sıkıntı yaratırsa update=":fsearch:growl5" bunu kaldırırmısın.

++

Bu kodun balta ile girilip, sağlam bir refactoring ' e ihtiyacı olduğunu belirteyim :) DB'ye erişirken hibernate orm aracını kullanmaya özen gösteriniz hatta kendinizi buna zorunlu hissediniz.

(08 Eyl '14, 04:32) Turgay Can Turgay%20Can's gravatar image

@J2EE update="growl5" degisince hata veriyor. ORM aracai kullaninca farklimi olacak? Bir de rafctoring neden ihtiyac var ,belirtirseniz sevinirim :)

(08 Eyl '14, 05:06) Elxan Elxan's gravatar image

ORM aracı sizi database bağımlılığından bilimum ölçüde kurtarır. Mesela şu db'ye erişip, dataları doldurduğunuz metod.

Her db'ye eriştiğinizde, jdbc bir session açıp, database connection objesi oluşturuyorsunuz. ORM size bir sessionFactory sınıfı üzerinde uygulamanız ayağa kalktığında, bir adet thread safe connection nesnenizi yaratır ve siz her sorgu attığınızda ayakta olan herhangi bir session objesi ile db'ye erişebilirsiniz.

Kod yazımı olarakta her seferinde sql yazmaktansa, objelerle uğraşmak daha rahattır.

http://www.btsoru.com/questions/6058/ormnin-avantajlar-nelerdir

(08 Eyl '14, 06:05) Turgay Can Turgay%20Can's gravatar image
7 yorumdan 5 tanesi gösteriliyor hepsini göster

Bahsettiğin problemin kaynağı aşağıdaki kod;

public List<EmpDetail> getEmployee() {
    employee = db.listEmpDetail();
    return employee;
}

DataTable her refresh olduğunda employee listesini birkaç defa alır. Çözüm olarak söyleyebileceğim,

public EmployeeController() {
     employee = db.listEmpDetail();
}

public List<EmpDetail> getEmployee() {
    return employee;
}
permanent link

cevaplandı: 08 Eyl '14, 05:01

SaRPaRDa's gravatar image

SaRPaRDa
5.0k213165
cevap kabul oranı: 27%

cok tesekkurler.Methodun neden bir kac defa iwledigini de ayrintili sekilde anlatirsaniz sevinirim :)

(08 Eyl '14, 05:11) Elxan Elxan's gravatar image

JSF, aldığı verileri bellekte tutmaz. Aldığı bilgilerle sayfayı oluşturur. Bu durum veriyi okumuş olsa dahi veri ile ilgili her değişiklikte bean'ı okumak zorunda olmasına sebep olur.

Örneğin, datatable'ı satır bazlı oluşturduğundan dolayı satırları okumak için defalarca BeanEe gider. herhangi bir refresh yada update işleminde tekrar verileri okumaya başlar.

Bu sebepten, getter veya setter alanları içerisinde veritabanına erişemek programın sıkıntıya girmesine sebep olur. @J2EE , refactoring derken bu tür iyileştirmelerden bahsetmişti.

(08 Eyl '14, 06:00) SaRPaRDa SaRPaRDa's gravatar image

İlgili yazıyı okumanı öneririm. Her şey daha iyi netleşecektir.

permanent link

cevaplandı: 08 Eyl '14, 04:05

Tugrul%20Asik's gravatar image

Tugrul Asik
1.3k716
cevap kabul oranı: 26%

değiştirildi: 08 Eyl '14, 04:05

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×1,077
×281
×97

Soruldu: 08 Eyl '14, 02:58

Görüntüleme: 886 kez

Son güncelleme: 08 Eyl '14, 06:05

powered by BitNami OSQA