iReport通过servlet在客户端打印

首先声明,这个是我在网上看到的,只是稍看了一下,在此我拿来做个笔记:
1、页面文件:ContractReport.jsp
<%@ page contentType="text/html; charset=GB2312"%>
<%@ page language="java" %>
<HTML>
<HEAD>
<TITLE>加载Applet小程序</TITLE>
<script language="javascript">

function openApp()
{
var url = "/jjq/servlet/reportServlet"; //这个地方的url是项目名+在web.xml配置的servlet的url
document.write('<applet id="report"  code="ReportApplet" codebase="/jjq/reportClass" archive="jasperreports-3.5.3.jar" width=600 height=100>'); //ReportApplet是applet类的类名,jjq是项目名reportClass是一个文件夹里放ReportApplet,java生成的类名,jasperreports-3.5.3.jar要与你的applet类放在一块,在我这里就是和ReportApplet类放在一起.
document.write('<param name = "type" value="application/x-java-applet;version=1.2.2">');
document.write('<param name = "scriptable" value="false">');
document.write('<param name = "REPORT_URL" value ="'+url+'">');
document.write('</APPLET>');
}
</script>
</HEAD>
<BODY>
<CENTER>
<FONT SIZE = 5 COLOR = blue>加载Applet小程序</FONT>
</CENTER>
<BR>
<HR>
<BR>
<CENTER>
<input type="button" value="测试打印" οnclick="openApp();">
</CENTER>
</BODY>
</HTML>

applet类:ReportApplet.java
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URL;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperPrintManager;
import net.sf.jasperreports.engine.util.JRLoader;
/**
 * @author Teodor Danciu (teodord@users.sourceforge.net)
 * @version $Id: PrinterApplet.java 2692 2009-03-24 17:17:32Z teodord $
 */
public class ReportApplet extends javax.swing.JApplet
{

    private static final long serialVersionUID = 1L;
    private URL url = null;
    private JasperPrint jasperPrint = null;
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel pnlMain;
    private javax.swing.JButton btnView;
    private javax.swing.JButton btnPrint;
    // End of variables declaration//GEN-END:variables
    /** Creates new form AppletViewer */
    public ReportApplet()
    {
        initComponents();
    }
   /**
    *初始化方法
    */
    public void init()
    {String strUrl = getParameter("REPORT_URL"); //得到<applet>中的参数,去触发填充打印事件
    if(strUrl!=null){
           try{
               url = new URL(getCodeBase(),strUrl);//从获得jsp参数中获得报表URL
          }catch(Exception e){
               StringWriter swriter=new StringWriter();
               PrintWriter pwriter=new PrintWriter(swriter);
               e.printStackTrace(pwriter);
               JOptionPane.showMessageDialog(this, swriter.toString());
       }
        }else{
               JOptionPane.showMessageDialog(this, "路径是空的:Source URL not specified");
        }}

