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

我需要做以下事情:

  1. 用户登录。
  2. 重定向到欢迎屏幕。
  3. 在加载大量记录时查看欢迎屏幕。
  4. 重定向到工作屏幕。

我正在寻找一种方法在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的新手。

正确的方法是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:  

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

main.jsp中

  

感谢您对AJAX的想法。

但是,我正在寻找的答案实际上是Struts拦截器“execAndWait”。 我决定将它用于AJAX,因为我正在处理现有的应用程序,并且所有的Struts管道都已到位。 这是关于此的Struts指南