Какова область действия <ui: param> в JSF?

Я видел 2 раза, что переменная из ранее просматриваемой страницы может помешать или заменить переменную (например, h: datatable "var" ) на странице, просматриваемой ниже по течению.

Итак, какова область действия ui: param? И есть ли способ сдержать его?

Ответ 1

В основном он устанавливает новое сопоставление переменных в контексте EL. См. Также исходный код 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    }

Отметьте строку 99 (как в Mojarra 2.1.0). Это извлекает VariableMapper из контекста EL, а затем устанавливает сопоставление переменных на нем с ValueExpression как значение.

В основном это "глобальная" область. Поэтому, если имя переменной "foo", то каждое выражение EL, которое оценивается в одном и том же EL-контексте (в основном, текущий HTTP-запрос), который когда-либо ссылается на "foo", будет оцениваться выражением значения, как указано в переменной mapper, Это имеет более высокий приоритет, чем var повторяющихся компонентов, если они есть. Таким образом, это может привести к конфликтам и "пустым" выглядящим повторителям.

Лучше указать либо <ui:param>, либо <h:dataTable var> другое имя. Например, вы можете выбрать префикс всех переменных <ui:param><c:set>) с помощью _ или так.