Struts2中整合JasperReports 下

来源:互联网 发布:查看windows路由表命令 编辑:程序博客网 时间:2024/05/16 07:45

2.2,带查询的报表

更多的时候,我们用到的都是这种形式的报表.结合前面介绍的带参数的报表,可以在执行查询时动态传入参数.定义带查询的报表需要在报表设计文件中增加一个查询定义,使用<query ../>元素,每个<query ../>元素定义一个查询,下面是例子程序所使用的查询定义:
<parameter name="id" isForPrompting="true" class="java.lang.Integer"/>
<queryString><![CDATA[select * from book_table where book_id>$P{id}]]></queryString>
<field name="book_id" class="java.lang.Integer"/>
<field name="book_name" class="java.lang.String"/>
<field name="book_author" class="java.lang.String"/>
为了在报表中输出查询的结果,JasperReports还提供了一个Field来访问这种动态数据,每个Field就对应表格的一个字段.定义了Field之后,可以使用$F{FieldName}来访问Field的值.

下面是例子程序的报表设计文件的代码:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Created with iReport - A designer for JasperReports -->
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport name="simpleQuery" columnCount="1" printOrder="Vertical" orientation="Portrait" pageWidth="595" pageHeight="842" columnWidth="535"
   columnSpacing="0" leftMargin="30" rightMargin="30" topMargin="20" bottomMargin="20" whenNoDataType="NoPages" isTitleNewPage="false"
   isSummaryNewPage="false">
<property name="ireport.scriptlethandling" value="0" />
<property name="ireport.encoding" value="UTF-8" />
<import value="java.util.*" />
<import value="net.sf.jasperreports.engine.*" />
<import value="net.sf.jasperreports.engine.data.*" />

<style name="zh" isDefault="false" fontName="宋体" fontSize="18" isBold="true" pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" />

<parameter name="id" isForPrompting="true" class="java.lang.Integer"/>
<queryString><![CDATA[select * from book_table where book_id>$P{id}]]></queryString>
<field name="book_id" class="java.lang.Integer"/>
<field name="book_name" class="java.lang.String"/>
<field name="book_author" class="java.lang.String"/>

   <background>
    <band height="0" isSplitAllowed="true" >
    </band>
   </background>
   <title>
    <band height="50" isSplitAllowed="true" >
    </band>
   </title>
   <pageHeader>
    <band height="50" isSplitAllowed="true" >
    </band>
   </pageHeader>
   <columnHeader>
    <band height="39" isSplitAllowed="true" >
     <staticText>
      <reportElement style="zh" x="93" y="0" width="62" height="31" key="staticText-2"/>
      <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/>
      <textElement>
       <font/>
      </textElement>
     <text><![CDATA[图书ID]]></text>
     </staticText>
     <staticText>
      <reportElement style="zh" x="170" y="0" width="83" height="31" key="staticText-3"/>
      <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/>
      <textElement>
       <font/>
      </textElement>
     <text><![CDATA[图书作者]]></text>
     </staticText>
     <staticText>
      <reportElement style="zh" x="261" y="0" width="191" height="31" key="staticText-4"/>
      <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/>
      <textElement>
       <font/>
      </textElement>
     <text><![CDATA[图书书名]]></text>
     </staticText>
    </band>
   </columnHeader>
   <detail>
    <band height="45" isSplitAllowed="true" >
     <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" >
      <reportElement style="zh" x="93" y="12" width="62" height="33" key="textField"/>
      <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/>
      <textElement>
       <font/>
      </textElement>
     <textFieldExpression   class="java.lang.Integer"><![CDATA[$F{book_id}]]></textFieldExpression>
     </textField>
     <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" >
      <reportElement style="zh" x="261" y="12" width="231" height="33" key="textField"/>
      <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/>
      <textElement>
       <font/>
      </textElement>
     <textFieldExpression   class="java.lang.String"><![CDATA[$F{book_name}]]></textFieldExpression>
     </textField>
     <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" >
      <reportElement style="zh" x="170" y="12" width="83" height="33" key="textField"/>
      <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/>
      <textElement>
       <font/>
      </textElement>
     <textFieldExpression   class="java.lang.String"><![CDATA[$F{book_author}]]></textFieldExpression>
     </textField>
    </band>
   </detail>
   <columnFooter>
    <band height="30" isSplitAllowed="true" >
     <staticText>
      <reportElement style="zh" x="226" y="5" width="103" height="23" key="staticText-5"/>
      <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/>
      <textElement>
       <font/>
      </textElement>
     <text><![CDATA[当前页码:]]></text>
     </staticText>
     <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" >
      <reportElement style="zh" x="339" y="5" width="140" height="23" key="textField"/>
      <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/>
      <textElement>
       <font/>
      </textElement>
     <textFieldExpression   class="java.lang.Integer"><![CDATA[$V{PAGE_COUNT}]]></textFieldExpression>
     </textField>
    </band>
   </columnFooter>
   <pageFooter>
    <band height="50" isSplitAllowed="true" >
    </band>
   </pageFooter>
   <lastPageFooter>
    <band height="50" isSplitAllowed="true" >
    </band>
   </lastPageFooter>
   <summary>
    <band height="50" isSplitAllowed="true" >
    </band>
   </summary>
