【问题标题】:Is it possible in JSF to prevent buttons/links and redirects from being executed?在 JSF 中是否可以防止执行按钮/链接和重定向?
【发布时间】:2012-06-21 05:58:17
【问题描述】:

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

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

我正在使用 JBoss 7.1.1 和 RichFaces 4.2。

【问题讨论】:

    标签: jsf-2 richfaces jboss7.x lifecycle


    【解决方案1】:

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

    您可以直接使用jQuery plugin of BlockUI

    【讨论】:

    • 我已经尝试了很多客户端解决方案,但它们都不起作用。问题是 GUI 不再“连接”到支持 bean。示例:我尝试在 Javascript 中检查我的“downloadFinished”变量。这一直有效,直到下载开始。然后 GUI 以某种方式认为下载完成并且处理对话框消失了,尽管下载过程仍在进行中。看起来有 bean 的新实例,但是当我设置断点时,我的变量将按预期只被调用一次。这很奇怪,我不确定这是怎么发生的。
    【解决方案2】:

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

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

    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;
        }
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这在我的情况下是不可能的(我试图找到 Javascript、CDI 解决方案),因为下载响应必须调用 responseComplete() 这会导致当前视图失去“连接”的副作用后备豆。这意味着我不能轮询/推送或访问任何支持 bean 的实例。例如,在这里查看我的一项尝试:community.jboss.org/thread/201172?tstart=0
      猜你喜欢
      • 1970-01-01
      • 2017-07-03
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      相关资源
      最近更新 更多