Applet+客戶端打印+jasperreport+報表

新建一 web 項目 Test2。將 iReport 目錄 lib 下的所有 jar 包導入。在 servlet 程序中把從數據庫得到的數據傳入 *.jrxml 文件得到 *.jrprint 文件(這纔是我們想要的東西),並把這個對象寫入 Stream流,以返還給請求客戶端。源碼:

 

  1. package com.defonds.test;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.io.ObjectOutputStream;  
  6.   
  7. import javax.servlet.RequestDispatcher;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.ServletOutputStream;  
  10. import javax.servlet.http.HttpServlet;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpServletResponse;  
  13. import java.sql.Connection;  
  14. import java.sql.DriverManager;  
  15. import java.sql.ResultSet;  
  16. import java.sql.SQLException;  
  17. import java.sql.Statement;  
  18. import java.util.Calendar;  
  19. import java.util.HashMap;  
  20. import java.util.Map;  
  21.   
  22. import net.sf.jasperreports.engine.JRResultSetDataSource;  
  23. import net.sf.jasperreports.engine.JasperCompileManager;  
  24. import net.sf.jasperreports.engine.JasperExportManager;  
  25. import net.sf.jasperreports.engine.JasperFillManager;  
  26. import net.sf.jasperreports.engine.JasperPrint;  
  27. import net.sf.jasperreports.engine.JasperReport;  
  28. import net.sf.jasperreports.engine.JasperRunManager;  
  29.   
  30. /** 
  31.  * 建立數據庫鏈接 
  32.  * 由 sql 語法取出資料,準備好傳入的 parameters 
  33.  * 將 parameters 及取出的資料傳入 Jasper 中。會由 .jasper 文檔生出 .jrprint 文檔 
  34.  * 再由 .jrprint 文檔生出 .pdf 目的文檔給調用頁面下載 
  35.  * @author Defonds 
  36.  * 
  37.  */  
  38. public class TestServlet3 extends HttpServlet {  
  39.    
  40.  private static final String CONTENTTYPE = "application/octet-stream";   
  41.   
  42.     /** 
  43.      * Constructor of the object. 
  44.      */  
  45.     public TestServlet3() {  
  46.         super();  
  47.     }  
  48.   
  49.     /** 
  50.      * Destruction of the servlet. <br> 
  51.      */  
  52.     public void destroy() {  
  53.         super.destroy(); // Just puts "destroy" string in log  
  54.         // Put your code here  
  55.     }  
  56.   
  57.     /** 
  58.      * The doGet method of the servlet. <br> 
  59.      * 
  60.      * This method is called when a form has its tag value method equals to get. 
  61.      *  
  62.      * @param request the request send by the client to the server 
  63.      * @param response the response send by the server to the client 
  64.      * @throws ServletException if an error occurred 
  65.      * @throws IOException if an error occurred 
  66.      */  
  67.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  68.             throws ServletException, IOException {  
  69.      String fileName = "";  
  70.      String sql = "";  
  71.      Map parameters = new HashMap();  
  72.      //parameters.put("rptToday", strDate);//傳入的 prameters 引數  
  73.      sql = "select * from tab_channel_car_basic t";  
  74.        
  75.      Connection conn = this.createConnection();//建立連接  
  76.      try {  
  77.       Statement stmt = conn.createStatement();  
  78.       ResultSet rs = stmt.executeQuery(sql);  
  79.       response.setContentType(CONTENTTYPE);    
  80.       ServletOutputStream ouputStream = response.getOutputStream();    
  81.       fileName="D://iReport//iReport-0.4.0//Work//carBasic3.jrxml";  
  82.       JasperReport jrt = JasperCompileManager.compileReport(fileName);//編譯報表格式   
  83.       JasperPrint jpt = JasperFillManager.fillReport(jrt, parameters, new JRResultSetDataSource(rs));//匹配數據源,生成JasperPrint  
  84.       ObjectOutputStream oos = new ObjectOutputStream(ouputStream);   
  85.       oos.writeObject(jpt);      
  86.             oos.flush();      
  87.             oos.close();   
  88.   
  89.   
  90.      }catch(Exception e) {  
  91.       System.out.println("Error:" + e.toString());  
  92.       e.printStackTrace();  
  93.      }finally {  
  94.       CloseConnect(conn);  
  95.       conn = null;  
  96.      }  
  97.        
  98.     }  
  99.        
  100.     /** 
  101.      * 建立連接方法 
  102.      * @return Connection 
  103.      */  
  104.      public Connection createConnection() {  
  105.       Connection conn;  
  106.       try {  
  107.        String driver = "oracle.jdbc.driver.OracleDriver";  
  108.        String url = "jdbc:oracle:thin:@localhost:1521:CUC";  
  109.        Class.forName(driver);  
  110.        conn = DriverManager.getConnection(url,"sybj","sybj");  
  111.        conn.setAutoCommit(false);  
  112.        return conn;  
  113.       }catch(SQLException e1) {  
  114.        System.out.println("建立連接錯誤 = " + e1.toString());  
  115.        e1.printStackTrace();  
  116.       }catch(ClassNotFoundException e2) {  
  117.        System.out.println("建立連接錯誤 = " + e2.toString());  
  118.        e2.printStackTrace();  
  119.       }  
  120.       return null;  
  121.      }  
  122.        
  123.     /** 
  124.      * 關閉連接方法 
  125.      * @param conn 
  126.      */   
  127.     public void CloseConnect(Connection conn) {  
  128.      try {  
  129.       conn.commit();  
  130.       conn.setAutoCommit(true);  
  131.       conn.close();  
  132.      }catch(Exception e) {  
  133.       System.out.println("關閉連接錯誤 = " + e.toString());  
  134.      }  
  135.     }  
  136.       
  137.   
  138. }  

 

