【问题标题】:Is it safe to pass EL-Bound component as action listener parameter in JSF?在 JSF 中将 EL-Bound 组件作为动作侦听器参数传递是否安全?
【发布时间】:2013-10-06 07:15:57
【问题描述】:

如果我从 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(包括这个版本号)?

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    使用 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";
    }
    

    另见:


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

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

    【讨论】:

      猜你喜欢
      • 2019-12-03
      • 2014-05-05
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 2020-01-23
      • 2019-03-29
      相关资源
      最近更新 更多