2012-11-05 12 views
11

Widziałem 2 razy, że zmienna ze strony poprzednio przeglądanej może zakłócać lub zastępować zmienną (na przykład h: datatable "var") ze strony oglądanej w dół.Jaki jest zakres <ui:param> w JSF?

Jaki jest zakres ui: param? I czy istnieje sposób, aby to powstrzymać?

+0

Myślę, że zakres ui: param jest żądaniem i zostanie nadpisany na każde żądanie. – flash

+0

zobacz moją odpowiedź na Balus, gdyby to była tylko prośba, to nie wpłynęłoby to na inne strony –

Odpowiedz

7

Po prostu ustawia nowe mapowanie zmiennych w kontekście EL. Zobacz także 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 } 

linia Nota 99 (jak w Mojarra 2.1.0). Spowoduje to pobranie VariableMapper from the EL context, a następnie sets a variable mapping on it with a ValueExpression as value.

Ma to w zasadzie zakres "globalny". Więc jeśli nazwa zmiennej to "foo", to każde pojedyncze wyrażenie EL, które jest oceniane w tym samym kontekście EL (w zasadzie bieżące żądanie HTTP), które kiedykolwiek odnosi się do "foo", zostanie ocenione przez wyrażenie wartości określone w zmienny mapper. Ma to wyższy priorytet niż var powtarzalnych komponentów, jeśli takie istnieją. Może to rzeczywiście prowadzić do konfliktów i "pustych" wyglądających wzmacniaczy.

Lepiej nadaj innej nazwie nazwę <ui:param> lub <h:dataTable var>. Można na przykład wybrać przedrostek wszystkich zmiennych <ui:param> (i <c:set>) za pomocą _ lub tak.

+1

Dziękuję za odpowiedź. Jeśli zakres zmiennej był żądaniem HTTP, jak sądzę, sugerujesz, że nie zanieczyściłoby to innych stron? aby dać ci przykład w mojej aplikacji crud: przeglądam listę elementów (list.xhtml) skąd wybieram edytować jedną (edit.xhtml), która ma "ui: param", następnie klikam cancel aby wrócić do lista i każda pozycja na liście zostanie zastąpiona pojedynczą, która została wcześniej edytowana, ponieważ "var" listy ma taką samą nazwę jak "ui: param" na ekranie edycji –