在 JSF 中将 EL-Bound 组件作为操作侦听器参数传递是否安全?



如果我从Mojarra 2.1.21升级到Mojarra 2.1.22,23,24或26,在我看来我就变成了一个错误。该错误与绑定有关。(重复的组件 ID(,因为我绑定了 sessionScoped bean 属性。我已经将我的 bean 更改为使用 EL 范围的绑定。所以我的问题:

  1. 使用 EL-Binding 并将绑定组件作为参数并读取(并在此组件上设置属性(是否安全? 例如

    视图:

     <p:dataTable binding="#{table}"> ...</p:dataTable>
     <p:commandButton action="#{bean.doit(table)}" />
    

    豆:

     public void doit(DataTable dt) {
        dt.getSomething();
        dt.setSomething();
     }
    
  2. 为什么它首先发生在 Mojara 版本 2.1.22(包括此版本号(?

使用 EL-Binding 并将绑定组件作为参数并读取(并在此组件上设置属性(是否安全? 例如

关键是,永远不应该将组件绑定为比请求范围更广的 Bean 的属性。UI 组件本质上是请求范围的。在构建/恢复视图期间,JSF 将检查 getter 是否尚未返回现有组件,然后重用它,而不是以通常的方式创建新组件。但是,如果 bean 从属于完全不同的视图的上一个/另一个请求/视图/会话返回一个已经创建的请求/会话,那么当状态发生冲突时,这一切都会失败。

在这个特定的解决方案中,您没有任何地方将组件引用为 Bean 属性,因此这是绝对安全的。但是,更好的办法是只绑定您真正感兴趣的特定组件属性,而不是整个组件:

<p:dataTable something="#{bean.something}">

private String something;
public void doit() {
    System.out.println(something);
    something = "something new";
}

另请参阅:

  • "绑定"属性在 JSF 中如何工作?何时以及如何使用它?

为什么它首先发生在 Mojara 版本 2.1.22(包括此版本号(?

以下是 2.1.22 发行说明。到目前为止,我没有看到任何与这些症状严格相关的内容。因此,这显然是一个没有票证的修复。也许一个开发人员偶然发现了一些虚假代码,然后想,嘿,这是不对的,让我们现在修复它!我没有密切跟踪在没有票证的情况下执行的源代码的实际更改,所以很抱歉我无法回答这部分。

相关内容

  • 没有找到相关文章

最新更新