Javascript 如何在Jasper打印报告时获取实时行计数

Javascript 如何在Jasper打印报告时获取实时行计数,javascript,java,ajax,jsp,jasper-reports,Javascript,Java,Ajax,Jsp,Jasper Reports,我已经使用jsp开发了一个web应用程序,它有一个内容列表,这些内容被放置在ArrayList中。我尝试了各种方法来实现它,尝试了AsynchronousFillHandle,AJAX,Scriptlet。但我就是做不好 我试图实现的是,当JasperExportManager逐行填充记录时,我希望在网页中显示已打印的行数(例如打印记录数的实时状态) 比如说 打印的645588条记录中有267条 打印的645588条记录中有5692条 打印的645588条记录中有34677条 经过两天不成功的尝

我已经使用jsp开发了一个web应用程序,它有一个内容列表,这些内容被放置在
ArrayList
中。我尝试了各种方法来实现它,尝试了
AsynchronousFillHandle
AJAX
Scriptlet
。但我就是做不好

我试图实现的是,当JasperExportManager逐行填充记录时,我希望在网页中显示已打印的行数(例如打印记录数的实时状态)

比如说

打印的645588条记录中有267条
打印的645588条记录中有5692条
打印的645588条记录中有34677条

经过两天不成功的尝试,我决定使用一个快捷方式,我编写了一个scriptlet文件,它将打印到同一目录下的txt文件中的记录数, Scriptlet代码:

public void afterDetailEval() throws JRScriptletException{
      count = (Integer) this.getVariableValue("count");
      BufferedWriter br = null;
      try {
          br = new BufferedWriter(new FileWriter(new File("C:/jasperreports-5.6.0/test/viewTasks/WebContent/value.txt")));
          br.write(new String(""+count));
          br.close();
          Thread.sleep(200);
      }catch (Exception e) {
          e.printStackTrace();
      }
}
然后使用另一个ajax请求从文本文件中读取数据并在浏览器中显示,但再次失败,因为ajax请求仅返回先前存储的值(即,虽然更改发生在.txt文件中,但AJAX请求仅返回程序执行前的值。我猜这是因为,更改发生在本地目录中,不会反映在服务器中)。AJAX代码如下所示,
网页编码:

<script>
    function startPrinting() {
      xhttp1 = new XMLHttpRequest();
      xhttp1.onreadystatechange = function() {
        if (this.readyState >= 1) {
            document.getElementById('total')style.display = "";
            setTimeout(function() { getStat(); }, 6000); //calls the function to start updating status
        }
      };
      xhttp1.open("POST", "statusServlet", true);
      xhttp1.send();
    } //This function is to start the printing processes
    function getStat(){
        myvar=setInterval(function() {reval()}, 3000);
        function reval(){
            if(xhttp1.readyState>2){
                xhttp1.abort();
            }
            var rawFile = new XMLHttpRequest();
            var prev = "";
            rawFile.open("GET","value.txt" , true);
            rawFile.onreadystatechange = function ()
            {
                if(rawFile.readyState === 4)
                {
                    if(rawFile.status === 200 || rawFile.status == 0)
                    {
                        allText = rawFile.responseText;
                        if(prev===allText){
                            document.getElementById("status").innerHTML = allText;
                            return;
                        }
                        prev = allText;
                        document.getElementById("status").innerHTML = allText;
                    }
                }
            }
            rawFile.send();
        }
    }
</script>

函数startPrinting(){
xhttp1=新的XMLHttpRequest();
xhttp1.onreadystatechange=函数(){
如果(this.readyState>=1){
document.getElementById('total')style.display=“”;
setTimeout(function(){getStat();},6000);//调用该函数以开始更新状态
}
};
xhttp1.open(“POST”,“statusServlet”,true);
xhttp1.send();
}//此功能用于启动打印过程
函数getStat(){
myvar=setInterval(函数(){reval()},3000);
函数reval(){
如果(xhttp1.readyState>2){
xhttp1.abort();
}
var rawFile=new XMLHttpRequest();
var prev=“”;
打开(“GET”,“value.txt”,true);
rawFile.onreadystatechange=函数()
{
if(rawFile.readyState==4)
{
if(rawFile.status==200 | | rawFile.status==0)
{
allText=rawFile.responseText;
如果(上一个===所有文本){
document.getElementById(“status”).innerHTML=allText;
返回;
}
prev=所有文本;
document.getElementById(“status”).innerHTML=allText;
}
}
}
send();
}
}
在使用此代码时,如果文件.txt在eclipse IDE中保持活动状态,则值会反映在网页中,我真的不知道为什么或如何,但当文本文件保持活动状态时(我知道这很奇怪),AJAX请求以某种方式正确返回值。是否有任何方法可以使此代码在不必保持.txt文件处于活动状态的情况下工作?是否有任何其他方法可以实现Jasper export的实时行状态,而不是从文件中写入和读取?

注意:我使用的是Eclipse中的JavaEEIDE,服务器为Tomcat7.0


提前感谢!

JasperReports不是为实时交互而设计的。而且,从文件中读取最多也很脆弱。这让我觉得是一个好消息。