Struts2+JasperReport开发


此贴非原创,此文相关信息:   来源:博客园 作者:一个人编程 责任编辑:许亮

非常感谢原作者<一个人编程>的辛勤劳作!根据此文,我成功完成了作者的Demo,受溢非浅。 为了更好的保留此文章并让更多的人从中受益,现将原文重新编辑后保存至此处,如有冒犯,请通过留言通知我,我将删除此记录。 谢谢

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

一、准备

下载iReport3.7.1、JasperReport3.7.1、Struts2.1.8及其他需要的包,需导入包如下图:

JasperReport3.7.1下载:http://sourceforge.net/projects/jasperreports/files/jasperreports

iReport3.7.1下载:http://sourceforge.net/projects/ireport/files/iReport

Struts2.1.8下载:http://struts.apache.org/download.cgi

版本不一定要完全按教程下载,我的Demo版本就和上面的完全不同: struts2版本为struts-2.3.4.1.zip+JasperReport4.3.1.另外,上面截图中还缺失一个必不可少的jar包:commons-lang3-3.1.jar

二、整合Struts2+JasperReport3

1. 新建三个pojo类:

三个类分别为: 地址(Address)类、公司(Company)类、职员(Staff)类. 公司与职员是一对多的的关系,所以Company类中拥有Staff对像集合的引用,而Staff类则拥有Company类对像的引用。最终报表,也是通过Staff对像来完成整个数据的填充。另外Company中compareTo方法用于在报表中排序。废话少说,上代码:

Address类:

package com.clinvc.print.bean;

public class Address {
	private String city;

	private String zipcode;

	public String getCity() {
		return city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	public String getZipcode() {
		return zipcode;
	}

	public void setZipcode(String zipcode) {
		this.zipcode = zipcode;
	}
}

Company类:

package com.clinvc.print.bean;

import java.util.HashSet;
import java.util.Set;

public class Company implements Comparable<Company> {
	private String name;

	private Address address;

	private Set<Staff> staffs = new HashSet<Staff>();

	
	public int compareTo(Company o) {
		return o.getName().compareTo(this.getName());
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Address getAddress() {
		return address;
	}

	public void setAddress(Address address) {
		this.address = address;
	}

	public Set<Staff> getStaffs() {
		return staffs;
	}

	public void setStaffs(Set<Staff> staffs) {
		this.staffs = staffs;
	}
}


Staff类:

package com.clinvc.print.bean;

public class Staff {
	private String name;

	private Company company;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Company getCompany() {
		return company;
	}

	public void setCompany(Company company) {
		this.company = company;
	}
}


2. Action类: 我的Action继承了自已写的基类ClActionBase,同鞋们改成ActionSupport。代码如下:

 

package com.clinvc.print.action;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.clinvc.common.ClActionBase;
import com.clinvc.print.bean.Address;
import com.clinvc.print.bean.Company;
import com.clinvc.print.bean.Staff;

public class DemoAction extends ClActionBase {

	public Object getModel() {
		// TODO Auto-generated method stub
		return null;
	}

	private static final long serialVersionUID = -5460323122712890562L;

	private List<Staff> list2;

	private Map<String, Object> map;

	@Override
	public String execute() {
		list2 = getData();
		map = getParameter();
		return SUCCESS;
	}

	private List<Staff> getData() {
		Address address = new Address();
		address.setCity("上海");
		address.setZipcode("201400");
		Company company1 = new Company();
		company1.setName("飞利浦");
		company1.setAddress(address);
		Company company2 = new Company();
		company2.setName("谷歌");
		company2.setAddress(address);
		Staff staff1 = new Staff();
		staff1.setName("张三");
		staff1.setCompany(company1);
		Staff staff2 = new Staff();
		staff2.setName("李四");
		staff2.setCompany(company2);
		Staff staff3 = new Staff();
		staff3.setName("王五");
		staff3.setCompany(company1);
		List<Staff> list = new ArrayList<Staff>();
		list.add(staff1);
		list.add(staff2);
		list.add(staff3);
		return list;
	}

