2011-03-04 78 views
1

我的问题适用于Prime Faces进度条,但任何vanilla jsf实现(使用jquery)都会有所帮助。我的问题是,当我开始长的MySQL查询,我也渲染进度条。问题是它在数据查询完成后开始进展。我在猜测,因为渲染阶段不会被应用,直到后端的东西完成。我需要在另一个线程中启动进度条吗?在JSF中实现代表mysql数据活动的进度条

进度条并不一定要显示查询所在的位置(如果可能的话)。我真的只是想展示应用程序“思考”。也许有一些文字或GIF动画。谢谢你的帮助。

编辑

这就是我。

 <p:ajaxStatus> 
      <f:facet name="start"> 
       <h:graphicImage value="/resources/images/ajax-loader-bar.gif" /> 
      </f:facet> 

      <f:facet name="complete"> 
       <h:graphicImage value="/resources/images/ajax-loader-bar-still.gif" /> 
      </f:facet> 

      <f:facet name="default"> 
       <h:graphicImage value="/resources/images/ajax-loader-bar-still.gif" /> 
      </f:facet> 
     </p:ajaxStatus> 

该请求不是ajax。

<p:commandButton value="Yes" update="growl" onclick="confirmation.hide()" 
          action="#{viewLines.downloadFile}" ajax="false" /> 

它背后的方法是。

public void downloadFile() { 

    if (selectedPkgLine != null) { 

     ExcelSheet excelSheet = new ExcelSheet(); 
     FacesContext facesContext = FacesContext.getCurrentInstance(); 
     ExternalContext externalContext = facesContext.getExternalContext(); 

     String pkgLineName = StringUtils.removeSpaces(StringUtils.stripGarbage(selectedPkgLine.getShortname())); 
     StringBuilder builder = new StringBuilder(); 
     builder.append(pkgLineName); 
     builder.append(".xls"); 

     externalContext.setResponseContentType("application/vnd.ms-excel"); 
     externalContext.setResponseHeader("Content-Disposition", "attachment; filename=" + builder.toString()); 

     try { 
      excelSheet.writeExcelSheet(this, externalContext.getResponseOutputStream()); 
     } catch (WriteException ex) { 
      FacesUtils.addFatalMessage(ex.getMessage()); 
     } catch (IOException ex) { 
      FacesUtils.addErrorMessage(ex.getMessage()); 
     } catch (ServletException ex) { 
      FacesUtils.addErrorMessage(ex.getMessage()); 
     } 

     facesContext.responseComplete(); 
    } else { 
     submitDisabled = true; 
     FacesUtils.addErrorMessage("No packaging line was selected"); 
    } 
} 

回答

3

抓住从http://ajaxload.info一些动画图标,包括它与CSS display: none;您的网页,并使用JS/jQuery的过程中的onclick使其display: block;

<h:commandButton onclick="$('#progress').show()" /> 

<img id="progress" src="progress.gif" style="display:none" /> 

但是,这只适用于同步请求。既然你使用PrimeFaces,我会建议使用p:ajaxStatus,因为它会考虑到异步(ajax)请求。

<p:ajaxStatus> 
    <f:facet name="start"><h:graphicImage value="progress.gif" /></f:facet> 
    <f:facet name="success"><h:outputText value="" /></f:facet> 
    <f:facet name="error">An error has occurred!</f:facet> 
</p:ajaxStatus> 

更新:根据您的更新。 <p:ajaxStatus>仅拦截PrimeFaces生成的ajax请求。所以<p:commandButton><p:commandLink>没有ajax="false"只。

+0

这很有趣,你说,因为那正是我所拥有的。虽然这与过滤和ajax事件一起工作,但当我执行mysql查询时,它根本不会移动。 – 2011-03-04 16:57:43

+0

也许你在浏览器中按下了“Esc”或某些按键组合,停止了所有GIF动画。或者在'p:ajaxStatus'的情况下,它根本不是ajax请求。 – BalusC 2011-03-04 17:00:31

+0

这不是一个Ajax请求。如果你还记得的话,我会回到整个Excel的事情。 我的行为必须是错误的,因为我必须让用户下载文件。 xls文件是使用JXL和Mysql随时生成的。我将如何解决这个问题?十分感谢你的帮助。 – 2011-03-04 17:11:08