Ответ 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>
) с помощью _
или так.