</jasperReport>
通过上面的代码,可以看到,报表设计文件中有如下几种引用动态数据的方式:
$V{variablesName}:访问变量
$P{parametersName}:访问参数,通过填充报表时使用Map对象传入
$F{fieldsName}:访问字段,通常对应查询字段或集合元素的属性等.

编译跟前面的一样,填充则有不同,填充此报表时应指定执行查询的数据库连接.下面是填充该报表的Java代码:
package lee;
import net.sf.jasperreports.engine.*;
import java.util.*;
import java.sql.*;
public class MyFill
{
    public static void main(String[] args) throws Exception
    {
   //设置填充报表时使用Map对象作为参数
   Map params = new HashMap();
   params.put("id" , 1);
   //填充时,直接指定一个Connection作为数据连接
   JasperFillManager.fillReportToFile("simpleQuery.jasper" , params , getConnection());
   System.out.println("成功填充了一个报表文件(*.jrprint)");
   System.exit(0);
    }

private static Connection getConnection() throws ClassNotFoundException, SQLException
{
   String driver = "com.mysql.jdbc.Driver";
   String connectString = "jdbc:mysql://localhost/j2ee";
   String user = "root";
   String password = "32147";
   Class.forName(driver); //加载驱动
   //获得数据库连接
   Connection conn = DriverManager.getConnection(connectString, user, password);
   return conn;
}
}
因为这里使用的是MySql数据库,因些还需要将MySql的连接程序JAR包mysql-connector-java-5.0.4-bin.jar复制到Web应用的WEB-INF\lib路径下.

从上面的介绍可以看出JasperReports报表开发的关键步骤是报表设计文件的开发.

3,使用iReport设计报表

3.1,下载和安装iReport

下载和安装iReport的步骤如下:
1,在http://www.jasperforge.org上下载iReport,我这里下载的是iReport (classic)下的iReport-3.0.0.zip它正好支持jasperreports-3.0.0-project.zip.
2,解压iReport-3.0.0.zip后,可以看到一个iReport.exe,双击该文件即可运行iReport.
3,第一次运行iReport它都会根据操作系统当前的语言来显示语言,但是中文显示的是繁体字,可以在Options----->选项,里进行设置,我的设置如下:语言-中文中国(第二个,第一个是繁体);Font-宋体.
4,设置完成后就可以看到语言转换成了简体中文.
5,为了更好的使用,还进行如下设置,Options----->选项----->Compiler,这里有三个地方要改动:选择Default complication directory(默认编译生成的.jasper文件存放位置);选中"编译在报表数据夹";取消"keep java file".
6,Options----->选项----->Backup,可以选择在保存原有的报表设计文件时,是否需要保存备份.
7,Options----->选项----->Exteral Programs,这里是设置打开一些文件的系统程序.
经过以上几个步骤,基本完成了iReport工具的设置,下面可以使用了.

上面的系列设置也可以通过修改配置文件来完成,iReport的系统配置文件保存在用户的HOME路径下的.ireport目录下,以Windows xp为例,它保存在C:\Documents and Settings\USER\.ireport目录下的config.xml文件中.

3.2,使用iReport

下面将建立一个带条件查询的报表设计文件,使用iReport来开发一个新的报表设计文件可以通过报表精灵(报表向导)来帮助,但这种方式效率比较低,实际当中也不常用到,下面是一种更实际的开发方式,它的步骤如下:
1,档案----->开启新档,这里只需要输入报表名称就可以了.
2,此时可以看到报表编辑的界面

3.3,建立数据库连接

将MySql的驱动程序复制到iReport\lib路径下,重启iReport,下面就可以建立与MySql数据库的连接了,步骤如下:
1,Data----->连接/资料来源,这里可以对之前设置的连接进行修改等.
2,在上一步的基础上,点击New-----这里可以建立JDBC连接,XML文件数据源,Hibernate连接等.
3,这里使用JDBC连接,选择"Database JDBC connection"----->Next-----下面5个地方需要修改:Name(数据源名称)---test; JDBC Driver(数据库驱动 )---com.mysql.jdbc.Driver; JDBC URL(数据库访问URL)---jdbc:mysql://localhost:3306/lovely; User name(数据库登陆用户名)---root; Password(数据库登陆密码)---password
4,填完以上信息后,可以点击Test按钮测试一下.
5,测试无误后,点击Save按钮保存.
6,如果需要,可以将刚产配置的数据库连接设置成默认连接.
7,Data----->报表查询,这里用于设置报表的查询语句,查询语句可以是SQL,HQL,XPath等,也可以使用"Query designer"来辅助设计查询语句.
8,如果输入的查询语句成功,iReport会自动为查询语句生成对应的Field,在此编辑界面的下方,完成之后点击"OK"保存.
经过上面步骤,报表查询设计成功,下面开始设计报表布局.

