天天看點

iReport使用拓展:在用戶端IE中使用jasperView

要使在用戶端生成jasperview 的applet,

注意:

applet.jar, carnet.crt 都在 webroot 目錄下

applet.jar包括了 jasperreport.jar , poi.jar, jxl.jar, jfreechat.jar, antlr.jar , commons.jar ….

可根據功能去掉一些jar, 為了友善, 我全部打包一下applet.jar裡了

如果僅有jasperreport.jar , 用戶端的生成的jasperview 隻能浏覽報表内容。但是不能夠導出, 儲存.

1) servlet ,傳回 jasperprint 的資料流

resp.setcontenttype("application/octet-stream");

try {

objectoutputstream out = new objectoutputstream(resp.getoutputstream());

out.writeobject(reportfactory.getreport(jaspernamevalue, map));

out.flush();

out.close();

} catch(exception ex) {

}

// 将jasperprint以流方式發送到用戶端 ,讓 applet接收

2) test1.jsp 調用報表的servlet 連結

<applet code= "viewreport.class" archive ="applet.jar" width= "600" height ="500">

<name ="report_url" value= "<a href="http://www2.blogger.com/jaspername=" date1="2006-09-01&date2=" cancelcount="1&guaranteeno=">http://192.168.0.1:80/test/viewreport/?jaspername=weeklyissuancereport1&date1=2006-09-01&date2=2006-12-01&cancelcount=1&guaranteeno=2 </a>">

</ applet>

// 其中 applet.jar 的類有很多, 下面有說明

viewreport.class 是用在applet.jar 的根下的

3) applet調用 jasperviewer.viewreport(jprint, false);

public class viewreport extends japplet {

public viewreport() throws headlessexception {

super();

// todo auto-generated constructor stub

public void init() {

url url = new url(this.getparameter("report_url"));

jasperprint jprint = (jasperprint) jrloader.loadobject(url);

jasperviewer.viewreport(jprint, false);

joptionpane.showmessagedialog(this, ex.getmessage());

public void start() {

4) 給applet.jar進行數字簽名

1.generate key: 于 command line下輸入 keyname 是你自己設的。這裡叫javaworld 。

1

keytool -genkey -keyalg rsa -alias carnet

填入你的資訊。 此時産生的是key 而已。 2.export key: 于 command line下輸入 keyname 是你剛才設的。叫javaworld 。 anyname 是你自己設要産出的 cert。我都取和 keyname 一樣。

keytool -export -alias carnet -file carnet.crt

3.key 已成為檔案。 4create jar: 于command line 下輸入 applet 名稱看你自己要 jar誰…

jar cvf jarname.jar viewreport.class

如果是目錄裡所有的檔案的話 例如你的東西全在classes 目錄下, 可先進入此目錄,再鍵入

jar cvf xxx.jar .

那一" 點" 記得要加…代表以下所有檔案。 5.sign jar: 于 command line 下輸入 keyname 就之前輸入的那個名字。carnet 。

jarsigner jarname.jar carnet

6. 密碼不要忘了耶。 7. 每次 compile classes後,要再編成 jar 一次,再singer 一次。

先用 cmd 指令去到 applet的目錄下, 動行上面的指令,就可以生成經過簽名的jar 包了,

同時生成carnet.crt

5) 打開 </a href="http://192.168.0.161/test/test1.jsp">http://192.168.0.161/test/test1.jsp</a>

這樣, 就可以提示是否信任數字簽名,然後點 "yes" 就可以了

以測試, 别的機也可以看到.

jasperview 的applet中加超連結

項目需求:

在用戶端彈出jasperviwer的applet,使得用戶端可以随意導出為多種格式,同意也省了代碼的開發,,直接用applet就行了,在用戶端彈出jasperviewer在我的舊文章中有說明,

現在說的是如果在jasperviwer中彈出另一個applet的jasperviwer,因為看源碼,如果hyperlink是reference,那麼是什麼也不做的,,現改為點選reference的hyperlink後,彈出新的applet.

在用 ireport設計報表的時候, 選中texf-field的屬性,然後輸入 hyperlink的相關内容,

但是在用applet的jasperview是,報表中的連結如果都是外部連結的話,都沒反應,,這是因為:

net.sf.jasperreports.view. jrviewer

public void gotohyperlink(jrprinthyperlink hyperlink)

switch(hyperlink.gethyperlinktype()){

case jrhyperlink.hyperlink_type_reference :

{ // 這裡并沒有對外部連結進行處理

if (hyperlinklisteners != null && hyperlinklisteners.size() > 1){

system.out.println("hyperlink reference : " + hyperlink.gethyperlinkreference());

system.out.println("implement your own jrhyperlinklistener to manage this type of event.");

break;

是以要修改源碼,我的做法是:

重新寫一個 jasperviewe1和一個jrviewer1

放在 net.sf.jasperreports.view包中,,

jrviewer1的 gotohyperlink函數體為:

public void gotohyperlink(jrprinthyperlink hyperlink) {

super.gotohyperlink(hyperlink);

if(hyperlink.gethyperlinktype() == jrhyperlink.hyperlink_type_reference) {

//log.info("hyperlink reference : " + hyperlink.gethyperlinkreference());

jasperprint jprint = (jasperprint) jrloader.loadobject(new url(hyperlink.gethyperlinkreference()));

//通過這句話, 在jasperview的applet上點選連結時,将會彈出一個新的applet視窗,顯示别的内容

jasperviewer1 代碼, 因為 jasperviewer中的代碼的 jrviewer 是不能set進去的,,是以必須重一寫一個jrviewer1類,, jrviewer對象改為 jrview1對象… 這樣才行,,

然後在applet初始的時候調jasperviewer1來彈出jasperviewer ,,,

用以上方法,就可以實作在 jasperviewer的applet報表中彈出别的報表,即可以在報表中加外部報表的連結了