Javascript 如何在Jasper打印报告时获取实时行计数
我已经使用jsp开发了一个web应用程序,它有一个内容列表,这些内容被放置在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条 经过两天不成功的尝
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不是为实时交互而设计的。而且,从文件中读取最多也很脆弱。这让我觉得是一个好消息。