PS:這裏,關於 carBasic3.jrxml 文件的提取,筆者採用的是物理路徑,讀者可以把 *.jrxml 文件放到項目根目錄下,然後採用其他方式提取。
如果輸入
http://localhost:9999/Test2/testServlet3 就彈出來一個下載窗口,證明這個 servlet 已經 ok(筆者 tomcat 端口號設置的是 9999,在 Test2 項目中進行測試)。
7、applet 請求服務器 servlet 得到 JasperPrint 對象並打印。源碼:

 

  1. package com.defonds.test;  
  2.   
  3. import java.applet.Applet;  
  4. import java.io.PrintWriter;  
  5. import java.io.StringWriter;  
  6. import java.net.URL;  
  7.   
  8. import javax.swing.JOptionPane;  
  9.   
  10. import net.sf.jasperreports.engine.JasperPrint;  
  11. import net.sf.jasperreports.engine.JasperPrintManager;  
  12. import net.sf.jasperreports.engine.util.JRLoader;  
  13.   
  14. public class JRPrinterApplet extends javax.swing.JApplet      
  15. {      
  16.      
  17.      
  18.     /**    
  19.      *    
  20.      */     
  21.     private URL url = null;      
  22.     private JasperPrint jasperPrint = null;      
  23.      
  24.      
  25.     /** Creates new form AppletViewer */     
  26.     public JRPrinterApplet()      
  27.     {      
  28.               
  29.     }      
  30.      
  31.      
  32.     /**    
  33.     *    
  34.     */     
  35.     public void init()      
  36.     {      
  37. //        String strUrl = getParameter("REPORT_URL");      
  38.      String strUrl = "http://localhost:9999/Test2/testServlet3";  
  39.         if (strUrl != null)      
  40.         {      
  41.             try     
  42.             {      
  43.                 //url = new URL(getCodeBase(), strUrl);      
  44.              URL urll = new URL("http://localhost:9999/Test2/testServlet3");  
  45.              url = urll;  
  46.        System.out.println("url="+urll);  
  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"init():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.                  System.out.println("進入start方法,即將下載pdf文件");  
  70.                     jasperPrint = (JasperPrint)JRLoader.loadObject(url);    
  71.                     System.out.println("進入start方法,下載pdf文件完畢");  
  72.                 }      
  73.                 catch (Exception e)      
  74.                 {      
  75.                     StringWriter swriter = new StringWriter();      
  76.                     PrintWriter pwriter = new PrintWriter(swriter);      
  77.                     e.printStackTrace(pwriter);      
  78.                     JOptionPane.showMessageDialog(this, swriter.toString());      
  79.                 }      
  80.             }      
  81.                   
  82.             if (jasperPrint != null)      
  83.             {                     
  84.                 final JasperPrint print = jasperPrint;      
  85.                       
  86.                 Thread thread = new Thread      
  87.                     (      
  88.                         new Runnable()      
  89.                         {      
  90.                             public void run()      
  91.                             {      
  92.                                 try       
  93.                                 {      
  94.                                  System.out.println("進入start方法,即將打印pdf文件");  
  95.                                     JasperPrintManager.printReport(print, true);      
  96.                                 }      
  97.                                 catch (Exception e)       
  98.                                 {      
  99.                                     StringWriter swriter = new StringWriter();      
  100.                                     PrintWriter pwriter = new PrintWriter(swriter);      
  101.                                     e.printStackTrace(pwriter);      
  102.                                     JOptionPane.showMessageDialog(null, swriter.toString());      
  103.                                 }      
  104.                             }      
  105.                         }      
  106.                     );      
  107.                       
  108.                 thread.start();      
  109.             }      
  110.             else     
  111.             {      
  112.                 JOptionPane.showMessageDialog(this"Empty report.");      
  113.             }      
  114.         }      
  115.         else     
  116.         {      
  117.             JOptionPane.showMessageDialog(this"start():Source URL not specified");      
  118.         }      
  119.      
  120.     }      
  121.           
  122. }  

 

