JSF Überflüssige Methodenaufrufe - dataTable

Luke_

Mitglied
Hey Leute,
weil ich gemerkt habe, dass meine Applikation nach und nach langsamer wird, habe ich den Ablauf etwas unter die Lupe genommen. Dabei ist mir aufgefallen, dass beim füllen einer Tabelle die Methode zum abrufen der Liste ganze 12 mal ausgeführt wird.

Hier mal mein Quellcode:

index.xhtml
Java:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:ice="http://www.icesoft.com/icefaces/component">

<h:head></h:head>
<h:body>
	<f:view>
		<h:dataTable rendered="true" var="col" value="#{guestBean.getList() }">
			<h:column><h:outputText value="#{col}" /></h:column>
		</h:dataTable>
	</f:view>
</h:body>
</html>

GuestBean.java
Java:
public class GuestBean implements Serializable
{
	private int count=0;
	
	public GuestBean()
	{
		
	}
	
	public List<String> getList()
	{
		count++;
		System.out.println("Anz. Methodenaufrufe: " + count);
		List<String> list = new ArrayList<String>();
		list.add("test1");
		list.add("test2");
		return list;
	}
}

Mir kommt das Ganze sehr komisch vor und kann mir das Verhalten nicht erklären :noe:
Wenn das eine einfache getter-Methode wär, wär es ja eigentlich nicht so problematisch, aber oftmals müssen die Listen angepasst werden, Einträge entfernt oder die DB-Abfrage verändert werden...
Kann mir jemand dieses Phänomen erklären? bzw wüsste ich auch gerne, wie man die wiederholten Aufrufe umgehen kann.

Gruß Luke
 
Wenn das eine einfache getter-Methode wär, wär es ja eigentlich nicht so problematisch, aber oftmals müssen die Listen angepasst werden, Einträge entfernt oder die DB-Abfrage verändert werden...
Wie du selber schon eingesehen hast, sind getter bzw. setter in ManagedBeans sehr schlechte Orte für viel bzw. langsame Logik.
 
Da kann ich dir nur zustimmmen... Für gewöhnlich habe ich auch keine Logik in getter/setter drin. Allerdings muss ich einige Listen einfach anpassen. Die einfachste Lösung für mich wäre dann zusätzliche getter zu schreiben wie getListWithoutXXX().

Nunja, wie man es anders machen kann können wir uns immernoch drüber streiten, wenn ich weiß warum die Methoden so oft aufgerufen werden 😉
 
Lazy Init/Load würde sich auch anbieten.

JSF "cached" deine Daten nicht, wenn immer JSF (in verschiedenen Phasen zB.) etwas über die Daten wissen muss (sei es mal die Größe, mal den Inhalt, etc.), ruft es den Getter auf.
Du musst dafür sorgen dass das nicht zu problemen führt.
 
Hallo Luke,

könnte es sein, dass Du Deine Managed Bean mit @RequestScoped annotiert hast und diese deshalb nach jedem Seitenaufruf zerstört und dann wieder neu instantiiert wird?

Dann könnte z.B. @ViewScoped (in Verbindung mit z.B. @EJB) Deine Lösung sein.


Grüße

Bastian
 
maki hat da schon recht gehabt. jsf ruft die getter immer auf, wenn informationen zu dem objekt benötigt werden...

bei mir sieht das dann so aus:

Java:
START PHASE RESTORE_VIEW 1
END PHASE RESTORE_VIEW 1

START PHASE APPLY_REQUEST_VALUES 2
getList()
getList()
getList()
END PHASE APPLY_REQUEST_VALUES 2

START PHASE PROCESS_VALIDATIONS 3
getList()
getList()
getList()
END PHASE PROCESS_VALIDATIONS 3

START PHASE UPDATE_MODEL_VALUES 4
getList()
getList()
getList()
END PHASE UPDATE_MODEL_VALUES 4

START PHASE INVOKE_APPLICATION 5
END PHASE INVOKE_APPLICATION 5

START PHASE RESTORE_VIEW 1
END PHASE RESTORE_VIEW 1

START PHASE RENDER_RESPONSE 6
getList()
getList()
getList()
END PHASE RENDER_RESPONSE 6

warum nach INVOKE_APPLICATION wieder zurück in die phase RESTORE_VIEW gesprungen wird ist mir zwar noch nicht ganz klar, aber ich kann meine applikation nun erstmal optimieren.

falls noch jemand damit probleme hat, hier gibts noch ein paar infos:
Seam Framework - Why does JSF call my getter hundreds of times?
Seam Framework - How-to: avoid method or getter to be called several times by caching result
The BalusC Code: Using datatables
 

Zurück
Oben