【发布时间】:2012-11-05 08:19:21
【问题描述】:
我已经看到 2 次来自先前浏览的页面的变量会干扰或替换下游查看的页面中的变量(例如 h:datatable “var”)。
那么 ui:param 的范围是什么?有没有办法控制它?
【问题讨论】:
-
我认为 ui:param 的范围是请求,并且会在每次请求时被覆盖。
-
看我对balus的回答,如果只是请求那么它不会影响其他页面
标签: jsf
我已经看到 2 次来自先前浏览的页面的变量会干扰或替换下游查看的页面中的变量(例如 h:datatable “var”)。
那么 ui:param 的范围是什么?有没有办法控制它?
【问题讨论】:
标签: jsf
它基本上在 EL 上下文中设置了一个新的变量映射。另见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 }
注意第 99 行(如 Mojarra 2.1.0)。这将检索VariableMapper from the EL context,然后检索sets a variable mapping on it with a ValueExpression as value。
这基本上具有“全局”范围。因此,如果变量名称是“foo”,那么 每个 在同一 EL 上下文(基本上是当前的 HTTP 请求)中评估的单个 EL 表达式(基本上是当前的 HTTP 请求)将通过该值进行评估变量映射器中指定的表达式。这比重复组件的var(如果有)具有更高的优先级。所以这可能确实会导致冲突和“空”的中继器。
最好给<ui:param> 或<h:dataTable var> 一个不同的名称。例如,您可以选择在所有<ui:param>(和<c:set>)变量前面加上_ 左右。
【讨论】: