我需要做以下事情:
我正在寻找一种方法,在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的新人。
答案 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