2012-11-05 9 views
11

Ich habe 2 Mal gesehen, dass eine Variable von einer Seite, die zuvor durchsucht wurde, eine Variable (z. B. h: datatable "var") von einer stromabwärts angezeigten Seite stören oder ersetzen kann.Was ist der Umfang von <ui:param> in JSF?

Also was ist der Umfang von UI: Param? Und gibt es eine Möglichkeit, es einzudämmen?

+0

Ich denke, der Umfang von UI: Param ist Anfrage und wird bei jeder Anfrage überschrieben werden. – flash

+0

sehe meine Antwort auf Balus, wenn es nur die Anfrage war, dann würde es andere Seiten nicht beeinflussen –

Antwort

7

Es legt grundsätzlich eine neue Variablenzuordnung im EL-Kontext fest. Siehe auch the source code of ParamHandler:

94  public void apply(FaceletContext ctx, UIComponent parent) 
95    throws IOException { 
96   String nameStr = this.name.getValue(ctx); 
97   ValueExpression valueVE = this.value.getValueExpression(ctx, 
98     Object.class); 
99   ctx.getVariableMapper().setVariable(nameStr, valueVE); 
100 } 

Hinweis Linie 99 (wie in Mojarra 2.1.0). Dies ruft die VariableMapper from the EL context und dann sets a variable mapping on it with a ValueExpression as value ab.

Dies hat grundsätzlich den "globalen" Anwendungsbereich. Wenn also der Variablenname "foo" ist, dann wird jeder einzelne EL-Ausdruck, der im selben EL-Kontext (im Grunde die aktuelle HTTP-Anfrage) ausgewertet wird, welcher immer "foo" referenziert, durch den Wertausdruck wie in der Variablen-Mapper. Dies hat eine höhere Priorität als die var der sich wiederholenden Komponenten, falls vorhanden. Das kann also zu Konflikten und "leer" aussehenden Repeatern führen.

Besser geben Sie entweder die <ui:param> oder die <h:dataTable var> einen anderen Namen. Sie könnten zum Beispiel wählen, dass alle <ui:param> (und <c:set>) Variablen mit _ oder so vorangestellt werden.

+1

Danke für Ihre Antwort. Wenn der Umfang der Variable die HTTP-Anfrage war, wie ich denke, Sie implizieren dann würde es andere Seiten nicht richtig verschmutzen? um dir ein Beispiel in meiner Crud-App zu geben: Ich blicke eine Liste von Elementen (list.xhtml) von dort wähle ich eine (edit.xhtml) zu bearbeiten, die ein "ui: param" hat, dann klicke ich auf cancel um zurück zu gehen Die Liste und jedes Element in der Liste werden mit dem einzigen überschrieben, das zuvor bearbeitet wurde, da die "var" der Liste im Bearbeitungsbildschirm den gleichen Namen wie "ui: param" hat –

Verwandte Themen