要使在客户端生成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() {
try {
URL url = new URL(this.getParameter("REPORT_URL"));
JasperPrint jprint = (JasperPrint) JRLoader.loadObject(url);
JasperViewer.viewReport(jprint, false);
} catch(Exception ex) {
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 一样。
1
keytool -export -alias carnet -file carnet.crt
3.key 已成为档案。 4Create JAR: 于command line 下输入 applet 名称看你自己要 jar谁…
1
jar cvf jarname.jar ViewReport.class
如果是目录里所有的档案的话 例如你的东西全在classes 目录下, 可先进入此目录,再键入
1
jar cvf xxx.jar .
那一" 点" 记得要加…代表以下所有档案。 5.sign jar: 于 command line 下输入 keyname 就之前输入的那个名字。carnet 。
1
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());
try {
JasperPrint jprint = (JasperPrint) JRLoader.loadObject(new URL(hyperlink.getHyperlinkReference()));
JasperViewer.viewReport(jprint, false);
//通过这句话, 在jasperView的applet上点击链接时,将会弹出一个新的applet窗口,显示别的内容
} catch(Exception ex) {
JOptionPane.showMessageDialog(this, ex.getMessage());
}
}
}
JasperViewer1 代码, 因为 JasperViewer中的代码的 JRViewer 是不能set进去的,,所以必须重一写一个JRViewer1类,, JRViewer对象改为 jrView1对象… 这样才行,,
然后在applet初始的时候调JasperViewer1来弹出JasperViewer ,,,
用以上方法,就可以实现在 jasperViewer的applet报表中弹出别的报表,即可以在报表中加外部报表的链接了