       protected void btnPrintActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnPrintActionPerformed
        // Add your handling code here:
        if (url != null)
        {
            if (jasperPrint == null)
            {
            try
                {
                    JOptionPane.showMessageDialog(this, "看看那走了么");
                    JOptionPane.showMessageDialog(this, "捕获的连接为: "+url);
                    jasperPrint=(JasperPrint)JRLoader.loadObject(url);//发送对象请求,获得JasperPrint对象
                    JOptionPane.showMessageDialog(this, "捕获的对象为: "+jasperPrint);
                }
                catch (Exception e)
                {
                    StringWriter swriter = new StringWriter();
                    PrintWriter pwriter = new PrintWriter(swriter);
                    e.printStackTrace(pwriter);
                    JOptionPane.showMessageDialog(this, swriter.toString());
                }
            }
            if (jasperPrint != null)
            {               
                final JasperPrint print = jasperPrint;
               
                Thread thread = new Thread
                    (
                        new Runnable()
                        {
                            public void run()
                            {
                                try
                                {
                                    JasperPrintManager.printReport(print, true);
                                }
                                catch (Exception e)
                                {
                                    StringWriter swriter = new StringWriter();
                                    PrintWriter pwriter = new PrintWriter(swriter);
                                    e.printStackTrace(pwriter);
                                    JOptionPane.showMessageDialog(null, swriter.toString()+"没有打印机");
                                }
                            }
                        }
                    );
               
                thread.start();
            }
            else
            {
                JOptionPane.showMessageDialog(this, "报表为空!");
            }
        }
        else
        {
            JOptionPane.showMessageDialog(this, "空的地址来源!");
        }
    }//GEN-LAST:event_btnPrintActionPerformed
   
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     * 初始化按钮方法
     */
    private void initComponents() {//GEN-BEGIN:initComponents
        pnlMain = new javax.swing.JPanel();
        btnPrint = new javax.swing.JButton();
        btnView = new javax.swing.JButton();
        btnPrint.setText("打 印");
        btnPrint.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnPrintActionPerformed(evt);
            }
        });
        pnlMain.add(btnPrint);
        btnView.setText("预 览");
        btnView.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnViewActionPerformed(evt);
            }
        });
        pnlMain.add(btnView);
        getContentPane().add(pnlMain, java.awt.BorderLayout.CENTER);
    }//GEN-END:initComponents
    protected void btnViewActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnViewActionPerformed
        // Add your handling code here:
        if (url != null)
        {
            try
            {
                if (jasperPrint == null)
                {
                    jasperPrint = (JasperPrint)JRLoader.loadObject(url);
                }
                if (jasperPrint != null)
                {
                    ViewerFrame viewerFrame = new ViewerFrame(this.getAppletContext(), jasperPrint);
                    viewerFrame.show();
                }
                else
                {
                    JOptionPane.showMessageDialog(this, "Empty report.");
                }
            }
            catch (Exception e)
            {
                StringWriter swriter = new StringWriter();
                PrintWriter pwriter = new PrintWriter(swriter);
                e.printStackTrace(pwriter);
                JOptionPane.showMessageDialog(this, swriter.toString());
            }
        }
        else
        {
            JOptionPane.showMessageDialog(this, "Source URL not specified");
        }
    }//GEN-LAST:event_btnViewActionPerformed 
}

JRViewerPlus.java
import javax.swing.JButton;
import javax.swing.JOptionPane;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JRViewer;


/**
 * @author Teodor Danciu (teodord@users.sourceforge.net)
 * @version $Id: JRViewerPlus.java 2692 2009-03-24 17:17:32Z teodord $
 */
public class JRViewerPlus extends JRViewer
{
    protected JButton btnPlus = new javax.swing.JButton();
    public JRViewerPlus(JasperPrint jrPrint) throws JRException
    {
        super(jrPrint);
     
        tlbToolBar.remove(btnSave);
        tlbToolBar.remove(btnReload);

        btnPlus = new javax.swing.JButton();
        btnPlus.setToolTipText("Plus...");
        btnPlus.setText("Plus...");
        btnPlus.setPreferredSize(new java.awt.Dimension(80, 23));
        btnPlus.setMaximumSize(new java.awt.Dimension(80, 23));
        btnPlus.setMinimumSize(new java.awt.Dimension(80, 23));
        btnPlus.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnPlusActionPerformed(evt);
            }
        });
        tlbToolBar.add(btnPlus, 0);
    }

    protected void setZooms()
    {
        this.zooms = new int[]{33, 66, 100, 133, 166, 200, 233};
        this.defaultZoomIndex = 2;
    }

    protected void btnPlusActionPerformed(java.awt.event.ActionEvent evt)
    {
        JOptionPane.showMessageDialog(this, "I just wanted to let you know that you can extend the JRViewer to customize it./n The button you have pushed was added this way.");
    }
}

ViewerFrame.java
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.view.*;
import java.awt.BorderLayout;
import java.applet.AppletContext;
import java.net.*;
import javax.swing.JOptionPane;

/**
 * @author Teodor Danciu (teodord@users.sourceforge.net)
 * @version $Id: ViewerFrame.java 2692 2009-03-24 17:17:32Z teodord $
 */
public class ViewerFrame extends javax.swing.JFrame implements JRHyperlinkListener
{

    private AppletContext appletContext = null;

