要使在客户端生成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报表中弹出别的报表,即可以在报表中加外部报表的链接了