2011-01-11 11 views
0

vielleicht ist dieser Titel nicht wirklich präzise, ​​aber hier ist das Problem. Ich mache ein JSF-Projekt und ich brauche eine folgende:JSF: Seite zeigt, während BackingBean noch funktioniert

Wenn Benutzer anmeldet meine Anwendung (dh wenn er auf Startseite navigiert), eine Methode, die einige Geld Wechselkurse aus dem Internet und/oder bekommt Datenbank muss aufgerufen werden. Die Ausführung dieser Methode (Seitenanalyse, Datenspeicherung usw.) dauert etwa 5-6 Sekunden. Ich möchte nicht, dass die Navigation von der Anmeldung zur Startseite 5 bis 6 Sekunden dauert, ich möchte eine davon (nicht entscheiden, welche) noch passieren:

1) Wenn sich der Benutzer anmeldet, sieht er die Startseite (sofort, nicht nach 5-6 Sekunden) und kann klicken und/oder navigieren, während die Methode im Hintergrund arbeitet.

2) Wenn sich der Benutzer anmeldet, sieht er die Startseite (sofort), ein Ladezeichen in einem Teil der Seite und nachdem die Methode ausgeführt wurde, sieht er dataTable mit Wechselkursen.

Frage ist, wie man das tun? Wenn ich diese Methode im HomePageBean-Konstruktor einfüge, wird die Seite erst angezeigt, wenn die Methode ausgeführt wird. Vielleicht kann ich ein unsichtbares Element auf der Startseite platzieren und diese Methode in einigen Getter aufrufen, aber ich weiß nicht, ob das der richtige Weg ist (scheint wie Hack) oder wird es tatsächlich funktionieren.

Ich benutze JSF 2.0 und Primefaces. Vielen Dank im Voraus

Antwort

0

Verwenden ApplicationScoped Bohne wie in Beispiel unten:

@ManagedBean(name = "exchRateBean", eager = true) 
@ApplicationScoped 
public class ExchRateBean { 

    public List<Rate> getRates(Date date) { 
    // cached data or DAO methods here 
    } 

    @PostConstruct 
    public void init() { 
    // Initial web-app initialization, will run once upon deploy 
    } 
} 

Und hier ist Ihr Backing Bean Zugriff auf anwendungs ​​scoped Bohne.

@RequestScoped 
public class MyBean { 
    @ManagedProperty(value="#{exchRateBean}") 
    private ExchRateBean exchRateBean; 

    // your JSF methods 
    public List<Rate> getRates(Date date) { 
    return getExchRateBean().getRates(date); 
    } 

    // G&S 
    public ExchRateBean getExchRateBean() { 
    return exchRateBean; 
    } 

    public void setExchRateBean(ExchRateBean exchRateBean) { 
    this.exchRateBean = exchRateBean; 
    } 
} 
+0

Danke für Ihre Antwort, aber ich bin mir nicht sicher, ob ich vollständig verstehe. Stellt MyBean LoginBean/HomePageBean dar und meine ExchRate dataTable ruft Daten von MyBean.rates ab? Wenn das stimmt, dann löst es vielleicht den 2. Teil (ich werde es heute versuchen), vorausgesetzt, es zeigt Startseite und leere Datentabelle sofort an und füllt dataTable, nachdem getRates (Datum) ausgeführt wurde. Aber was mit 1., dh. Wo soll man die Methode getRates (Datum) aufrufen? – Nikola

+0

@Nikola MyBean ist Ihre LoginBean/HomePageBean, während ExchRate Bean eine für die gesamte Site ist. Es stellt gängige Methoden und Daten zur Verfügung, die von anderen Beans konsumiert werden können. In diesem Fall ruft MyBean Raten von ExchRate ab. Wie bei der Verzögerung - Sie könnten init (@PostConstruct) und Rate-Hash (Cache) in App-Bereich beanteten Bean, so dass schnelle Reaktion auf MyBean und alle anderen Beans in Exchange Rate interessiert. – Osw

+0

Es gibt andere Lösungen wie Ajax Hintergrund laden, aber nicht in Ihrem speziellen Fall. Die Preise sind unpersönlich, das gleiche für alle Benutzer/Wünsche (glaube ich), und es wäre ziemlich seltsam, wenn die Site ein paar Sekunden nachdenken muss, um die einfache Wechselkurstabelle zu zeigen :) – Osw