	/**
	 * 与Jaspersoft的$P{REPORT_PARAMETERS_MAP}函数一致,取此KEY为:$P{REPORT_PARAMETERS_MAP}.get("date")
	 * */
	private Map<String, Object> getParameter() {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("date", "2010-03-12");
		return map;
	} 
	// getter, setter 
	public List<Staff> getList2() {
		return list2;
	}

	public void setList2(List<Staff> list2) {
		this.list2 = list2;
	}

	public Map<String, Object> getMap() {
		return map;
	}

	public void setMap(Map<String, Object> map) {
		this.map = map;
	}

}

以上list为提供给报表的数据源,map为提供给报表的参数,如日期范围等。struts.xml配置如下:

<!DOCTYPE struts PUBLIC "    -//Apache Software Foundation//DTD Struts Configuration 2.0//EN"     "http://struts.apache.org/dtds/struts-2.0.dtd" >
		<struts>
			<include file="struts-default.xml"></include><!-- 报表演示 -->
			<package name="default" namespace="/reports"
				extends="struts-default,jasperreports-default">
				<action name="demoReport"
					class="com.xy.report.action.DemoAction">
					<result name="success" type="jasper">
						<param name="location">
							/reports/demoReport.jasper
						</param>
						<param name="dataSource">list</param>
						<param name="format">PDF</param>
						<param name="reportParameters">map</param>
					</result>
				</action>
			</package>
		</struts>

说明一下上面的几个参数:

  • location - 提供利用iReport制作编译好的报表文件。
  • dataSource - 数据源
  • format - 报表输出格式
  • reportParameters - 报表参数
三、利用iReport开发报表

1. 新建数据源

打开iReport,点击下图像插头一样的Report Datasources,弹出对象框中New,选择"JavaBeans set datasource"后Next,输入Name为"demo"后Save,如下两图:

2. 增加类路径

点击“工具”“选项”,选择classpath标签页,点击Add Folder,将项目类路径加入,如下图路径为:C:\Users\linli\Documents\workspace\JSReportDemo \build\classes

3. 新建报表

点击 create a new report

"Open this Template"后,输入报表名这里是demoReport后下一步,继续完成。

 

4. 读取bean属性

点击Preview字样右边的按钮设置数据源,在弹出框中选择"JavaBean Datasource"标签页,在Class name中输入类名,点击"Read attributes"会列出类中所有属性。选中所需的属性,这里是company和name,点击对话框中间的"Add selected field(s)"增加到报表字段中。

报表将会按公司分组,所以需先按公司排序,当然这一步也可对struts2提供的数据源list进行处理,这里使用了报表的Sort功能,所以 Company类必须实现Comparable接口。点击"Sort options...",增加排序字段。

 

5. 增加分组

加击左侧Report Inspector中的demoReport,选择"Add Report Group",在弹出框中输入分组名,选择分组字段,如下图。下一步至完成。

6. 设计报表

将左侧Report Inspector中Fields下刚加入的字段托到报表设计器中,取公司名写成$F{company}.getName(),公司地址为$F{company}.getAddress().getCity(),员工姓名为$F{name}。公司名和公司地址放在Group Header里,员工姓名放在Detail 1里。

增加一个Parameters下的REPORT_PARAMETERS_MAP,他相当于一个map,取从struts2中设置的date值的方法为$P{REPORT_PARAMETERS_MAP}.get("date")。

组件面板中托"Page X of Y"显示页码。

这里有一些Title、Summary之类的,可能不需要,直接托到高度为0了想要就托不出来了。这时在左侧Report Inspector中选中想要的项目,在右侧"属性"中输入Bank height的值就行了。

设计完的报表如下图:

7. 编译报表

点击工具栏上Preview右边榔头一样的东西,将报表编译成.jasper文件。

8. 运行报表

将编译好的demoReport.jasper文件复制到项目WebContent\reports目录下,启动容器,浏览器下查看报表如下:

 

相信同鞋们应该都成功了,如果没成功也别着急,以下是我列出的常见问题,如果还是不能解决就请百度或谷歌:

错误一般都是因为某些包没导入引起的。另外用到Jason同鞋,如果Jason版本太低也会出问题。我使用的版本为:json-lib-2.3-jdk15.jar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值