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
 
M

maki

Gast
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.
 

Luke_

Mitglied
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 ;)
 
M

maki

Gast
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.
 

Tatsu

Mitglied
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
 

Luke_

Mitglied
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K jsf 1.2 tomahawk t:dataTable generic use Web Tier 3
W JSF DataTable - Filter Funktion funktioniert nicht Web Tier 3
W JSF einfache DataTable PrimeFaces Web Tier 1
F JSF h:dataTable fix Header und Scroll Body Web Tier 0
D JSF DataTable konvertiert Felder nicht Web Tier 1
K deleteButton in dataTable geht nur halb Web Tier 8
G JSP dataTable header - Datenwerte verwenden? Web Tier 3
T JSF Primefaces: DataTable Ajax Update - Weiterleitung von anderer Seite Web Tier 11
F Primefaces Datatable => Inplaces Web Tier 3
F Primefaces Datatable Web Tier 6
F.S.WhiTeY JSF h:dataTable / p:komponente Pagination mit Buchstaben. Web Tier 2
jottyfan JSF dataTable und graphicImage (mit JQuery) Web Tier 4
M JSF Composite components - dynamische dataTable? Web Tier 8
M JSF DataTable refreshen mit Ajax? Web Tier 5
M JSF Datatable, nichts geht ohne vorher zu refreshen... Web Tier 4
P JSF 1.2 commandButton in dataTable Web Tier 2
T DataTable Composite-Component und ManyToOne Web Tier 5
J JSF Datatable bestimmte Methode Web Tier 4
T JSF/Richfaces rich:dataTable with rich:datascroller Web Tier 1
A [PrimeFaces] dataTable mit paginator Probleme Web Tier 2
O Focus auf Textfeld, in letzter Reihe einer dataTable Web Tier 2
M Frage zur Konfiguration einer RichFaces DataTable Web Tier 4
M Datatable und der Zurückbutton Web Tier 4
K JSF Tomahawk dataScroller mit dataTable Web Tier 4
Y dataTable als dynamisches Grid Web Tier 4
E JSF Datatable erst nach Buttonklick anzeigen Web Tier 2
R JSF <rich:datatable> problem Web Tier 4
V JSF: dataTable Getter wird nie aufgerufen Web Tier 6
S JSF dataTable Position feststellen Web Tier 2
S JSF: colspan und rowspan in datatable Web Tier 4
E JSF Datatable leere Zellen anzeigen Web Tier 2
T richfaces datatable Web Tier 3
A JSF: Datatable Links mit Properties Web Tier 3
S richfaces Datatable horizontal ausgeben Web Tier 2

Ähnliche Java Themen

Neue Themen


Oben