2017-01-28 1 views
0

Mes requêtes d'application web (struts2) sont souvent lourdes et il faut beaucoup de temps pour une réponse.Masquer loader (spin) dans struts2

J'ai ajouté quelques sommets simples (juste un DIV html et quelques CSS) d'attente après les appels d'action. Le spin tourne et lorsque la cible de l'action est atteinte, un nouveau jsp est chargé et le spin disparaît. Le problème se pose lorsque l'action appelée est une action pour télécharger des données comme fichier Excel (et je suppose, même si pas encore essayé, pour le pdf, le téléchargement de fichiers, etc .. dans de tels cas, les nouvelles JSP ne devaient pas être chargé).

Je n'arrive pas à trouver un moyen d'arrêter ou de masquer la vrille lorsque le chargement est terminé.

J'ai essayé d'arrêter le spinner en utilisant un événement onbl (appliqué au div div, au conteneur div, à la fenêtre entière, etc.) lorsque la fenêtre a commencé à télécharger des fichiers. Donc, je suppose que la fenêtre du système lors du chargement des fichiers n'est pas considérée par le navigateur comme une vraie fenêtre et donc l'événement "onblur" n'a pas de sens!

Enfin, comment puis-je masquer le whirligig lorsque la réponse est lancée en recevant une moyenne lorsque le fichier Excel est créé, ou simplement lorsque la fenêtre de chargement du système est fermée (ou ouverte)?

+0

Plus généralement, le problème peut être défini de cette façon: comment puis-je définir display = none à DIV? –

+0

pas de demande? si un autre moyen existe pour obtenir ce dont j'ai besoin (insead de div + css) c'est ok! –

+0

Comment avez-vous téléchargé des données? Postez le code. –

Répondre

0

Divisez votre action de téléchargement en deux actions. Le premier devrait retourner un javascript sur le succès et et deuxième, étape 2, l'action doit retourner le flux en cas de succès comme ci-dessous:

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> 
0

prémisse - J'espère avoir bien compris et que c'est un de ces cas où il est permis d'ajouter une réponse.
premise2 - Je ne suis pas un magicien dans Struts2 (? Mais qui est déjà clair, n'est pas)

Thanx Yasser, j'ai essayé votre suggestion précieuse mais j'ai du mal:
c'est mes nouveaux supports .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> 

c'est 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> 

J'ajouté aussi une ligne (la dernière seconde) à la méthode originale (exportBillToExcel) afin de placer en session le flux de données

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

etc ... etc ... J'omettent le - inutile pour cette question - corps de la méthode qui fonctionnait bien, quand était seul, etc ...

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

afin de le récupérer dans la nouvelle méthode

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

mais c'est le journal des erreurs (même si -Premier ROW- le flux est non nul):

01/02 07:30:07| INFO [http-apr-10080-exec-6] (BillAction.java:704) - completeExport() - [email protected] 
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) 

où je me trompe?

PS - dissimulation de la machine à filer! merci!