How to avoid WSOD (blank screen) while loading long-running initialization data in Struts2?

前端 未结 2 1217
说谎
说谎 2020-12-22 01:38

I need to do the following:

  1. User logs in.
  2. Redirected to welcome screen.
  3. Looks at the welcome screen while lots of records are loaded.
相关标签:
2条回答
  • 2020-12-22 02:23

    Thank you for the AJAX idea.

    However, the answer I was looking for was in fact Struts interceptor "execAndWait". I decided to use it over AJAX because I am dealing with existing application and all the Struts plumbing is in place. This is the Struts guide on this

    0 讨论(0)
  • 2020-12-22 02:28

    The right way is the one already suggested by AleksandrM in comments: open the page, show an indicator while you call an ajax action (let's say with jQuery, for convenience), then render the result and remove the indicator. It's easier than you think:

    public class MainAction extends ActionSupport {    
        public String execute() {
            return SUCCESS;
        }
    }
    
    public class AjaxAction extends ActionSupport {    
        @Autowired
        private ServiceDelegate myService;
    
        private Stuff myStuff; // with getter
    
        public String execute() {
            myStuff = myService.loadLongStuff();
            return SUCCESS;
        }
    }
    

    Your AJAX action can either return JSON data, a JSP snippet or a Stream of binary data. Choose the way you prefer. For example, if you map SUCCESS of AjaxAction to a JSP snippet, your JSP snippet will be:

    ajaxSnippet.jsp

    <%@ taglib prefix="s" uri="/WEB-INF/struts-tags.tld" %>
    Stuff: <s:property value="myStuff" />
    

    Then in your main.jsp, show the indicator in the div you will overwrite with the AJAX call's result:

    main.jsp

    <body>
        <div id="main">          
            <img src="/images/mesmerizingProgressBar.gif" />
        </div>    
    
        <script>
            $(function(){ // onDocumentReady...
                $.ajax({ // call ajax action...
                    type : 'GET',
                    url : '/ajaxAction.action', 
                    success : function(data,textStatus,jqXHR){
                        // then render your result in "main" div, 
                        // overwriting the loading GIF
                        $("#main").html(data); 
                    },
                    error : function(jqXHR, textStatus, errorThrown){
                        $("#main").html("Error ! " + textStatus); 
                    }
                });
            });
        </script>
    </body>
    
    0 讨论(0)
提交回复
热议问题