Mehrfache Beanaufrufe

J@BA

Mitglied
Hallo Java-Forum Comunity,

Ich arbeite mich gerade durch ein (wie ich finde sehr gut gemachtes Tutorial JSF@Work)

Nun bin ich über etwas gestoßen, das ich entweder sehr unschön finde oder wo ich die Problemlösung noch nicht dazu habe.

Auf einer JSF Page möchte ich etwas anzeigen lassen abhängig von einem bestimmten Wert (Datenbank oder wie auch immer) oder mir auch irgendwelche Werte anzeigen lassen. (Ich lasse die ganze Seite weg und beschränk mich mal auf eine Beispielzeile)
Code:
                <h:commandLink value="#{customerBean.customerText}" action="/addCustomer1.xhtml" rendered="#{customerBean.loggedIn}" />

so in der entsprechenden Bean sind die Methoden dann:
Code:
    public String getCustomerText() {
        System.out.println("getIrgendwas");
        return "irgendwas";
    }

und

Code:
    public boolean isLoggedIn(){
        System.out.println("rendered");
        return true;
    }

soweit alles kein Problem.

Aber nun kommt wwärend des Ausführens in meiner Console
Code:
03.08.2010 13:58:40 at.irian.jsfatwork.gui.jsf.DebugPhaseListener [http-8080-1]
DEBUG Before phase: RESTORE_VIEW(1)
03.08.2010 13:58:40 at.irian.jsfatwork.gui.jsf.DebugPhaseListener [http-8080-1]
DEBUG After phase: RESTORE_VIEW(1)
03.08.2010 13:58:41 at.irian.jsfatwork.gui.jsf.DebugPhaseListener [http-8080-1]
DEBUG Before phase: RENDER_RESPONSE(6)
03.08.2010 13:58:41 org.apache.myfaces.shared_impl.renderkit.html.HtmlImageRendererBase encodeEnd
WARNUNG: ALT attribute is missing for : j_id1379898976_3d01ab7c
rendered
rendered
rendered
rendered
getIrgendwas
getIrgendwas
getIrgendwas
getIrgendwas
getIrgendwas
getIrgendwas
03.08.2010 13:58:41 at.irian.jsfatwork.gui.jsf.DebugPhaseListener [http-8080-1]
DEBUG After phase: RENDER_RESPONSE(6)

Angenommen ich würde dort nun auf eine Datenbank zugreifen dann würden hier für zwei Beanaufrufe plötzlich 10 Datenbankanfragen gemacht werden? Was soll denn das bitte ?

Bitte um eine akzeptable Lösung. Danke :)
 

Semerzo

Aktives Mitglied
Finde ich sehr gut, dass Dir das so früh in deiner JSF Zeit auffällt.

Die getter der JavaBeans, die in deiner xhtml / jsp Seite aufgerufen werden sollten sehr dumm und performant sein. Wenn etwas aufwendiges nötig ist, um die Werte zu generieren, sollte das im Konstruktor der Bean oder einer init Methode statt finden.

Zumal du auch in das Problem läufst wie du Exceptions behandeln und als Message ausgeben willst die in solchen lazy-gettern passieren. Denn dein h:messages sitzt für gewöhnlich prominent am Kopf der Seite. Der getter mit der Exception aber sitzt tiefer. Wenn Du den getter aber erst im RENDER_RESPONSE mit Leben füllst, ist zu dem Zeitpunkt die HTML-Ausgabe des h:messages schon auf dem ResponseStream. Da bekommst Du keine Meldung mehr rein, no way :)

Um solche Probleme zu lösen, gibt es Frameworks wie Google Guice, Spring, Apache Tapestry und andere.

Ich weiß, ist jetzt noch keine konkrete Antwort, aber es hindert Dich niemand Fragen zu stellen :)
 

J@BA

Mitglied
In wiefern kann Spring dabei helfen? Spring wird hierbei bisher für Dependency Injection verwendet, aber das hat doch mit Gettern und Settern nichts zu tun? Eigentlich ist das doch ein JSF-spezifisches Problem.

Das einzige, was mir bisher dazu aufgefallen ist, wäre eine extra Initialisierungsmethode, die mit
Java:
@PreRenderView
annotiert ist, in der Datenbankzugriffe gecachet werden.
Damit werden dann Datenbankzugriffe nur einmal pro Request/Bean ausgeführt.
 

Semerzo

Aktives Mitglied
Das einzige, was mir bisher dazu aufgefallen ist, wäre eine extra Initialisierungsmethode
Genau darum dreht es sich. Mit Spring erledigst Du das in einer init-methode

[XML]<bean id="exampleInitBean" class="examples.ExampleBean" init-method="init"/>[/XML]
Java:
public class ExampleBean {
    
    public void init() {
        // do some initialization work
        // do dangerous stuff, catch and handle exceptions, display proper messages
        // cach stuff from DB in attributes of the bean
    }
}
Mitlerweile geht das auch über JSF Bordmittel, sprich Du würdest einfach @PreRenderView über die init Methode setzen. JSF 2 gab es eben nicht immer, deswegen ist über die Zeit von JSF 1 ein recht großer Zoo an Frameworks gewachsen, der die Lücken gefüllt hat. Über den Abschnitt wirst Du auch noch in deinem Tutorial stolpern "7 Das Ökosystem von JavaServer Faces".
 

Oben