每当用户退出特定页面时做某事

Doing something whenever user exits particular page

我有一个网店应用程序。我想改进 "removing from the cart" 功能。我不想询问用户是否要 "really remove" 购物车中的位置,相反我想让他取消操作。

目前,当用户点击购物车中产品的 "X" 按钮时,table 行变为 "removed, click to cancel"。在后面有一个 CartPosition 个对象的列表,每个对象都带有标志 removed。已删除的产品仍在列表中,但标志设置为 true。它使产品在列表中的适当位置仍然可见,但在视图方面我可以用另一种方式呈现它。当用户单击另一个 "X" 时,前一个将从列表中删除,新的被标记为 removed

购物车是会话范围的 CDI bean。这意味着,当我标记某个位置 removed 并转到其他位置,然后返回购物车时,我仍然会有一行标记为 removed。我就是不想要这个。

我考虑过将 bean 更改为 JSF bean,然后创建另一个视图范围,它可以保留标记为 removed 的记录并检查它是否为空,如果是,我可以从列表中删除那个。我不知道它是否会起作用。我会尝试这种方法,但我宁愿让我的 beans 由 CDI.

管理

有没有办法在不实现我上面的想法的情况下处理这个问题?

编辑: @BalusC,你的假设是错误的。您应该假设,我不完全知道如何混合使用 CDI 和 JSF。我实际上使用的是 JSF 2.2,这意味着 javax.faces.view.ViewScoped 注释对我可用。无论如何,我仍然不明白这个想法。我明白,我必须依赖一些 ViewScoped bean。这很清楚,但它必须如何组成。你能解释一下你的想法吗?我尝试了一些东西,但看起来它没有正常工作。例如,我的 ViewScoped bean 的 @PreDestroy 方法从未被调用过,它只是在我尝试使用它时才懒惰地构造。

据我了解你的问题是会话。解决该问题的一种方法是在请求属性中设置已删除产品的列表并将其从会话 bean 中删除,以便在下一个请求中它们将消失。 希望有帮助

在会话或视图作用域 bean 的 @PreDestroy 注释方法中执行实际删除作业。

@PreDestroy
public void destroy() {
    // Do the actual remove job here.
}

鉴于您的问题暗示您没有基于 CDI 的 javax.faces.view.ViewScoped available, which is new since JSF 2.2, this in turn suggests that you're still on JSF 2.0/2.1 and thus only have JSF based javax.faces.bean.ViewScoped at hands, then it should be noted that its @PreDestroy is broken in several circumstances. You'd then best do the @PreDestroy in the CDI based @SessionScoped bean. Alternatively, you could use OmniFaces @ViewScoped,它已通过多种方式修复和改进了 @ViewScoped bean 的 @PreDestroy。它甚至在 window 卸载时被调用。