【问题标题】:What is the correct way to use RequestScoped Bean and rendered attribute?使用 RequestScoped Bean 和渲染属性的正确方法是什么?
【发布时间】:2015-10-01 11:43:18
【问题描述】:

有人知道如何在 jsf 中使用 RequestScoped bean 和渲染属性吗?渲染的属性在 applyValues 阶段之前被评估,因此没有被正确评估。我不想保留任何状态。该示例可以是带有数据表和按钮的 outputPanel。数据表获取值列表。包装 outputPanel 具有如下渲染属性:

<p:outputPanel rendered="#{not empty requestScopedBean.dataList}">
    <p:datatable value="#{requestScopedBean.dataList}">
        ...
    </p:datatable>

    <p:commandButton action="#{requestScopedBean.someAction}" />
</p:outputPanel>

加载页面并单击按钮后,什么都没有发生,因为视图已恢复并评估表达式 - bean 确实有一个空的数据列表,因此不应呈现面板。这导致甚至没有调用操作方法 - 因为按钮不存在。

【问题讨论】:

  • 这不是第一次必须从您的 [jsf] 问题中删除 [java] 标记。您能否将其视为不再将 [java] 标记添加到未来 [jsf] 问题的提示?谢谢你:)

标签: jsf rendered-attribute requestscope


【解决方案1】:

如果您此时对填充数据表不感兴趣,只需在调用了感兴趣的命令按钮时在rendered 属性中添加一个额外的检查。您可以通过检查请求参数映射中是否存在按钮的客户端 ID 来做到这一点。

<p:outputPanel rendered="#{not empty requestScopedBean.dataList or not empty param[someButton.clientId]}">
    ...

    <p:commandButton binding="#{someButton}" ... />
</p:outputPanel>

另见:

【讨论】:

  • 是的。这就是诀窍。但是在具有更多控件的页面上,这将变得非常庞大且难以阅读,更不用说难以维护了。 RequestScoped bean 的属性不应该在渲染、禁用等属性中使用吗?
  • 不,这是 JSF 防止篡改请求的一部分。技术上正确的解决方案是使用视图范围的 bean 而不是请求范围的 bean。
  • 拥有一个包含我不想过期的搜索结果的搜索页面的正确方法是什么?我的意思是,在某处显示搜索结果并在单击其中一个结果时更新页面块。我不需要在服务器上的任何地方保留结果列表,它们只显示一次。单击其中一个,我想加载其他信息并显示在页面的不同块中。
  • 那么不要使用有状态视图。有条件地在客户端级别显示/隐藏。例如。 &lt;div class="#{empty bean.list ? 'hidden' : ''}"&gt;.hidden { display: none; }
猜你喜欢
  • 2012-04-07
  • 2013-09-29
  • 1970-01-01
  • 2021-02-07
  • 2012-02-12
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多