iReport 和 Jasperreport整合开发web报表向导(3) 
  
让我们先回顾一下上一篇文档中已经阐述的问题: 
1. 如何连接数据库? 
2. 如何定义变量、参数以及字段? 
3. 如何定义字体以及如何使用自定义的字体(如黑体、楷体或者比较艺术化的子体)? 
下面我们接着往下阐述余下的两个问题,在开始以前我补充两个因该在上篇文档阐述而没有阐述的地方。 
       第一个就是我忘记说明iReport怎样把xml文件编译成jasper文件,其实很简单,点击“编译”按钮  即可,其实在你点击两种“运行  ”按钮的是缺省的操作就是先对xml文件进行编译。 
第二个就是如何设置iReport的输出格式,我们在前面曾说过iReport可以以很多种格式进行输出,如PDF,HTML,XML,XLS,CVS等等,那么我们该如何设置以何种方式输出呢? 
在菜单Build中我们可以看出iReport的缺省输出格式为PDF,如图: 
| 
  
  | 
 PDF preview 缺省输出格 
HTML preview 以网页的格式输出 
剩下的就不说了,大家试一下就明白了,J  |   
但是只在此设置输出格式了,还没有完成设置,还有一个必需的设置就是,为每一种设置选择执行“环境”,例如,如果你选择以PDF输出,那么你需要为其指明Acrobat Reader的路径,如图选择菜单Tools/Options,则会弹出如下属性页: 
  
这里还有一点我要说明的就是,在上边途中External editor的设置是选择编辑xml文件的编辑器,这里我一般用UltraEdit来编辑,你可能喜欢用其他的,譬如editplus等,那么就把常用的xml编辑器输入在这里就可以随心所欲的编辑xml文件了,编辑xml文件进入菜单“Edit/edit XML source”,则会弹出你熟悉的编辑器来编辑该xml文件,如图: 
  
  
还有最后一点要补充的就是,在上一篇文档中我引入非宋体的字体的pdfFontName的ttf文件路径都是绝对路径(如:c:\winnt\fonts\simhei.ttf),其实这是不对的,应该把你在应用程序中的字体打包进来,这样改绝对路径为相对路径(如 reportfonts/simhei.ttf),这样就万无一失了,呵呵J 
  
好了,做完上边的补充,让我们接着前面的问题往下进行,先把下面要解决的问题列如下: 
4. 如何执行SQL脚本进行查询? 
5. 如何把做好的报表引入到应用程序中? 
  
接下来让我们一个问题一个问题的解决它J 
  
       4.如何执行SQL脚本进行查询? 
我们大家都知道,从数据查询必须要有查询语句,特别综合查询的时候可能sql语句会复杂的多,那么iReport是怎样让我们使用自己的查询语句进行输出的呢?我们在上一篇中曾提到过,呵呵J,希望你不会忘记,在菜单view下有Reprot query项,点击则会弹出如下属性页: 
  
点击上图的“Save query to report”则会把这条SQL语句就会把这条查询语句“引入”到报表中了,如果你此时查看XML文件,则会发现如下片断: 
| 
 <queryString><![CDATA[select * from users where name='Jplateau']]></queryString>  |   
此时我们还以上篇文章开始的例子入手,让我们“加工”一下,如下图: 
     
假设我们已经设置好连接数据,那么此时点击“运行”按钮  则会得到如下效果: 
  
呵呵,得到了我们期望的效果,这时,可能你要问,如果我要在sql语句中使用参数呢,那么又该如何?其实我接下来马上要说这个问题,如果我们要以名称来进行模糊查询,传递的参数为name,那么期望的sql语句可能是下面这个样子: 
| 
 Select * from users where name like ‘%name%’  |   
其实在iReport中也可以很容易实现,记得我们在上一篇文档中曾说过参数的使用方法,因此我不多说,我只把最终的sql语句写给大家,相信大家一看就明白: 
| 
 Select * from users where name like ‘%$P{name}%’  |   
是不是很简单?J 
  
5. 如何把做好的报表引入到应用程序中? 
其实在问题4中,如果要运行带参数的查询报表的话,就会牵涉到问题5的,因此我在这里还是要引用问题4种的例子。 
此时我们就要引入一个jsp页面,假设是pdf.jsp,那么下面就是pdf.jsp的代码: 
| 
 <%@ page import="dori.jasper.engine.*" %> 
<%@ page import="java.util.*" %> 
<%@ page import="java.io.*" %> 
<%@ page import="java.sql.*" %> 
  
<% 
       File reportFile = new File(application.getRealPath("/reports/test.jasper")); 
  
       Map parameters = new HashMap(); 
       parameters.put("name", "p"); 
        
       Connection conn=null 
        
       //以下忽略得到数据库连接过程 
//…… 
//…… 
                             
       byte[] bytes =  
              JasperRunManager.runReportToPdf( 
                     reportFile.getPath(),  
                     parameters,  
                     conn 
                     ); 
        
       response.setContentType("application/pdf"); 
       response.setContentLength(bytes.length); 
       ServletOutputStream ouputStream = response.getOutputStream(); 
       ouputStream.write(bytes, 0, bytes.length); 
       ouputStream.flush(); 
       ouputStream.close(); 
%>  |   
  
还有一个必要的步骤就是把你下载的Jasperreport.jar放在你应用程序的lib下, 
好了,启动你的应用程序,运行dbf.jsp则会看到如下效果 
 怎么样,根据名称的模糊查询结果是符合我们的期望的,相信你已经掌握了上边的方法了。 
  
当然上边我给出的例子都是最简单的,而且报表的排版也比较随意,相信一点,精美的报表可是细活啊,呵呵J,多练习吧。 
  
  
总结 
  
这篇系列文档总算写完了,总觉得有点随意的样子,不过还是希望能给一点帮助,文档中不乏有些浅尝辄止的地方,希望你不明白的地方或认为我阐述的不对的地方给我留言或写信。 
我的站点:http://plateau.sicool.com 
邮箱:[email protected] 
  
ps:在这篇系列文档中我给了jasperreport太少的篇幅,不是它不重要,虽然iReport可以为我们做到很好,但是对jasperreport的了解还是很重要的,我很少说明它的另外一个原因我在第一篇文档中也说了,其实jasperreport的配套文档是非常丰富,你可以到我的站点上下载它。再次感谢“开源”所给于我们的一切。 
  
Jplateau 2003年12月27日星期六 写于广州 
   
 
  |