【问题标题】:Bean methods not invoked on JSF page which is included by <iframe><iframe> 包含的 JSF 页面上未调用的 Bean 方法
【发布时间】:2016-02-17 18:00:33
【问题描述】:

我有一个&lt;p:commandButton&gt;,它的 oncomplete 提供了一个包含 iframe 的对话框。 iframe 包含另一个包含菜单的页面。我在单击命令按钮时编写了一个 actionListener,一个方法将执行并使菜单呈现为假。令人惊讶的是,用于渲染变量的 get 方法没有调用。这是我的示例代码。

<p:commandButton oncomplete="PF('Loc').show();"
                 action="bean.rendermethod"
                 update="createDialog">

    <p:dialog closeOnEscape="true"
              widgetVar="Loc"
              modal="true"
              dynamic="true"
              id="createDialog"
              minimizable="false"
              maximizable="true"
              height="100%"
              width="100%"
              style="background-color:rgb(232, 232, 232) !important;">

        <iframe frameborder="0" height="768" width="100%"
                src="loc.faces"
                name="someName" id="someId" scrolling="auto" />
    </p:dialog>
</p:commandButton>

loc.xhtml:

<p:menubar autoSubmenuDisplay="true"
           effectDuration="0"
           rendered="#{!(createAssociationsBean.splcCreate)}">

    ...

</p:menubar>

Java 代码:

public void renderMethod() {
    setSplcCreate("true");
}

public String getSplcCreate() {
    return splcCreate;
}

public void setSplcCreate(String splcCreate) {
    this.splcCreate = splcCreate;
}

【问题讨论】:

    标签: jsf iframe el conditional-rendering


    【解决方案1】:

    &lt;iframe&gt; 没有将指定页面包含在与其父页面相同的 HTTP 请求中。它将包含在一个全新的独立 HTTP 请求中。也就是说,它是由网络浏览器执行的,而不是网络服务器。实际上,框架页面将获得自己的全新请求范围 bean,它与父页面不同。

    此外,新的 HTTP 请求也不包含有关 JSF 视图的任何信息,因此它还将获得自己的视图范围 bean 实例(如果有)。只有当它们在同一个 HTTP 会话中运行时,它们才能共享同一个会话范围的 bean 实例。但是将 bean 会话设置为作用域会产生严重的后果。

    尽管如此,这种方法没有任何意义。这是&lt;iframe&gt; 的错误目的。请改用&lt;ui:include&gt;。如果您唯一关心的是滚动条等,只需将 CSS overflow:scroll 放在固定大小的块元素上,例如 &lt;div&gt;


    与具体问题无关,您的 &lt;p:commandButton action&gt; 由于缺少 EL 表达式大括号而不正确,因此引入了一个主要的红鲱鱼。而且,引用"true"String 值的rendered 属性令人讨厌,因为它使用了错误的数据类型来保存它的值。如果你想要一个布尔类型,只需使用boolean 而不是String。我可以想象这一切都是在黑暗中摆弄然后不小心将代码 sn-p 复制粘贴到问题中而没有仔细测试为MCVE 的结果。今后请不要那样做。另见https://stackoverflow.com/tags/jsf/info

    【讨论】:

      【解决方案2】:

      除了做@BalusC 的方法

      splcCreate 是一个字符串字段。

      el 表达式

       rendered="#{!(createAssociationsBean.splcCreate)}"
      

      将 splcCreate 用作布尔表达式会更好

      【讨论】:

        猜你喜欢
        • 2012-12-28
        • 2012-01-27
        • 1970-01-01
        • 2013-01-03
        • 2015-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-29
        相关资源
        最近更新 更多