2011-01-11 6 views
0

Unsere Seite verfügt über eine Datentabelle, die Datensätze von einem Webdienst zeigt. Der Webdienst fragt eine Datenbank ab, und die Abfrage kann zwischen 10 Sekunden und 100 Sekunden dauern.Verbindende Liste mit Datentabelle nach Laden der Seite (nicht faulen Laden)

Ich war am Anfang der Arraylist auf die Datentabelle in der Backing Bean Konstruktor binded Laden:

private ArrayList myList; 
public MyBean 
{ 
    myList = WebServices.getList(); 
} 

In diesem Szenario wird die gesamte Seite beginnt erst zu machen, nachdem die Web-Service, alle Daten zurückgibt.

Wo soll ich den Webservice aufrufen (d. H. myList = WebServices.getList();), damit der Rest der Seite parallel geladen wird, und während der Webservice einen Fortschrittsbalken oder etwas in der Datentabelle anzeigt?

Ich denke, meine Vorstellungen über die JSF/IceFaces Lebenszyklus nicht klar sind ...

Auch dies ist nicht etwa ein träges Laden, weil dafür müssten wir Paginierung in unserer datatabase Abfrage zu implementieren, zu.

Danke!

Antwort

0

Ich habe eine Arbeit mit Threads gefunden.

public class MyBean 
{ 
    private ArrayList myList; 
    private PersistentFacesState state; 

    public MyBean 
    { 
     state = PersistentFacesState.getInstance(); 
     myList = new ArrayList(); 
     new Thread(new RunService()).start(); 
    } 

    public class RunService implements Runnable 
    { 
     public void run() 
     { 
      try 
      { 
       list = WebServices.getList(); 
       state.executeAndRender(); //Need to do this to update view 

      } 
      catch(Exception e) 
      { 

      } 
     } 

    } 
} 

Initally war mir nicht bewusst, der PersistentFacesState und executeAndRender();, so dass, obwohl der Thread die Array-Liste aktualisieren würde, wurde die Ansicht nicht aktualisiert wird. Dies lag daran, dass der JSF/IceFaces-Lebenszyklus bereits beendet war.

Wenn Sie die Ansicht beibehalten und dann erneut rendern, wird dieses Problem ebenfalls gelöst.

Ich hoffe, diese Lösung hilft jemandem.