jasperReport客戶端采用applet,applet和activeX插件的區(qū)別大家搜一下,有一堆東西可以借鑒,下載jasperreports-3.0.0,在相應(yīng)的sample OR demo(記得不清了)中可以找到j(luò)asperReport 實(shí)現(xiàn)的客戶端打印demo,下來就來分析下具體實(shí)現(xiàn)。
新建一print.js文件:

function loadApplet(applet_URL)
{
var URL = applet_URL + "/applets/jre-1_5_0_18-windows-i586-p.exe";
document.write('<OBJECT id="myApplet" name="myApplet"');
document.write('classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH="0" HEIGHT="0" MAYSCRIPT name="myApplet"');
document.write('codebase='+ URL +'>');
document.write('<PARAM NAME="CODE" VALUE="org.bulktree.report.print.applet.PrinterApplet" />');
document.write('<PARAM NAME="CODEBASE" VALUE="../applets" />');
document.write('<PARAM NAME="ARCHIVE" VALUE="jasperreports-3.0.1-applet.jar" />');
document.write('<PARAM NAME="type" VALUE="application/x-java-applet;version=1.5.0" />');
document.write('<PARAM NAME="scriptable" VALUE="false" />');
document.write('<PARAM NAME="REPORT_URL" VALUE="../report.view">');
document.write('no support java');
document.write('<comment>');
document.write('<embed type="application/x-java-applet;version=1.5.0"');
document.write('CODE="org.bulktree.report.print.applet.PrinterApplet"');
document.write('JAVA_CODEBASE="applets" ARCHIVE="jasperreports-3.0.1-applet.jar"');
document.write('scriptable=false');
document.write('pluginspage='+ URL +'>');
document.write('<noembed></noembed>');
document.write('</embed>');
document.write('</comment>');
document.write('</OBJECT>');
}
URL為一個(gè)固定的路徑,是為了下載/applets/jre-1_5_0_18-windows-i586-p.exe(JRE運(yùn)行環(huán)境)而存在的,也可以使用外網(wǎng)從sun公司網(wǎng)站下載,
REPORT_URL 為applet所要訪問的地址,在工程的web.xml配置/report.view如下servlet即可,此servet可接收applet參數(shù),生成jasperPrint對(duì)象,并傳遞到客戶端applet中進(jìn)行打印或者預(yù)覽。
servlet配置如下:
<servlet>
<servlet-name>ReportServlet</servlet-name>
<servlet-class>org.bulktree.report.print.applet.ReportServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ReportServlet</servlet-name>
<url-pattern>/report.view</url-pattern>
</servlet-mapping>
ReportServlet核心代碼就是根據(jù)業(yè)務(wù)找到對(duì)應(yīng)的模板文件填充數(shù)據(jù)生成jasperPrint對(duì)象,產(chǎn)生的jasperPrint對(duì)象以對(duì)象流的形式發(fā)送給客戶端,核心代碼如下:
// 生成jasperPrint對(duì)象
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
mapParam, new JREmptyDataSource());

//組裝流
response.setContentType("application/octet-stream");
response.setBufferSize(8986000);
ServletOutputStream outStream = response.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(outStream);
oos.writeObject(jasperPrint);
當(dāng)然,客戶端的applet使用如下:

/**//*
* applet與Servlet交互 URL傳遞頁面?zhèn)鱽淼膮?shù)請(qǐng)求服務(wù)器Servlet
* 把a(bǔ)pplet傳遞的參數(shù)追加到servlet中 2008-10-14 laoshulin
*/

url = new URL(getCodeBase(), requestUrl + "?printView=true"
+ paraStr);


if (url == null)
{
JOptionPane.showMessageDialog(this,
"Source URL not specified");

} else
{
InputStream in = url.openStream();
ObjectInputStream objIn = new ObjectInputStream(in);
Object obj = objIn.readObject();

if (obj instanceof JasperPrint)
{


} else
{
JOptionPane.showMessageDialog(this, obj.toString());
return;
}


if (jasperPrint == null)
{
// 根據(jù)Servlet返回的URL(ObjectStream)產(chǎn)生JasperPrint對(duì)象
jasperPrint = (JasperPrint) obj;

}
// 攔截出現(xiàn)空?qǐng)?bào)表問題
if (jasperPrint != null

&& jasperPrint.getPages().size() > 0)
{

/**//*
* 調(diào)用JasperReport.jar中JasperViewer繪制報(bào)表Frame
* JasperViewer繼承自JFrame,采用setDefaultCloseOperation響應(yīng)關(guān)閉窗口事件
*/

ViewerFrame viewerFrame = new ViewerFrame(this
.getAppletContext(), jasperPrint,isShowPrintButton);
viewerFrame.setVisible(true);
//viewerFrame.show();

// JasperViewer viewer = new
// JasperViewer(jasperPrint);
// viewer.setVisible(true);
// viewer.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
// 如果請(qǐng)求為空彈出對(duì)話框予以提示

} else
{
JOptionPane
.showMessageDialog(this,
"Please check Your Report SQL! It resulted in empty Report! ");
return;
}
}
其中requestUrl為applet配置中的REPORT_URL,現(xiàn)實(shí)中可以采用此種方式傳遞參數(shù)到applet中,下篇文章會(huì)介紹更合適的業(yè)務(wù)數(shù)據(jù)傳遞,?printView=true表示,傳遞printView參數(shù)對(duì)應(yīng)的值為true,用來預(yù)覽使用。剩下的工作就是怎么按照自己的要求打印和預(yù)覽了。
jasperReport為我們提供了打印和預(yù)覽現(xiàn)成的方法:
// 打印報(bào)表
JasperPrintManager
.printReport(print, false);

/**//* 預(yù)覽報(bào)表
* 調(diào)用JasperReport.jar中JasperViewer繪制報(bào)表Frame
* JasperViewer繼承自JFrame,采用setDefaultCloseOperation響應(yīng)關(guān)閉窗口事件
*/
ViewerFrame viewerFrame = new ViewerFrame(this
.getAppletContext(), jasperPrint);
viewerFrame.setVisible(true);
最后記著釋放對(duì)象哦,瀏覽器會(huì)受不了得:
url = null;
jasperPrint = null;
OK,客戶端就出現(xiàn)了,參照demo沒有什么難度,下一篇我會(huì)介紹一下具體的細(xì)節(jié),及套打的實(shí)現(xiàn)。