要使在客户端生成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{
ObjectOutputStreamout=newObjectOutputStream(resp.getOutputStream());
out.writeObject(ReportFactory.getReport(jasperNameValue,map));
out.flush();
out.close();
}catch(Exceptionex){
}
//将jasperPrint以流方式发送到客户端,让applet接收
2)test1.jsp调用报表的servlet链接
<appletcode="ViewReport.class"archive="applet.jar"width="600"height="500">
<name="REPORT_URL"value="<ahref="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);
publicclassViewReportextendsJApplet{
publicViewReport()throwsHeadlessException{
super();
//TODOAuto-generatedconstructorstub
}
publicvoidinit(){
try{
URLurl=newURL(this.getParameter("REPORT_URL"));
JasperPrintjprint=(JasperPrint)JRLoader.loadObject(url);
JasperViewer.viewReport(jprint,false);
}catch(Exceptionex){
JOptionPane.showMessageDialog(this,ex.getMessage());
}
}
publicvoidstart(){
}
}
4)给Applet.jar进行数字签名
1.Generatekey:于commandline下输入keyname是你自己设的。这里叫javaworld。
1
keytool-genkey-keyalgrsa-aliascarnet
填入你的资讯。此时产生的是key而已。2.Exportkey:于commandline下输入keyname是你刚才设的。叫javaworld。anyname是你自己设要产出的cert。我都取和keyname一样。
1
keytool-export-aliascarnet-filecarnet.crt
3.key已成为档案。4CreateJAR:于commandline下输入applet名称看你自己要jar谁…
1
jarcvfjarname.jarViewReport.class
如果是目录里所有的档案的话例如你的东西全在classes目录下,可先进入此目录,再键入
1
jarcvfxxx.jar.
那一"点"记得要加…代表以下所有档案。5.signjar:于commandline下输入keyname就之前输入的那个名字。carnet。
1
jarsignerjarname.jarcarnet
6.密码不要忘了耶。7.每次compileclasses后,要再编成jar一次,再singer一次。
先用cmd命令去到applet的目录下,动行上面的命令,就可以生成经过签名的jar包了,
同时生成carnet.crt
5)打开</ahref="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
publicvoidgotoHyperlink(JRPrintHyperlinkhyperlink)
switch(hyperlink.getHyperlinkType()){
caseJRHyperlink.HYPERLINK_TYPE_REFERENCE:
{//这里并没有对外部链接进行处理
if(hyperlinkListeners!=null&&hyperlinkListeners.size()>1){
System.out.println("Hyperlinkreference:"+hyperlink.getHyperlinkReference());
System.out.println("ImplementyourownJRHyperlinkListenertomanagethistypeofevent.");
}
break;
}
所以要修改源码,我的做法是:
重新写一个jasperViewe1和一个jrViewer1
放在net.sf.jasperreports.view包中,,
jrViewer1的gotoHyperLink函数体为:
publicvoidgotoHyperlink(JRPrintHyperlinkhyperlink){
super.gotoHyperlink(hyperlink);
if(hyperlink.getHyperlinkType()==JRHyperlink.HYPERLINK_TYPE_REFERENCE){
//log.info("Hyperlinkreference:"+hyperlink.getHyperlinkReference());
try{
JasperPrintjprint=(JasperPrint)JRLoader.loadObject(newURL(hyperlink.getHyperlinkReference()));
JasperViewer.viewReport(jprint,false);
//通过这句话,在jasperView的applet上点击链接时,将会弹出一个新的applet窗口,显示别的内容
}catch(Exceptionex){
JOptionPane.showMessageDialog(this,ex.getMessage());
}
}
}
JasperViewer1代码,因为JasperViewer中的代码的JRViewer是不能set进去的,,所以必须重一写一个JRViewer1类,,JRViewer对象改为jrView1对象…这样才行,,
然后在applet初始的时候调JasperViewer1来弹出JasperViewer,,,
用以上方法,就可以实现在jasperViewer的applet报表中弹出别的报表,即可以在报表中加外部报表的链接了