在本教程中,我们将学习如何在一个简单的spring mvc web应用中集成jasper报表工具。教程涵盖的技术点有:报表自定义数据源的使用;报表渲染、呈现的配置与实现;ireport报表设计器的使用(报表模板设计)等。
代码下载
以下两种方式任选其一:
1. 在已有的springmvc项目环境中进行配置(要求项目可正常运行、调试);
2. 在eclipse中安装spring的sts工具,然后新建一个spring mvc project(要求已配置好maven环境);
添加必须的jasperreports包依赖:
<!-- ireport jasperreports -->
<dependency>
<groupid>net.sf.jasperreports</groupid>
<artifactid>jasperreports</artifactid>
<version>5.6.0</version>
</dependency>
<groupid>org.codehaus.groovy</groupid>
<artifactid>groovy-all</artifactid>
<version>2.2.2</version>
1、继承jasperreportsmultiformatview类,并重写fillreport()方法,在该方法中增加seturl()实现,这样就可以在controller中指定要使用的报表模板文件了。这样做的好处是,只需要一个jasperreport配置文件,可以在controller中动态的设定报表模板url。
package com.pes_soft.example;
import java.util.map;
import net.sf.jasperreports.engine.jasperprint;
import net.sf.jasperreports.engine.jasperreport;
import org.springframework.web.servlet.view.jasperreports.jasperreportsmultiformatview;
/**
* springmvc + ireport整合 视图处理扩展
* @author 许亮
* @create 2015-11-7 21:38:18
*/
public class applicationireportview extends jasperreportsmultiformatview {
private jasperreport jasperreport;
public applicationireportview() {
super();
}
protected jasperprint fillreport(map<string, object> model) throws exception {
if (model.containskey("url")) {
seturl(string.valueof(model.get("url")));
this.jasperreport = loadreport();
}
return super.fillreport(model);
protected jasperreport getreport() {
return this.jasperreport;
}
2、在/web-inf/jasper/目录下创建报表视图配置文件jasper-defs.xml,并指定解析器类为自定义的视图解析器类:
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
xsi:schemalocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<bean id="ireportview" class="com.pes_soft.example.applicationireportview">
<!-- <property name="url" value="/web-inf/jasper/report2.jasper"/> -->
<property name="reportdatakey" value="jrmaindatasource"/>
</bean>
</beans>
3、jasper报表的渲染需要用到xmlviewresolver视图解析器,这样你的项目中就会存在多个视图解析器。需要注意的是,项目中如果使用了多个视图解析器,则需要设置order的值来区分解析器的使用顺序,order值越小则越靠前。增加xmlviewresolver视图解析器的同时,并指定其要解析的配置文件路径。
那么,需要在/web-inf/spring/appservlet/servlet-context.xml中增加下述配置:
<!-- 注册xmlviewresolver,用于ireport & jasperreports报表生成 -->
<beans:bean id="jasperreportresolver" class="org.springframework.web.servlet.view.xmlviewresolver">
<beans:property name="order">
<beans:value>0</beans:value>
</beans:property>
<beans:property name="location">
<beans:value>web-inf/jasper/jasper-defs.xml</beans:value>
</beans:bean>
1、创建javabeanperson实体类:
package com.pes_soft.example.model;
import java.util.arraylist;
import java.util.list;
* ireport测试bean: person实体类
* @create 2015-1-15 20:32:27
public class javabeanperson {
private string name; // 姓名
private string sex; // 性别
private int age; // 年龄
private string hometown;// 籍贯
private string phone; // 电话号码
public javabeanperson() {}
public javabeanperson(string name, string sex, int age, string hometown, string phone) {
this.name = name;
this.sex = sex;
this.age = age;
this.hometown = hometown;
this.phone = phone;
// 此处省略字段的getter和setter
public static list<javabeanperson> getlist() {
list<javabeanperson> list = new arraylist<javabeanperson>();
list.add(new javabeanperson("lily", "female", 22, "hubei", "10086"));
list.add(new javabeanperson("macro", "male", 33, "beijing", "13800000000"));
list.add(new javabeanperson("andy", "male", 44, "hongkong", "13812345678"));
list.add(new javabeanperson("linder", "female", 28, "guangxi", "18677778888"));
list.add(new javabeanperson("jessie", "female", 26, "gansu", "18219177720"));
return list;
2、使用ireport设计报表模板,并编成.jasper二进制文件,并拷贝至\web-inf\jasper目录下:
3、编写controller方法
* 返回ireport报表视图
* @param model
* @return
@requestmapping(value = "/report", method = requestmethod.get)
public string report(model model) {
// 报表数据源
jrdatasource jrdatasource = new jrbeancollectiondatasource(javabeanperson.getlist());
// 动态指定报表模板url
model.addattribute("url", "/web-inf/jasper/mvcireportexample.jasper");
model.addattribute("format", "pdf"); // 报表格式
model.addattribute("jrmaindatasource", jrdatasource);
return "ireportview"; // 对应jasper-defs.xml中的bean id