【问题标题】:Hide loader (spin) in struts2在struts2中隐藏加载器(旋转)
【发布时间】:2017-01-28 18:31:23
【问题描述】:

我的 Web 应用程序 (struts2) 查询通常很繁重,需要相当长的时间才能做出响应。

我添加了一些简单的(只是一个 html DIV 和一些 CSS)在动作调用后等待的旋转陀螺。 a whirligig like this

旋转旋转,当达到动作目标时,加载一个新的 jsp,旋转消失。

当调用的操作是下载数据(如 excel 文件)的操作时会出现问题(我想,即使尚未尝试,对于 pdf、文件上传等。在这种情况下,不需要加载新的 JSP )。

加载完成后,我找不到停止或隐藏旋转的方法。

当窗口开始下载文件时,我尝试使用 onblur 事件(应用于旋转 div、容器 div、整个窗口等)停止微调器。

所以,我认为加载文件时的系统窗口不会被浏览器视为真正的窗口,因此“onblur”事件毫无意义!

最后,如何在创建 excel 文件时或仅在系统加载窗口关闭(或打开)时开始接收响应时隐藏旋风?

【问题讨论】:

  • 更一般地说,问题可以这样定义:如何将 display = none 设置为 DIV?
  • 没有建议?如果存在另一种方式来获得我需要的东西(div + css),那没关系!
  • 您是如何下载数据的?贴出代码。

标签: css struts2 loader


【解决方案1】:

将您的下载操作分为两个操作。第一个应该在成功时返回一个 javascript,第二个是 step2,动作应该在成功时返回流,如下所示:

step1.jsp

<script> $(document).ready(function() {
closeBoxWait(previous_boxWait);
window.location = '<s:url namespace="/" action="step2"/>';
}); </script>

struts.xml

<action name="exportExcelBill" 
    class="jj.colmenjv.dlq.actions.BillAction"
    method="exportBillToExcel">

    <interceptor-ref name="loginStack" />
    <result name="login">timeout.jsp</result>

    <result name="success">step1.jsp</result>
</action>
<action name="step2" 
    class="jj.colmenjv.dlq.actions.BillAction"
    >

    <result name="success" type="stream">
        <param name="contentDisposition">attachment;filename="${reportFile}"</param>
        <param name="contentType">application/vnd.ms-excel</param>
        <param name="inputName">inputStream</param>
        <param name="bufferSize">1024</param>
    </result>
</action>

【讨论】:

    【解决方案2】:

    前提 - 我希望做对了,这是允许添加回复的情况之一。
    前提2 - 我不是 Struts2 中的魔术师(但这已经很清楚了,不是吗?)

    Thanx Yasser,我尝试了您的宝贵建议,但我很难:
    这是我的新 struts.xml

        <action name="exportExcelBill" 
            class="it.colmenjv.dlq.actions.BillAction"
            method="exportBillToExcel">
            <interceptor-ref name="loginStack" />
            <result name="login">timeout.jsp</result>
            <result name="success">jsp/common/intermeanExcel.jsp</result>
        </action>
        <action name="completeExport" 
            class="it.colmenjv.dlq.actions.BillAction"
            method="completeExport">
            <interceptor-ref name="loginStack" />
            <result name="login">timeout.jsp</result>
            <result name="success" type="stream">
                <param name="contentDisposition">attachment;filename="${reportFile}"</param>
                <param name="contentType">application/vnd.ms-excel</param>
                <param name="inputName">inputStream</param>
                <param name="bufferSize">1024</param>
            </result>
        </action>
    

    这是intermeanExcel.jsp:

    <head>
        <script src="https://code.jquery.com/jquery-1.9.1.min.js"></script>
        <script type="text/javascript" src="js/common/common.js"></script>
    </head>
    
    <body>
        <%@ include file="./warningwait.jsp" %>
    
         <script> 
             $(document).ready(function() {
                                            closeBoxWait(previous_boxWait);
                                            window.location = '<s:url namespace="/" action="completeExport"/>';
                                        }); 
        </script>   
    </body>
    

    我在原始方法 (exportBillToExcel) 中也添加了一行(倒数第二行),以便将数据流放入会话中

    public String exportBillToExcel() {
        XSSFWorkbook myWorkBook = new XSSFWorkbook();
        XSSFSheet mySheet = myWorkBook.createSheet(categ);
        try {
    

    等...等...我省略了 - 这个问题不必要的 - 单独运行时运行良好的方法的主体等...

        }
        catch (Exception e) {
            e.printStackTrace();
        }
    ===>    session.put("tmpstream", inputStream);
        return SUCCESS;
    }
    

    为了在新方法中恢复

    public String completeExport() {
        inputStream = (InputStream)session.get("tmpstream");
        logger.info("completeExport() - inputStream="+inputStream);
        return SUCCESS;
    }
    

    但这是错误日志(即使-第一行-流不为空):

    01/02 07:30:07| INFO [http-apr-10080-exec-6] (BillAction.java:704) - completeExport() - inputStream=java.io.ByteArrayInputStream@11d1921
    01/02 07:30:07| ERROR [http-apr-10080-exec-6] (CommonsLogger.java:34) - Can not find a java.io.InputStream with the name [inputStream] in the invocation stack. Check the <param name="inputName"> tag specified f
    or this action.
    01/02 07:30:07| ERROR [http-apr-10080-exec-6] (CommonsLogger.java:38) - Exception occurred during processing request: Can not find a java.io.InputStream with the name [inputStream] in the invocation stack. Chec
    k the <param name="inputName"> tag specified for this action.
    java.lang.IllegalArgumentException: Can not find a java.io.InputStream with the name [inputStream] in the invocation stack. Check the <param name="inputName"> tag specified for this action.
            at org.apache.struts2.dispatcher.StreamResult.doExecute(StreamResult.java:237)
            at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186)
            at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:367)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:271)
            at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
            at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
            at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
            at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265)
            at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
            at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
            at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
            at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:238)
            at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
            at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
            at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:238)
            at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    

    我哪里错了?

    PS - 隐藏微调器的工作原理!谢谢!

    【讨论】:

      猜你喜欢
      • 2019-02-20
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多