0

我有一些下载实现,它允许我从数据表中导出所有数据。当大量数据被导出时,用户不能在应用程序中的任何地方按下,因为当前的导出过程将被中止,它会崩溃并出现一些异常,如“EJB Invocation failed on component.....”或“找不到 XyzBean”。

所以我的想法是只要下载过程正在进行,就禁止按下按钮。我考虑过使用 PhaseListener 但我不确定如何拦截请求?等待的行为应该是,只要下载过程正在进行,当用户在任何地方按下时,GUI 中什么都不会发生。我可以在下载开始时设置一个变量,并在下载完成后取消设置。所以我知道什么时候应该阻止,但我不确定这个阻止会是什么样子。有任何想法吗?

我将 JBoss 7.1.1 与 RichFaces 4.2 一起使用。

4

3 回答 3

0

我认为您最好在 Primefaces 中使用客户端解决方案(称为BlockUI),他们得到了这个组件BlockUI,但是由于您正在使用RichFaces而我没有它...

可以 直接使用BlockUI 的 jQuery 插件

于 2012-06-19T08:19:49.453 回答
0

此解决方案会导致视图中所有按钮的闩锁,因此如果正在下载并且我按下任何按钮,则此请求将被丢弃。这基本上有效,但我仍然有一些崩溃,但我认为这与另一个问题有关。

在我开始的下载方法中,我向当前会话添加了一个标志:

HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);
session.setAttribute("DOWNLOAD_IN_PROGRESS", "true");

在下载方法结束时,我将此标志设置为 false ...

session.setAttribute("DOWNLOAD_IN_PROGRESS", "false");

在阶段监听器(已添加到 faces-config)中,我检查当前是否正在进行下载。如果是,则丢弃该请求。

@Named
@Logged
public class DownloadLatchPhaseListener implements PhaseListener
{
    private static final long serialVersionUID = -8603272654541248512L;

    @Override
    public void beforePhase(PhaseEvent event)
    {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);

        if (session != null && "true".equals(session.getAttribute("DOWNLOAD_IN_PROGRESS")))
        {
            FacesContext.getCurrentInstance().responseComplete();
        }
    }

    @Override
    public void afterPhase(PhaseEvent event)
    {
        // not used
    }

    @Override
    public PhaseId getPhaseId()
    {
        return PhaseId.RESTORE_VIEW;
    }
}
于 2012-06-20T10:23:08.340 回答
0

您可以做的最简单的事情可能是在下载时使用带有进度条或一些通知的模式弹出面板。下载完成后,您只需关闭弹出面板。

这是一个示例,但是,它定义了您不想设置的 onmaskclick: http ://showcase.richfaces.org/richfaces/component-sample.jsf?demo=popup&sample=modalPopup&skin=emeraldTown

于 2012-06-22T07:21:50.557 回答