我已经看过两次来自先前浏览过的页面的变量可能会干扰或替换下游查看的页面中的变量(例如h:datatable“var”)。
那么ui:param的范围是什么?有没有办法控制它?
答案 0 :(得分:7)
它基本上在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表达式将在相同的EL上下文(基本上是当前的HTTP请求)中进行评估,该表达式将引用“foo”,将通过值进行评估表达式在变量映射器中指定。这比重复组件的var
具有更高的优先级(如果有的话)。所以这可能确实会导致冲突和“空洞”的中继器。
最好为<ui:param>
或<h:dataTable var>
提供不同的名称。例如,您可以选择使用<ui:param>
左右为所有<c:set>
(和_
)变量加前缀。