var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-20738293-1']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script')"/>

          jutleo
          歡迎走進有風的地方~~
          posts - 63,  comments - 279,  trackbacks - 0
          接著上篇,jasperReport 實現客戶端主要是依靠applet,但是我們所有的操作不可能在applet中實現吧,這樣也不算一個好的應用。
          考慮一下幾點:
          1. javascript 和applet互相通信。applet和前臺界面交互,可以讓客戶感覺不到有applet的存在。
          2. applet和后臺相互通信。applet既可以接受后臺轉遞的參數、對象流等等 還可以把信息返回到后臺。
          3. applet只實現打印和預覽,主要的業務操作需要在后臺完成。
          上篇中提到print.js:
          新建一jsp頁面 PrintReportApplet.jsp
          次jsp頁面就一個按鈕
          <input type="submit" value="預覽" onclick="reportViewer()" />
          這樣我們就可以在當前頁面中引用到applet了,
          document.applets.myApplet.reportViewer() 拿到applet的窗口句柄后調用applet的reportViewer()方法
          我們也可以在此jsp頁面寫一個初始化的方法傳遞參數到applet中,當然也可以直接傳遞參數到reportViewer(parameter String);
          function getParameters() 
                      
          return "&pid=0001"
          }
          在print.js中指定 <PARAM NAME="CODE" VALUE="com.isoftstone.pcis.report.print.applet.PrinterApplet" />
          PrinterApplet中reportViewer
          // javascript預覽報表
              public void reportViewer() {
                  
          try {
                      win 
          = JSObject.getWindow(this);
                      paraStr 
          = win.eval("getParameters()").toString();

                      
          if ("".equals(paraStr) || paraStr == null{
                          
          return;
                      }

                      System.out.println(
          "paraStr=======>" + paraStr);

                  }
           catch (Exception e1) {
                      e1.printStackTrace();
                  }

                  
          if (url == null{
                      
          if (requestUrl != null{
                          
          try {
                              
          /*
                               * applet與Servlet交互 URL傳遞頁面傳來的參數請求服務器Servlet
                               * 把applet傳遞的參數追加到servlet中 2008-10-14 laoshulin
                               
          */


                              url 
          = new URL(getCodeBase(), requestUrl + "?printView=true"
                                      
          + paraStr);

                              
          if (url == null{
                                  JOptionPane.showMessageDialog(
          this,
                                          
          "Source URL not specified");
                              }
           else {
                                  InputStream in 
          = url.openStream();
                                  ObjectInputStream objIn 
          = new ObjectInputStream(in);
                                  Object obj 
          = objIn.readObject();
                                  
          if (obj instanceof JasperPrint) {

                                  }
           else {
                                      JOptionPane.showMessageDialog(
          this, obj.toString());
                                      
          return;
                                  }


                                  
          if (jasperPrint == null{
                                      
          // 根據Servlet返回的URL(ObjectStream)產生JasperPrint對象
                                      jasperPrint = (JasperPrint) obj;

                                  }

                                  
          // 攔截出現空報表問題
                                  if (jasperPrint != null
                                          
          && jasperPrint.getPages().size() > 0{
                                      
          /*
                                       * 調用JasperReport.jar中JasperViewer繪制報表Frame
                                       * JasperViewer繼承自JFrame,采用setDefaultCloseOperation響應關閉窗口事件
                                       
          */


                                      ViewerFrame viewerFrame 
          = new ViewerFrame(this
                                              .getAppletContext(), jasperPrint);
                                      
                                      viewerFrame.setVisible(
          true);
                                      
          //viewerFrame.show();

                                      
          // JasperViewer viewer = new
                                      
          // JasperViewer(jasperPrint);
                                      
          // viewer.setVisible(true);
                                      
          // viewer.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
                                      
          // 如果請求為空彈出對話框予以提示
                                  }
           else {
                                      JOptionPane
                                              .showMessageDialog(
          this,
                                                      
          "Please check Your Report SQL! It resulted in empty Report! ");
                                      
          return;
                                  }

                              }

                          }
           catch (Exception e) {
                              StringWriter swriter 
          = new StringWriter();
                              PrintWriter pwriter 
          = new PrintWriter(swriter);
                              e.printStackTrace(pwriter);
                              JOptionPane.showMessageDialog(
          this, swriter.toString());
                          }
           finally {// 全打套打URL不一樣釋放對象 by laoshulin
                              url = null;
                              jasperPrint 
          = null;
                              win 
          = null;
                          }

                      }

                  }

              }
          JSObject 對象的使用google一下有很多哦,requestUrl = getParameter("REPORT_URL");為print.js中配置的請求,之后我們new URL帶上我們的參數去請求遠程資源。
          <servlet-mapping>
                  
          <servlet-name>ReportServlet</servlet-name>
                  
          <url-pattern>/report.view</url-pattern>
              
          </servlet-mapping>
          public void doGet(HttpServletRequest request, HttpServletResponse response)
                      
          throws ServletException, IOException {
                  
          try {

                      
          /*
                       * Servlet中可這樣取得打印或是預覽操作,添加此功能針對套打預覽 String
                       * view=request.getParameter("printView"); boolean
                       * isView="true".equalsIgnoreCase(view)?true:false; String
                       * print=request.getParameter("print"); boolean
                       * isPrint="true".equalsIgnoreCase(print)?true:false;
                       
          */


                      
          // 拿參數
                      String pid = request.getParameter("pid");
                      String form 
          = request.getParameter("format");
                      
          // 編譯報表耗時,修改為編譯好的報表
                      /*
                       * JasperReport jasperReport = JasperCompileManager
                       * .compileReport("D:\\workspace\\report\\AppletTest.jasper");
                       
          */

                      
          // 直接使用編譯好的文件
          //            JasperReport jasperReport = (JasperReport) JRLoader
          //                    .loadObject("D:\\workspace\\report\\AppletTest.jasper");
                      JasperReport jasperReport = (JasperReport) JRLoader
                              .loadObjectFromLocation(
          "D:\\workspace\\report\\AppletTest.jasper");
                      HashMap mapParam 
          = new HashMap();
                      mapParam.put(
          "imageParam""D:\\workspace\\report\\eg_smile.gif");
                      
          /*
                       * 此參數用來控制是否顯示圖片
                       * 第二個參數在報表中設置為String類型
                       
          */

                      mapParam.put(
          "isShowImage""true");
                      
          // 生成jasperPrint對象
                      JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
                              mapParam, 
          new JREmptyDataSource());
                      System.out.println(jasperPrint.getPageHeight()
          +"$$$$$$$$$$$$"+jasperPrint.getPageWidth()+"**********"+jasperPrint.getPages());
                      
                  response.setContentType(
          "application/octet-stream");
                          response.setBufferSize(
          8986000);
                          ServletOutputStream outStream 
          = response.getOutputStream();
                          ObjectOutputStream oos 
          = new ObjectOutputStream(outStream);
                          oos.writeObject(jasperPrint);
          //                outStream.flush();
          //                oos.flush();
                          
          //                outStream.close();
          //                oos.close();
                      
                      
          //outStream.flush();
                      
          //
                  }
           catch (Exception e) {
                      e.printStackTrace();
                  }

              }
          請求到遠程資源完全可以安裝業務需求實現自己的jasperReport 了,最終我們只要把一個JasperPrint對象輸出到客戶端就可以了。
          客戶端通過打開InputStream in = url.openStream();實現還原jasperPrint對象,從而實現打印或者預覽。
          客戶端打印可以前的方法是一樣的:
          編譯、填充、生成JasperPrint對象、預覽或打印
          上篇有人提到打印和預覽實現動態控制套打背景,建議你多看看 iReport+jasperReport之圖片控件 ,實現原理是一樣的,只是把JasperPrint在客戶端處理了一下哦。
          posted on 2009-12-15 19:10 凌晨風 閱讀(4581) 評論(2)  編輯  收藏 所屬分類: iReport + JasperReport 系列

          FeedBack:
          # re: iReport+jasperReport之客戶端打印 (續)
          2009-12-16 10:34 | 愛銀
          收藏  回復  更多評論
            

          <2009年12月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(11)

          我參與的團隊

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          新聞分類

          新聞檔案

          收藏夾

          圍脖

          最新隨筆

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 南投市| 仁布县| 克山县| 江山市| 黄梅县| 武义县| 大城县| 印江| 宾川县| 湛江市| 周宁县| 彰化市| 平顶山市| 临泉县| 白水县| 灌南县| 新龙县| 历史| 齐河县| 犍为县| 崇信县| 广丰县| 五指山市| 长白| 达日县| 手游| 肥东县| 聊城市| 嘉祥县| 汝州市| 衡阳市| 来凤县| 当涂县| 淮南市| 深州市| 措勤县| 大田县| 房产| 芦山县| 南昌市| 武山县|