3.4,设计报表布局

设计报表布局完全类似于Word,通过"添加静态文本"按钮向报表中添加静态文本内容,通过"添加文本字段"按钮向报表中添加动态文本内容,设计一个简单的报表.
此外,还应该为上面的文本内容(包括静态和动态的文本)设置格式,设置文本格式用Style管理器,建立Style按如下步骤进行:
1,格式化----->Styles,这里可以对之前设置的连接进行修改等.
2,在上一步的基础上,点击New-----这里可以对Style的各项进行设置:Style name---test; Font---宋体 14
iReport还允许Style的继承.

如果需要让PDF文档中可以输出中文内容,则一定要设置该Style的字体,Font----->PDF Font Name属性STSong-Light和PDF Encoding--UniGB-UCS2-H (Chinese Simplified)两个属性一定要设置.

3,完成后点击"OK"按钮,可以看到此Style,可以将它设置成默认的Style.

此时报表文件的设计已经完成了,保存该文件,可以得到.jrxml文件.这里还可以完成编译,导出报表文件,预览报表等操作,这些操作在"建立"选项下.

4,Struts2中安装JasperReports插件

Struts2提供了JasperReports插件的支持struts2-jasperreports-plugin-2.0.11.2.jar,将此文件复制到Web应用的WEB-INF\lib目录下.因为JasperReports项目还会依赖于其它的项目,如果要生成PDF文档,需要iText-2.1.3.jar,如果要支持中文还需要iTextAsian.jar,如果要生成Excel文件需要POI项目的JAR文件poi-3.1-FINAL-20080629.jar.

5,Struts2中使用JasperReports报表

在Struts2中使用JasperReports报表跟普通的JSP几乎一样.

5.1,创建生成报表的Action

生成报表的Action完全是一个普通Action,该Action使用一个List封闭大量VO(value object值对象,需要在页面上显示的JavaBean实例),这个List一般都是从数据库中查找出来的数据.下面是例子程序的Action:
package lee;
import com.opensymphony.xwork2.ActionSupport;
import java.util.*;
public class JasperAction extends ActionSupport
{
public List getBookList()
{
   List result = new ArrayList();
   result.add(new Book(1 , "Spring2.0" , "李"));
   result.add(new Book(2 , "J2EE" , "李"));
   result.add(new Book(3 , "Ajax" , "李"));
   return result;
}
}
上面的Action直接将值设置,并没有查找数据库,这和查找数据库是一样的.

5.2,配置生成JasperReports报表的Action

配置此Action与普通的Action有些不同,它需要增加一个类型为jasper的Result,该Result将会使用JasperReports报表作为视图组件,因为需要使用类型为jasper的Result,所以应该让该Action所在的包继承jasperreports-default包.

这里要注意一点,在struts2-jasperreports-plugin-2.0.11.2.jar\struts-plugin.xml文件中的包并没有继承自struts-default包,因此要将这个文件的以下语句修改一下:
<package name="jasperreports-default">改为:
<package name="jasperreports-default" extends="struts-default">
如果不修改这里的话,可能会有未知错误,因为struts2的所有Action都继承自struts-default包,这个包提供了一些Struts2底层的应用支持.

定义Result类型为jasper时,需要指定三个参数:
1,location:指定.jasper文件的位置.
2,format:指定生成的报表文件的格式,如果不指定,默认生成PDF文件.
3,dataSource:指定一个集合属性名,JasperReports报表将自动迭代输出该集合中的数据.

下面是例子程序的struts.xml文件代码:
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="messageResource"/>
<constant name="struts.i18n.encoding" value="GBK"/>

<!-- 自定义继承jasperreports-default -->
<package name="lee" extends="jasperreports-default"> 
   <action name="export" class="lee.JasperAction">
    <result name="success" type="jasper">
     <param name="location">jasper\sample_report.jasper</param>
     <param name="format">HTML</param>
     <param name="dataSource">bookList</param>
    </result>
   </action>
</package>
</struts>

5.3,生成JasperReports报表

经过上面的步骤,如果需要生成JasperReports报表非常简单,只要提供了系统所需要的报表设计文件即可,与前面有点不同的是,本应用也需要使用文本Field类输出Action中的集合元素,而集合元素的属性就是报表设计文件中的文本字段,因此本应用中的报表设计文件无须使用报表查询,但需要增加3个文本字段,即在报表设计文件中增加如下代码:
<field name="id" class="java.lang.Integer"/>
<field name="name" class="java.lang.String"/>
<field name="author" class="java.lang.String"/>
上面的文本字段与Action中集合属性中的集合元素的属性一样.

完成上面步骤后,直接向export.action发送请求,即可看到报表.

如果在定义export action时,指定success逻辑视图对应的报表格式为PDF,则返回的是一份PDF文档,此份文档的后缀是action,应该在Struts2拦截请求后缀中增加pdf,然后直接向export.pdf发送请求,则会得到export.pdf文件.

原创粉丝点击