要使在用戶端生成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報表中彈出别的報表,即可以在報表中加外部報表的連結了