在JSF中是否可以防止按钮/链接和重定向被执行?

时间:2012-06-19 08:05:33

标签: jsf-2 richfaces jboss7.x lifecycle

我有一些下载实现,允许我从dataTable导出所有数据。当导出大量数据时,用户不得在应用程序中的任何位置按下,因为当前的导出过程随后会中止,并且会因某些例外情况而崩溃,例如“EJB调用组件失败......”或“找不到XyzBean“。

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

我正在使用JBoss 7.1.1和RichFaces 4.2。

3 个答案:

答案 0 :(得分:0)

我认为你最好在Primefaces中使用客户端解决方案(称为BlockUI)他们得到了这个组件BlockUI,但是因为你使用的是RichFaces而我不是拥有它......

您可以直接使用jQuery plugin of BlockUI

答案 1 :(得分: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;
    }
}

答案 2 :(得分:0)

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

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