    public ViewerFrame(AppletContext appletContext, JasperPrint jasperPrint) throws JRException
    {
        initComponents();

        this.appletContext = appletContext;
       
        JRViewerPlus viewer = new JRViewerPlus(jasperPrint);
        viewer.addHyperlinkListener(this);
        this.pnlMain.add(viewer, BorderLayout.CENTER);
    }
    public void gotoHyperlink(JRPrintHyperlink hyperlink)
    {
        switch(hyperlink.getHyperlinkType())
        {
            case JRHyperlink.HYPERLINK_TYPE_REFERENCE :
            {
                try
                {
                    this.appletContext.showDocument(new URL(hyperlink.getHyperlinkReference()), "_blank");
                }
                catch (MalformedURLException e)
                {
                    JOptionPane.showMessageDialog(this, e.getMessage());
                }
                break;
            }
            case JRHyperlink.HYPERLINK_TYPE_LOCAL_ANCHOR :
            case JRHyperlink.HYPERLINK_TYPE_LOCAL_PAGE :
            {
                break;
            }
            case JRHyperlink.HYPERLINK_TYPE_REMOTE_ANCHOR :
            case JRHyperlink.HYPERLINK_TYPE_REMOTE_PAGE :
            {
                JOptionPane.showMessageDialog(this, "Implement your own JRHyperlinkListener to manage this type of event.");
                break;
            }
            case JRHyperlink.HYPERLINK_TYPE_NONE :
            default :
            {
                break;
            }
        }
    }
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {//GEN-BEGIN:initComponents
        pnlMain = new javax.swing.JPanel();
        setTitle("JasperViewer");
        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        pnlMain.setLayout(new java.awt.BorderLayout());
        getContentPane().add(pnlMain, java.awt.BorderLayout.CENTER);
        pack();
        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setSize(new java.awt.Dimension(400, 300));
        setLocation((screenSize.width-400)/2,(screenSize.height-300)/2);
    }//GEN-END:initComponents
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel pnlMain;
    // End of variables declaration//GEN-END:variables
}
上面的有些类好像是官网的demo中的
ReportServlet.java
import java.io.File;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.common.tools.JsfHelper;
import com.cusinfo.contractinfo.ContractDataSourceBean;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;

public class ReportServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
    doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

    try {
         String fileName = "/report/contractReport.jasper";//报表文件名称
         ServletContext context = this.getServletConfig().getServletContext();

         File reportFile = new File(context.getRealPath("/report/contractReport.jasper"));
         
         Map parameters = new HashMap();
         parameters.put("owner","武夷山节节清");
         parameters.put("printPerson","黄泓霖");
         parameters.put("printDate",new java.util.Date());
         try
         { 
             /**
              * 以下是根源所在
              * 可能由于路径的问题
              * 也可能是引擎与设计器版本的不同引起
              * 得不到.jasper格式的报表对像
              */
             JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportFile.getPath());
             JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, new ContractDataSourceBean());
             response.setContentType("application/octet-stream");
             ServletOutputStream ouputStream = (ServletOutputStream) response.getOutputStream();
             ObjectOutputStream oos = new ObjectOutputStream(ouputStream);
             oos.writeObject(jasperPrint);//将JasperPrint对象写入对象输出流中
             oos.flush();
             oos.close();
            
        } catch (Exception e) {
        e.printStackTrace();
        }
        } catch (Exception e) {
        e.printStackTrace();
        }
        response.setContentType("text/html;charset=GB2312");//设置汉字编码
       
    }
      
    public void init() throws ServletException {
        System.err.println("初始化方法");
        // Put your code here
    }

    public ReportServlet() {
        super();
    }

    /**
     * Destruction of the servlet. <br>
     */
    public void destroy() {
        super.destroy(); // Just puts "destroy" string in log
    }
}
备注:在执行时,页面如果显示一直加载.可能是报异常了,找不到一些类,刚开始我们不清楚,在这里担误了好长时间.其实在客户端的java控制台中会显示出来,确少类.找的是XXXX/jjq/reportClass文件夹下,所以少什么样的类,我们就把类所在的jar包给解压开,放入reportClass文件夹下.这个是比较头疼的问题.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值