如果其他人也遇到同样的问题,我将发布我最终如何解决这个问题的。我放弃了尝试使用 AJAX 来运行报告,而是通过线程运行报告,但使用 AJAX 来“轮询”以检查报告是否已创建。我所做的基本上如下。
请注意,我从代码中删除了很多内容,例如安全例程和错误检查例程,只是给出基本框架。
我创建了一个名为 ThreadMyReport 的 java 类
public class ThreadMyReport implements Runnable {
String fileID = "";
Date dateOfReport = null;
public ThreadMyReport(Date dateOfReport) {
this.fileID= "MyReport_" + UUID.randomUUID();
this.dateOfReport = dateOfReport;
}
public void run() {
int a = ReportMyReport.loadAndSaveMyReport(dateOfReport, fileID);
}
public String getFileID() {
return fileID;
}
}
我生成报告的所有原始代码都可以在 ReportMyReport.loadAndSaveMyReport 中找到。报告完成后,会在服务器上保存一个带有 fileName fileID 的文件。
然后我启动了一个线程来运行报告
ThreadMyReport a = new ThreadMyReport(theDate);
Thread theThread=new Thread(a);
theThread.start();
fileID=a.getFileID();
然后,我添加了一个 javascript 例程,每秒通过 AJAX 检查文件是否已创建,如果已创建,则显示报告。
<SCRIPT language="javascript">
var myVar;
myVar=setInterval(function (){
$.post("post/post_checkReportReady_xml.jsp", {
generatedReport: '<%=fileID%>'
}, function(data) {
if (data.indexOf("produced")>-1) {
clearInterval(myVar);
//display report
}
if (data.indexOf("failed")>-1) {
clearInterval(myVar);
}
});
}, 1000);
</SCRIPT>
AJAX 代码如下所示:
<%
String result="";
String generatedReport=(request.getParameter("generatedReport"));
if(!"".equals(generatedReport)) {
String fileName2="My directory/"+generatedReport+".xlsm";
java.io.File f = new java.io.File(fileName2);
if(f.exists()) {
result="produced";
}
}
}
%>
<%=result%>