右鍵單擊 JRPrinterApplet.java,選擇 “Run as Java Applet”,彈出打印對話框,確認後打印機正常打印,證明 applet 已經編寫成功。
8、jsp 頁面嵌入 applet源碼:

 

  1. <%@ page language="java" import="java.util.*" pageEncoding="GBK"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.   <head>  
  10.     <base href="<%=basePath%>">  
  11.       
  12.     <title>My JSP 'index.jsp' starting page</title>  
  13.  <meta http-equiv="pragma" content="no-cache">  
  14.  <meta http-equiv="cache-control" content="no-cache">  
  15.  <meta http-equiv="expires" content="0">      
  16.  <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  17.  <meta http-equiv="description" content="This is my page">  
  18.  <!-- 
  19.  <link rel="stylesheet" type="text/css" href="styles.css" mce_href="styles.css"> 
  20.  -->  
  21. </head>   
  22. <mce:script language="javascript"><!--  
  23.    
  24. function openApp()   
  25. {   
  26. var url = "/JRPrintServlet";   
  27. document.write('<APPLET ID="JrPrt" CODE="com.defonds.test.JRPrinterApplet.class" CODEBASE = "./" ARCHIVE = "reportprint.jar" WIDTH = "0" HEIGHT = "0">');   
  28. document.write('<PARAM NAME = "type" VALUE="application/x-java-applet;version=1.2.2">');   
  29. document.write('<PARAM NAME = "scriptable" VALUE="false">');   
  30. document.write('<PARAM NAME = "REPORT_URL" VALUE ="'+url+'">');   
  31. document.write('</APPLET>');   
  32. }  
  33. // --></mce:script>   
  34. <body bgcolor="#FFFFFF">   
  35. <input type="button" value="測試打印" onclick="openApp();">   
  36.   
  37. </body>   
  38. </html>   



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章