如何在Struts2中加载长时间运行的初始化数据时避免WSOD(空白屏幕)?

时间:2015-02-02 10:15:13

标签: java redirect asynchronous struts2 wsod

我需要做以下事情:

  1. 用户登录。
  2. 重定向到欢迎屏幕。
  3. 在加载大量记录时查看欢迎屏幕。
  4. 重定向到工作屏幕。
  5. 我正在寻找一种方法,在Action类中做这样的事情:

    public class LinkAction extends ActionSupport implements SessionAware {
            @Autowired
            private ServiceDelegate myService;
    
        public String welcome()
            {
                new Runnable() {
                    @Override
                    public void run() {
                        myService.getLoadsOfData();
    
                        //redirect to the next action
    
                    }
                }.run();
                // this is where the user 
                // goes to look at the welcome screen        
                return "welcome";
            }
        }
    

    可能是一个错误的方法,请告诉我,如果是这样,我是Struts的新人。

2 个答案:

答案 0 :(得分:1)

正确的方式是AleksandrM在评论中已经提出的方法:打开页面,在调用ajax动作时显示一个指示符(为方便起见,让我们用jQuery说),然后渲染结果并删除指示符。它比你想象的容易:

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

您的AJAX操作可以返回JSON数据,JSP片段或二进制数据流。选择你喜欢的方式。例如,如果将AjaxAction的SUCCESS映射到JSP片段,则JSP片段将为:

<强> ajaxSnippet.jsp

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

然后在你的main.jsp中,显示div中的指示符,你将用AJAX调用覆盖结果:

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

答案 1 :(得分:0)

感谢AJAX的想法。

然而,我正在寻找的答案实际上是Struts拦截器&#34; execAndWait&#34;。 我决定在AJAX上使用它,因为我正在处理现有的应用程序并且所有Struts管道都已就绪。 这是Struts guide on this