2

我有 RequestScoped bean,因为我将用户从带有记录的 dataTable 重定向到编辑页面。在这个数据表中,我有删除按钮:

<p:column>
    <p:commandButton update=":deleteNewsDialog" oncomplete="deleteNewsDlg.show()" icon="ui-icon-closethick">
        <f:setPropertyActionListener value="#{news}" target="#{newsBean.news}" />
    </p:commandButton>
</p:column>

这是对话框:

<p:confirmDialog id="deleteNewsDialog" message="Czy na pewno chcesz usunąć wiadomość o tytule &quot;#{newsBean.news.title}&quot;?"
    header="Usuwanie wiadomości" severity="alert"
    widgetVar="deleteNewsDlg" appendToBody="true">
    <h:form>
        <p:commandButton value="Usuń" actionListener="#{newsBean.delete}" update=":newsesTableForm:newsesTable, :newsesTableForm:newsGrowl"/>
        <p:commandButton value="Anuluj" oncomplete="deleteNewsDlg.hide();"/>
    </h:form>
</p:confirmDialog>

当 newsBean.delete 被触发时, newsBean 不再存在,所以我得到了很多丑陋的验证异常。我有其他类似 ViewScoped bean 的页面,它的工作原理就像一个魅力。帮助?

4

1 回答 1

5

一个请求范围的 bean 的生命周期正好是一个 HTTP 请求/响应。因此,使用表单检索整个视图已经是一个 HTTP 请求/响应。请求范围的 bean 在响应结束时被丢弃。当您在视图上触发 ajax 请求时,您实际上是在发送一个新的 HTTP 请求。因此,这将创建一个新的请求范围 bean,该 bean 在 HTTP 响应结束时被丢弃。因此,同一视图上的每个 ajax 请求都会获得自己的请求范围 bean 实例。

如果您需要维护与视图相关的数据,这不是您想要的。您需要将 bean 放在视图范围内。只要您通过 ajax 和返回nullvoid在动作侦听器方法中与同一个视图交互,bean 就会存在。请注意,当您返回 a 时String,即使为空,也会重新创建视图,因此视图范围的 bean 将被丢弃。

也可以看看:

于 2012-05-05T17:53:17.630 回答