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

时间:2013-09-30 12:12:49

标签: jsf jsf-2

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

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

    查看:

     <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(包括此版本号)?

1 个答案:

答案 0 :(得分:2)

  

使用EL-Binding并将绑定组件作为参数并读取(并在此组件上设置属性)是否安全。 E.g。

要点是,您应该永远将组件绑定为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。到目前为止,我没有看到与这些症状严格相关的任何内容。所以,这显然是没有票的修复。也许开发人员出现并巧合地看到了一些虚假的代码,嘿,这是不对的,让我们马上解决它吧!我没有密切跟踪没有票证的源代码中的实际更改,很抱歉我无法回答这部分内容。