applet的用武之地--转

来源:互联网 发布:拉丁舞教学软件下载 编辑:程序博客网 时间:2024/06/01 07:18
 1、在servlet中得到JasperPrint对象,并将之写入ObjectOutputStream中这一步没什么好说的,想怎么实现就怎么实现,总之得到一个JasperPrint对象,然后放进Objuect输出流里输出,最后达到运行servlet会弹出一个下载窗口的结果就OK。这里给出比较关键的步骤:
java 代码
  1. /*  
  2. *这只是一些重点提示,甚至不是一个例子  
  3. */  
  4.   
  5. private static final String CONTENTTYPE = "application/octet-stream";   
  6.   
  7. public void doPost(HttpServletRequest request, HttpServletResponse response)   
  8.             throws ServletException, IOException {   
  9.     response.setContentType(CONTENTTYPE);   
  10.     ServletOutputStream ouputStream = response.getOutputStream();   
  11.     try {   
  12.         ObjectOutputStream oos = new ObjectOutputStream(ouputStream);  
  13.         //这里是调用了另外一个servlet,其结果也是返回一个JasperPrint对象    
  14.         JasperPrint jpt = rst.getReportPrint(rptCode, context,object, tradeTypeInput); 
  15.         oos.writeObject(jpt);   
  16.         oos.flush();   
  17.         oos.close();   
  18.     } catch (ReportException e) {   
  19.         //处理   
  20.     }  

2、用applet接收servlet传出的JasperPrint对象这个,根本就是照抄JapserReport的demo源码了,稍微做了一些改动(比如去掉了预览、不需要按打印按钮直接打印)代码如下:

java 代码
  1. package report.web;   
  2.   
  3. import java.io.PrintWriter;   
  4. import java.io.StringWriter;   
  5. import java.net.URL;   
  6.   
  7. import javax.swing.JOptionPane;   
  8.   
  9. import net.sf.jasperreports.engine.JasperPrint;   
  10. import net.sf.jasperreports.engine.JasperPrintManager;   
  11. import net.sf.jasperreports.engine.util.JRLoader;   
  12.   
  13.   
  14. /**  
  15.  * @author Teodor Danciu (teodord@users.sourceforge.net)  
  16.  * @version $Id: PrinterApplet.java 1229 2006-04-19 13:27:35 +0300 (Wed, 19 Apr 2006) teodord $  
  17.  */  
  18. public class JRPrinterApplet extends javax.swing.JApplet   
  19. {   
  20.   
  21.   
  22.     /**  
  23.      *  
  24.      */  
  25.     private URL url = null;   
  26.     private JasperPrint jasperPrint = null;   
  27.   
  28.   
  29.     /** Creates new form AppletViewer */  
  30.     public JRPrinterApplet()   
  31.     {   
  32.            
  33.     }   
  34.   
  35.   
  36.     /**  
  37.     *  
  38.     */  
  39.     public void init()   
  40.     {   
  41.         String strUrl = getParameter("REPORT_URL");   
  42.         if (strUrl != null)   
  43.         {   
  44.             try  
  45.             {   
  46.                 url = new URL(getCodeBase(), strUrl);   
  47.             }   
  48.             catch (Exception e)   
  49.             {   
  50.                 StringWriter swriter = new StringWriter();   
  51.                 PrintWriter pwriter = new PrintWriter(swriter);   
  52.                 e.printStackTrace(pwriter);   
  53.                 JOptionPane.showMessageDialog(this, swriter.toString());   
  54.             }   
  55.         }   
  56.         else  
  57.         {   
  58.         JOptionPane.showMessageDialog(this"Source URL not specified");   
  59.         }   
  60.     }   
  61.   
  62.     public void start() {   
  63.         if (url != null)   
  64.         {   
  65.             if (jasperPrint == null)   
  66.             {   
  67.                 try  
  68.                 {   
  69.                     jasperPrint = (JasperPrint)JRLoader.loadObject(url);   
  70.                 }   
  71.                 catch (Exception e)   
  72.                 {   
  73.                     StringWriter swriter = new StringWriter();   
  74.                     PrintWriter pwriter = new PrintWriter(swriter);   
  75.                     e.printStackTrace(pwriter);   
  76.                     JOptionPane.showMessageDialog(this, swriter.toString());   
  77.                 }   
  78.             }   
  79.                
  80.             if (jasperPrint != null)   
  81.             {                  
  82.                 final JasperPrint print = jasperPrint;   
  83.                    
  84.                 Thread thread = new Thread   
  85.                     (   
  86.                         new Runnable()   
  87.                         {   
  88.                             public void run()   
  89.                             {   
  90.                                 try    
  91.                                 {   
  92.                                     JasperPrintManager.printReport(print, true);   
  93.                                 }   
  94.                                 catch (Exception e)    
  95.                                 {   
  96.                                     StringWriter swriter = new StringWriter();   
  97.                                     PrintWriter pwriter = new PrintWriter(swriter);   
  98.                                     e.printStackTrace(pwriter);   
  99.                                     JOptionPane.showMessageDialog(null, swriter.toString());   
  100.                                 }   
  101.                             }   
  102.                         }   
  103.                     );   
  104.                    
  105.                 thread.start();   
  106.             }   
  107.             else  
  108.             {   
  109.                 JOptionPane.showMessageDialog(this"Empty report.");   
  110.             }   
  111.         }   
  112.         else  
  113.         {   
  114.             JOptionPane.showMessageDialog(this"Source URL not specified");   
  115.         }   
  116.   
  117.     }   
  118.        
  119. }   

3、打包applet的class和所需的jar包,并加上数字签名要运行这个applet需要jasperreports-1.2.8-applet.jar(后来我想了一下,之所以照抄网上的例子不能成功的原因,很有可能是导入的jar包不对,这个工作是之前的程序员做的,他导入的包当中没有applet这个),可以用winrar直接解压缩了,然后把applet编辑后的class和解压缩后的文件放在同一个目录(比如temp),在命令提示符中输入 jar 命令打成一个包,例如:jar -cvf reportprint.jar *接着开始做数字签名:1)用keytool生成证书:keytool -genkey -alias mykey -keystore mystore2)还是用keytool导出证书:keytool -export -keystore mystore -alias mykey -file my.cer3)用jarsigner给reportprint.jar加上数字签名:jarsigner -keystore mystore reportprint.jar mykey以上都是在命令提示符下运行,mykey和mystore都可以以自己的命名方式来命名现在在temp下已经有了一个reportprint.jar和一个my.cer,把这两个文件拷贝回项目中,记得还是放在同一个目录下

4、用Ajax连接页面和servlet弹出的打印小窗口中不需要把applet加载进去,等按下打印按钮之后再用innerHTML的方式加载,比如:

js 代码
  1. //还是一样,这个不是例子,只是重点提示   
  2.   
  3. var print = document.getElementById("printtest");   
  4. var path = //这里是servlet的地址;   
  5. print.innerHTML = "……" //这里是加载applet的代码,貌似这里直接给出会出错,那么去看JasperReport给的例子好了,例子名称是webapp

 

5、测试打印按下打印按钮后会出现是否运行签名的提示,允许之后就会弹出系统自带的打印对话框。如果不想弹出打印对话框直接在打印机上打印,那么在applet中把JasperPrintManager.printReport(print, true); 改成JasperPrintManager.printReport(print, false);就好,JasperReport的api里有说明

三、环境要求需要客户端安装Jre1.5,并且IE选项高级里,必须将“将JRE1.5.x.xx用于applet(需要重启动)”勾选上才行。在window+IE6.0中运行通过。

至此,用JasperReport在客户端实现本地打印完成。