struts2+jasperreport集成方案

web项目需要增加报表,报表分为明细表、统计表(多级表头)和图形表(柱状图),思来想去选择了集成jasperreport,这样可以方便后期维护及扩展,虽然初期集成和上手麻烦点,但是可以使用iReport设计器还是省了不少工作。

注意,ireport5.6.0 启动需要1.7jdk,1.8会一闪而过。

1. jasperreport的依赖,集成过程大部分错误都是缺少jar包,maven列表:

<dependency>
  <groupId>net.sf.jasperreports</groupId>
  <artifactId>jasperreports</artifactId>
  <version>5.6.0</version>
</dependency>

<dependency>
  <groupId>org.codehaus.groovy</groupId>
  <artifactId>groovy-all</artifactId>
  <version>2.0.1</version>
</dependency> 

<dependency>
  <groupId>org.apache.struts</groupId>
  <artifactId>struts2-jasperreports-plugin</artifactId>
  <version>2.5.10.1</version>
</dependency>

<dependency>
  <groupId>joda-time</groupId>
  <artifactId>joda-time</artifactId>
  <version>2.10.1</version>
</dependency>

一共24个依赖jar包,如下图:
jasper_report依赖包

2. struts.xml中基本定义要增加jasper结果类型,最好放在package的第一行避免报错。

<package name="system_default" extends="struts-default">
		<result-types>
			<result-type name="jasper" class="org.apache.struts2.views.jasperreports.JasperReportsResult"/>
		</result-types>
</package>

3. action的两种配置方式java代码构造数据和直接连接数据库:

	<!--1. 程序构造数据-->
	<action name="jasper_report_index"
		class="com.bnu.questionnaire.plugin.jasperreport.action.JasperReportAction"
		method="getInfoCheckIndex">
		<result>/${html}</result>
	</action>

	<action name="jasper_report_getInfoCheckData" class="com.bnu.questionnaire.plugin.jasperreport.action.JasperReportAction">
		<result name="success" type="jasper">
			<!-- location指定iReport设计器编译产生的jasper报表文件在项目目录的位置 -->
			<!-- /项目根目录/${location} -->
			<!-- http://localhost:8088/项目名/${location} -->
			<param name="location">/jasper/report1.jasper</param>
			<!--  dataSource指定数据源action中函数方法,反射getXXXX()方法 -->
			<!-- 如下配置示例反射action中的getReportData()方法 -->
			<param name="dataSource">reportData</param>
			<!-- format指定返回类型,默认PDF -->
			<param name="format">HTML</param>
			<!-- imageServletUrl指定图片servlet地址 -->
			<!-- 不配置会出现报表背景及图形表图片无法显示情况 -->
			<param name="imageServletUrl">
				<![CDATA[/image?image=]]>
			</param>
		</result>
	</action>
	<!--2. 直连数据库-->
	<action name="jasper_report_infocheck" class="com.bnu.questionnaire.plugin.jasperreport.action.JasperReportAction">
		<result name="success" type="jasper">
			<param name="location">/jasper/report1.jasper</param>
			<!-- connection指定数据链接,使用直连数据库的方式,反射action中getXXXXX()方法,应返回数据库Connection对象 -->
			<param name="connection">jasperConnection</param>
			<param name="format">HTML</param>
			<!--ireport设计时sql语句中包含查询条件$P{year}和$P{region}-->
			<!--也可以通过$P!{where语句}直接替换为查询语句,例如:ireport中设计语句为"select * from tableName $P!{where}",那么action返回参数可以直接定义为map.put("where","where param1 = 'value1' ")-->
			<param name="reportParameters">Params</param>
			<param name="imageServletUrl">
				<![CDATA[/image?image=]]>
			</param>	
		</result>
	</action>

3. web.xml关于图片的配置,不配置无法正常显示charts

<!--jasperreport-->
<servlet>
	<servlet-name>JasperReportImageServlet</servlet-name>
	<servlet-class>
		net.sf.jasperreports.j2ee.servlets.ImageServlet
	</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>JasperReportImageServlet</servlet-name>
	<url-pattern>/image</url-pattern>
</servlet-mapping>

4. Action伪代码

    /**
     * Using:报表主页加载数据
     *
     * @return
     */
    public List<DemoModel> getReportData() throws Exception {
        List<DemoModel> demoModelList = new ArrayList<>();
        demoModelList.add(new DemoModel("test1","100001","李一","oa"));
        demoModelList.add(new DemoModel("test2","100002","王二","oa"));
        demoModelList.add(new DemoModel("test3","100003","张三","oa"));
        return demoModelList;
    }

    /**
     * Using:jasperReport直连数据库,返回Connection对象。
     *
     * @return Connection
     * @throws Exception
     */
    public Connection getJasperConnection() throws Exception{
        String region = this.getRequest().getParameter("region");
        String year = this.getRequest().getParameter("year");
        Params.put("year", year);
        Params.put("region", region);
        Connection connection = this.getConnection();
        return connection;
    }
    
    /**
    * Using:定义返回报表模板的参数
    **/
    private HashMap Params = new HashMap();

    public HashMap getParams() {
        return Params;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值