天天看点

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报表中弹出别的报表,即可以在报表中加外部报表的链接了