`
xzknet
  • 浏览: 301655 次
  • 性别: Icon_minigender_1
  • 来自: 河南
文章分类
社区版块
存档分类
最新评论

iReport使用拓展:在客户端IE中使用jasperView

阅读更多

要使在客户端生成jasperView 的applet,<o:p></o:p>

<o:p></o:p>

注意:<o:p></o:p>

applet.jar, carnet.crt 都在 WebRoot 目录下<o:p></o:p>

applet.jar包括了 jasperreport.jar , poi.jar, jxl.jar, jfreechat.jar, antlr.jar , commons.jar ….<o:p></o:p>

可根据功能去掉一些jar, 为了方便, 我全部打包一下applet.jar里了<o:p></o:p>

如果仅有jasperreport.jar , 客户端的生成的jasperView 只能浏览报表内容。但是不能够导出, 保存.<o:p></o:p>

<o:p></o:p>

1) servlet ,返回 jasperPrint 的数据流<o:p></o:p>

resp.setContentType("application/octet-stream");<o:p></o:p>

try {<o:p></o:p>

ObjectOutputStream out = new ObjectOutputStream(resp.getOutputStream());<o:p></o:p>

out.writeObject(ReportFactory.getReport(jasperNameValue, map));<o:p></o:p>

out.flush();<o:p></o:p>

out.close();<o:p></o:p>

} catch(Exception ex) {<o:p></o:p>

}<o:p></o:p>

// 将jasperPrint以流方式发送到客户端 ,让 applet接收<o:p></o:p>

<o:p></o:p>

2) test1.jsp 调用报表的servlet 链接<o:p></o:p>

<applet code= "ViewReport.class" archive ="applet.jar" width= "600" height ="500"><o:p></o:p>

<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>"><o:p></o:p>

</ applet><o:p></o:p>

// 其中 applet.jar 的类有很多, 下面有说明<o:p></o:p>

ViewReport.class 是用在applet.jar 的根下的<o:p></o:p>

<o:p></o:p>

3) Applet调用 JasperViewer.viewReport(jprint, false);<o:p></o:p>

public class ViewReport extends JApplet {<o:p></o:p>

<o:p></o:p>

public ViewReport() throws HeadlessException {<o:p></o:p>

super();<o:p></o:p>

// TODO Auto-generated constructor stub<o:p></o:p>

}<o:p></o:p>

<o:p></o:p>

public void init() {<o:p></o:p>

try {<o:p></o:p>

URL url = new URL(this.getParameter("REPORT_URL"));<o:p></o:p>

JasperPrint jprint = (JasperPrint) JRLoader.loadObject(url);<o:p></o:p>

JasperViewer.viewReport(jprint, false);<o:p></o:p>

} catch(Exception ex) {<o:p></o:p>

JOptionPane.showMessageDialog(this, ex.getMessage());<o:p></o:p>

}<o:p></o:p>

}<o:p></o:p>

<o:p></o:p>

public void start() {<o:p></o:p>

}<o:p></o:p>

}<o:p></o:p>

<o:p></o:p>

4) 给Applet.jar进行数字签名<o:p></o:p>

1.Generate key: 于 command line下输入 keyname 是你自己设的。这里叫javaworld 。<o:p></o:p>

1<o:p></o:p>

keytool -genkey -keyalg rsa -alias carnet<o:p></o:p>

填入你的资讯。 此时产生的是key 而已。 2.Export key: 于 command line下输入 keyname 是你刚才设的。叫javaworld 。 anyname 是你自己设要产出的 cert。我都取和 keyname 一样。<o:p></o:p>

1<o:p></o:p>

keytool -export -alias carnet -file carnet.crt<o:p></o:p>

3.key 已成为档案。 4Create JAR: 于command line 下输入 applet 名称看你自己要 jar谁…<o:p></o:p>

1<o:p></o:p>

jar cvf jarname.jar ViewReport.class<o:p></o:p>

如果是目录里所有的档案的话 例如你的东西全在classes 目录下, 可先进入此目录,再键入<o:p></o:p>

1<o:p></o:p>

jar cvf xxx.jar .<o:p></o:p>

那一" 点" 记得要加…代表以下所有档案。 5.sign jar: 于 command line 下输入 keyname 就之前输入的那个名字。carnet 。<o:p></o:p>

1<o:p></o:p>

jarsigner jarname.jar carnet<o:p></o:p>

6. 密码不要忘了耶。 7. 每次 compile classes后,要再编成 jar 一次,再singer 一次。<o:p></o:p>

<o:p></o:p>

先用 cmd 命令去到 applet的目录下, 动行上面的命令,就可以生成经过签名的jar 包了,<o:p></o:p>

同时生成carnet.crt<o:p></o:p>

<o:p></o:p>

5) 打开 </a href="http://192.168.0.161/test/test1.jsp">http://192.168.0.161/test/test1.jsp</a><o:p></o:p>

这样, 就可以提示是否信任数字签名,然后点 "YES" 就可以了<o:p></o:p>

以测试, 别的机也可以看到.



Jasperview 的applet中加超链接<o:p></o:p>

<o:p></o:p>

项目需求:<o:p></o:p>

在客户端弹出jasperviwer的applet,使得客户端可以随意导出为多种格式,同意也省了代码的开发,,直接用applet就行了,在客户端弹出jasperviewer在我的旧文章中有说明,<o:p></o:p>

现在说的是如果在jasperviwer中弹出另一个applet的jasperviwer,因为看源码,如果HyperLink是REFERENCE,那么是什么也不做的,,现改为点击REFERENCE的HyperLink后,弹出新的applet.<o:p></o:p>

<o:p></o:p>

<o:p></o:p>

在用 ireport设计报表的时候, 选中texf-field的属性,然后输入 HyperLink的相关内容,<o:p></o:p>

<o:p></o:p>

但是在用applet的jasperview是,报表中的链接如果都是外部链接的话,都没反应,,这是因为:<o:p></o:p>

<o:p></o:p>

net.sf.jasperreports.view. JRViewer<o:p></o:p>

public void gotoHyperlink(JRPrintHyperlink hyperlink)<o:p></o:p>

switch(hyperlink.getHyperlinkType()){<o:p></o:p>

case JRHyperlink.HYPERLINK_TYPE_REFERENCE :<o:p></o:p>

// 这里并没有对外部链接进行处理<o:p></o:p>

if (hyperlinkListeners != null && hyperlinkListeners.size() > 1){<o:p></o:p>

System.out.println("Hyperlink reference : " + hyperlink.getHyperlinkReference());<o:p></o:p>

System.out.println("Implement your own JRHyperlinkListener to manage this type of event.");<o:p></o:p>

}<o:p></o:p>

break;<o:p></o:p>

}<o:p></o:p>

<o:p></o:p>

所以要修改源码,我的做法是:<o:p></o:p>

<o:p></o:p>

重新写一个 jasperViewe1和一个jrViewer1<o:p></o:p>

放在 net.sf.jasperreports.view包中,,<o:p></o:p>

jrViewer1的 gotoHyperLink函数体为:<o:p></o:p>

public void gotoHyperlink(JRPrintHyperlink hyperlink) {<o:p></o:p>

super.gotoHyperlink(hyperlink);<o:p></o:p>

if(hyperlink.getHyperlinkType() == JRHyperlink.HYPERLINK_TYPE_REFERENCE) {<o:p></o:p>

//log.info("Hyperlink reference : " + hyperlink.getHyperlinkReference());<o:p></o:p>

try {<o:p></o:p>

JasperPrint jprint = (JasperPrint) JRLoader.loadObject(new URL(hyperlink.getHyperlinkReference()));<o:p></o:p>

JasperViewer.viewReport(jprint, false);<o:p></o:p>

//通过这句话, 在jasperView的applet上点击链接时,将会弹出一个新的applet窗口,显示别的内容<o:p></o:p>

} catch(Exception ex) {<o:p></o:p>

JOptionPane.showMessageDialog(this, ex.getMessage());<o:p></o:p>

}<o:p></o:p>

}<o:p></o:p>

}<o:p></o:p>

<o:p></o:p>

JasperViewer1 代码, 因为 JasperViewer中的代码的 JRViewer 是不能set进去的,,所以必须重一写一个JRViewer1类,, JRViewer对象改为 jrView1对象… 这样才行,,<o:p></o:p>

<o:p></o:p>

然后在applet初始的时候调JasperViewer1来弹出JasperViewer ,,,<o:p></o:p>

<o:p></o:p>

用以上方法,就可以实现在 jasperViewer的applet报表中弹出别的报表,即可以在报表中加外部报表的链接了 <o:p></o:p>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics