【问题标题】:what is the scope of <ui:param> in JSF?JSF 中 <ui:param> 的范围是什么?
【发布时间】:2012-11-05 08:19:21
【问题描述】:

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

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

【问题讨论】:

  • 我认为 ui:param 的范围是请求,并且会在每次请求时被覆盖。
  • 看我对balus的回答,如果只是请求那么它不会影响其他页面

标签: jsf


【解决方案1】:

它基本上在 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(如果有)具有更高的优先级。所以这可能确实会导致冲突和“空”的中继器。

最好给&lt;ui:param&gt;&lt;h:dataTable var&gt; 一个不同的名称。例如,您可以选择在所有&lt;ui:param&gt;(和&lt;c:set&gt;)变量前面加上_ 左右。

【讨论】:

  • 感谢您的回答。如果变量的范围是我认为您暗示的 HTTP 请求,那么它不会污染其他页面,对吗?在我的 crud 应用程序中给你一个例子:我从那里浏览一个项目列表(list.xhtml)我选择编辑一个具有“ui:param”的项目(edit.xhtml),然后我单击取消返回列表和列表中的每个项目都被之前编辑的单个项目覆盖,因为列表的“var”与编辑屏幕中的“ui:param”具有相同的名称
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
  • 2012-04-11
  • 2013-01-05
  • 2021-05-23
  • 1970-01-01
相关资源
最近更新 更多