11

我已经看到 2 次来自先前浏览的页面的变量可能会干扰或替换下游查看的页面中的变量(例如 ah:datatable "var")。

那么 ui:param 的范围是什么?有没有办法控制它?

4

1 回答 1

7

它基本上在 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 上下文中检索,然后使用as 值在其上设置一个变量映射ValueExpression

这基本上具有“全球”范围。因此,如果变量名是“foo”,那么在同一个 EL 上下文(基本上是当前的 HTTP 请求)中评估的每个单个 EL 表达式都将由变量映射器中指定的值表达式评估. 这具有比var重复组件(如果有)更高的优先级。所以这可能确实会导致冲突和“空”的中继器。

最好给 the<ui:param>或 the<h:dataTable var>不同的名称。例如,您可以选择在所有<ui:param>(and <c:set>) 变量前面加上_or 。

于 2012-11-05T11:49:35.140 回答