接着上篇,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()" />
<input type="submit" value="预览" onclick="reportViewer()" />
这样我们就可以在当前页面中引用到applet了,
document.applets.myApplet.reportViewer() 拿到applet的窗口句柄后调用applet的reportViewer()方法
我们也可以在此jsp页面写一个初始化的方法传递参数到applet中,当然也可以直接传递参数到reportViewer(parameter String);

 function getParameters()
function getParameters()  {
{ 
 return "&pid=0001"
            return "&pid=0001"
 }
}
在print.js中指定 <PARAM NAME="CODE" VALUE="com.isoftstone.pcis.report.print.applet.PrinterApplet" />
PrinterApplet中reportViewer
 // javascript预览报表
// javascript预览报表

 public void reportViewer()
    public void reportViewer()  {
{

 try
        try  {
{
 win = JSObject.getWindow(this);
            win = JSObject.getWindow(this);
 paraStr = win.eval("getParameters()").toString();
            paraStr = win.eval("getParameters()").toString();


 if ("".equals(paraStr) || paraStr == null)
            if ("".equals(paraStr) || paraStr == null)  {
{
 return;
                return;
 }
            }
 System.out.println("paraStr=======>" + paraStr);
            System.out.println("paraStr=======>" + paraStr);


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

 if (url == null)
        if (url == null)  {
{

 if (requestUrl != null)
            if (requestUrl != null)  {
{

 try
                try  {
{

 /**//*
                    /**//*
 * applet与Servlet交互 URL传递页面传来的参数请求服务器Servlet
                     * applet与Servlet交互 URL传递页面传来的参数请求服务器Servlet
 * 把applet传递的参数追加到servlet中 2008-10-14 laoshulin
                     * 把applet传递的参数追加到servlet中 2008-10-14 laoshulin
 */
                     */

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


 if (url == null)
                    if (url == null)  {
{
 JOptionPane.showMessageDialog(this,
                        JOptionPane.showMessageDialog(this,
 "Source URL not specified");
                                "Source URL not specified");

 } else
                    } else  {
{
 InputStream in = url.openStream();
                        InputStream in = url.openStream();
 ObjectInputStream objIn = new ObjectInputStream(in);
                        ObjectInputStream objIn = new ObjectInputStream(in);
 Object obj = objIn.readObject();
                        Object obj = objIn.readObject();

 if (obj instanceof JasperPrint)
                        if (obj instanceof JasperPrint)  {
{


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


 if (jasperPrint == null)
                        if (jasperPrint == null)  {
{
 // 根据Servlet返回的URL(ObjectStream)产生JasperPrint对象
                            // 根据Servlet返回的URL(ObjectStream)产生JasperPrint对象
 jasperPrint = (JasperPrint) obj;
                            jasperPrint = (JasperPrint) obj;

 }
                        }
 // 拦截出现空报表问题
                        // 拦截出现空报表问题
 if (jasperPrint != null
                        if (jasperPrint != null

 && jasperPrint.getPages().size() > 0)
                                && jasperPrint.getPages().size() > 0)  {
{

 /**//*
                            /**//*
 * 调用JasperReport.jar中JasperViewer绘制报表Frame
                             * 调用JasperReport.jar中JasperViewer绘制报表Frame
 * JasperViewer继承自JFrame,采用setDefaultCloseOperation响应关闭窗口事件
                             * JasperViewer继承自JFrame,采用setDefaultCloseOperation响应关闭窗口事件
 */
                             */

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

 // JasperViewer viewer = new
                            // JasperViewer viewer = new
 // JasperViewer(jasperPrint);
                            // JasperViewer(jasperPrint);
 // viewer.setVisible(true);
                            // viewer.setVisible(true);
 // viewer.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
                            // viewer.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
 // 如果请求为空弹出对话框予以提示
                            // 如果请求为空弹出对话框予以提示

 } else
                        } else  {
{
 JOptionPane
                            JOptionPane
 .showMessageDialog(this,
                                    .showMessageDialog(this,
 "Please check Your Report SQL! It resulted in empty Report! ");
                                            "Please check Your Report SQL! It resulted in empty Report! ");
 return;
                            return;
 }
                        }
 }
                    }

 } catch (Exception e)
                } catch (Exception e)  {
{
 StringWriter swriter = new StringWriter();
                    StringWriter swriter = new StringWriter();
 PrintWriter pwriter = new PrintWriter(swriter);
                    PrintWriter pwriter = new PrintWriter(swriter);
 e.printStackTrace(pwriter);
                    e.printStackTrace(pwriter);
 JOptionPane.showMessageDialog(this, swriter.toString());
                    JOptionPane.showMessageDialog(this, swriter.toString());

 } finally
                } finally  {// 全打套打URL不一样释放对象 by laoshulin
{// 全打套打URL不一样释放对象 by laoshulin
 url = null;
                    url = null;
 jasperPrint = null;
                    jasperPrint = null;
 win = null;
                    win = null;
 }
                }
 }
            }
 }
        }
 }
    }
JSObject 对象的使用google一下有很多哦,requestUrl = getParameter("REPORT_URL");为print.js中配置的请求,之后我们new URL带上我们的参数去请求远程资源。
 <servlet-mapping>
<servlet-mapping>
 <servlet-name>ReportServlet</servlet-name>
        <servlet-name>ReportServlet</servlet-name>
 <url-pattern>/report.view</url-pattern>
        <url-pattern>/report.view</url-pattern>
 </servlet-mapping>
    </servlet-mapping> public void doGet(HttpServletRequest request, HttpServletResponse response)
public void doGet(HttpServletRequest request, HttpServletResponse response)

 throws ServletException, IOException
            throws ServletException, IOException  {
{

 try
        try  {
{


 /**//*
            /**//*
 * Servlet中可这样取得打印或是预览操作,添加此功能针对套打预览 String
             * Servlet中可这样取得打印或是预览操作,添加此功能针对套打预览 String
 * view=request.getParameter("printView"); boolean
             * view=request.getParameter("printView"); boolean
 * isView="true".equalsIgnoreCase(view)?true:false; String
             * isView="true".equalsIgnoreCase(view)?true:false; String
 * print=request.getParameter("print"); boolean
             * print=request.getParameter("print"); boolean
 * isPrint="true".equalsIgnoreCase(print)?true:false;
             * isPrint="true".equalsIgnoreCase(print)?true:false;
 */
             */

 // 拿参数
            // 拿参数
 String pid = request.getParameter("pid");
            String pid = request.getParameter("pid");
 String form = request.getParameter("format");
            String form = request.getParameter("format");
 // 编译报表耗时,修改为编译好的报表
            // 编译报表耗时,修改为编译好的报表

 /**//*
            /**//*
 * JasperReport jasperReport = JasperCompileManager
             * JasperReport jasperReport = JasperCompileManager
 * .compileReport("D:\\workspace\\report\\AppletTest.jasper");
             * .compileReport("D:\\workspace\\report\\AppletTest.jasper");
 */
             */
 // 直接使用编译好的文件
            // 直接使用编译好的文件
 //            JasperReport jasperReport = (JasperReport) JRLoader
//            JasperReport jasperReport = (JasperReport) JRLoader
 //                    .loadObject("D:\\workspace\\report\\AppletTest.jasper");
//                    .loadObject("D:\\workspace\\report\\AppletTest.jasper");
 JasperReport jasperReport = (JasperReport) JRLoader
            JasperReport jasperReport = (JasperReport) JRLoader
 .loadObjectFromLocation("D:\\workspace\\report\\AppletTest.jasper");
                    .loadObjectFromLocation("D:\\workspace\\report\\AppletTest.jasper");
 HashMap mapParam = new HashMap();
            HashMap mapParam = new HashMap();
 mapParam.put("imageParam", "D:\\workspace\\report\\eg_smile.gif");
            mapParam.put("imageParam", "D:\\workspace\\report\\eg_smile.gif");

 /**//*
            /**//*
 * 此参数用来控制是否显示图片
             * 此参数用来控制是否显示图片
 * 第二个参数在报表中设置为String类型
             * 第二个参数在报表中设置为String类型
 */
             */
 mapParam.put("isShowImage", "true");
            mapParam.put("isShowImage", "true");
 // 生成jasperPrint对象
            // 生成jasperPrint对象
 JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
 mapParam, new JREmptyDataSource());
                    mapParam, new JREmptyDataSource());
 System.out.println(jasperPrint.getPageHeight()+"$$$$$$$$$$$$"+jasperPrint.getPageWidth()+"**********"+jasperPrint.getPages());
            System.out.println(jasperPrint.getPageHeight()+"$$$$$$$$$$$$"+jasperPrint.getPageWidth()+"**********"+jasperPrint.getPages());
 
            
 response.setContentType("application/octet-stream");
        response.setContentType("application/octet-stream");
 response.setBufferSize(8986000);
                response.setBufferSize(8986000);
 ServletOutputStream outStream = response.getOutputStream();
                ServletOutputStream outStream = response.getOutputStream();
 ObjectOutputStream oos = new ObjectOutputStream(outStream);
                ObjectOutputStream oos = new ObjectOutputStream(outStream);
 oos.writeObject(jasperPrint);
                oos.writeObject(jasperPrint);
 //                outStream.flush();
//                outStream.flush();
 //                oos.flush();
//                oos.flush();
 
                
 //                outStream.close();
//                outStream.close();
 //                oos.close();
//                oos.close();
 
            
 //outStream.flush();
            //outStream.flush();
 //
            //

 } catch (Exception e)
        } catch (Exception e)  {
{
 e.printStackTrace();
            e.printStackTrace();
 }
        }
 }
    }
请求到远程资源完全可以安装业务需求实现自己的jasperReport 了,最终我们只要把一个JasperPrint对象输出到客户端就可以了。
客户端通过打开InputStream in = url.openStream();实现还原jasperPrint对象,从而实现打印或者预览。
客户端打印可以前的方法是一样的:
编译、填充、生成JasperPrint对象、预览或打印
上篇有人提到打印和预览实现动态控制套打背景,建议你多看看 
iReport+jasperReport之图片控件 ,实现原理是一样的,只是把JasperPrint在客户端处理了一下哦。 
	
posted on 2009-12-15 19:10 
凌晨风 阅读(4599) 
评论(2)  编辑  收藏  所属分类: 
iReport + JasperReport 系列