`

JasperReport与spring集成的三种方式

阅读更多


最近要用JasperReport,试着和spring集成了一下,现总结如下:

spring提供了几种对应JasperReport的view,可以在spring的bean定义文件
中按需要定义好,在spring的controller中对报表数据进行填充,然后返回
ModelAndView就可以了,这样就和spring的MVC集成在一起了。
详细信息可以参看spring包中带的spring reference文档。

我是这么配置的,定义报表的ViewResolver:

Xml代码 复制代码 收藏代码
  1. <bean id="reportViewResolver" class="org.springframework.web.servlet.view.XmlViewResolver">  
  2.     <property name="order" value="1"/>  
  3.     <property name="location" value="/WEB-INF/reports.xml"/>  
  4. </bean>  
<bean id="reportViewResolver" class="org.springframework.web.servlet.view.XmlViewResolver">
	<property name="order" value="1"/>
	<property name="location" value="/WEB-INF/reports.xml"/>
</bean>


spring可以定义多个ViewResolver,对于普通的jsp的view,还需要如下定义一个ViewResolver:
Xml代码 复制代码 收藏代码
  1. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  2. </bean>  
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
</bean>


报表的ViewResolver中引用的reports.xml在后面会说到。

对于报表的数据的填充,我试验了三种方式如下:

1. 直接指定DataSource

可以在View的定义时,直接指定DataSource,这时我们就不需要再获取数据对
报表进行填充,报表会自动从DataSource获取数据库连接,然后通过报表定义
中的SQL语句获取数据。在reports.xml中是这样定义的:
Xml代码 复制代码 收藏代码
  1. <bean id="datasourceCustomerReport" class="org.springframework.web.servlet.view.jasperreports.JasperReportsMultiFormatView">  
  2.     <property name="url" value="/pages/report/report1.jasper" />  
  3.     <property name="jdbcDataSource" ref="dataSource" />  
  4. </bean>  
<bean id="datasourceCustomerReport" class="org.springframework.web.servlet.view.jasperreports.JasperReportsMultiFormatView">
	<property name="url" value="/pages/report/report1.jasper" />
	<property name="jdbcDataSource" ref="dataSource" />
</bean>

其中dataSource就是一般系统中定义的DataSource bean。spring refernce中
报表的ViewResolver用的是ResourceBundleViewResolver,View的定义是在一个
properties文件中完成的,但是我没找到在properties文件中指定jdbcDataSource
属性为一spring的bean(dataSource)的方法,所以用的是xml文件定义的方法。

这时controller的处理非常简单,没有获取数据的处理,代码如下:
Java代码 复制代码 收藏代码
  1. @RequestMapping(value = "/datasourceCustomer", method = RequestMethod.POST)   
  2. public ModelAndView datasourceCustomerReport(HttpServletRequest request) {   
  3.     Map<String, String> model = new HashMap<String, String>();   
  4.        
  5.     //这段代码是按用户操作分别返回pdf和excel格式的报表   
  6.     if (request.getParameter("excel") != null) {   
  7.         model.put("format""xls");   
  8.     } else {   
  9.         model.put("format""pdf");   
  10.     }   
  11.        
  12.     return new ModelAndView("datasourceCustomerReport", model);   
  13. }  
@RequestMapping(value = "/datasourceCustomer", method = RequestMethod.POST)
public ModelAndView datasourceCustomerReport(HttpServletRequest request) {
	Map<String, String> model = new HashMap<String, String>();
	
	//这段代码是按用户操作分别返回pdf和excel格式的报表
	if (request.getParameter("excel") != null) {
		model.put("format", "xls");
	} else {
		model.put("format", "pdf");
	}
	
	return new ModelAndView("datasourceCustomerReport", model);
}


这种方法代码很简单,但是有一个问题,就是生成报表时的数据库操作,不在
spring的事务管理下,所以并不适用需要严格的事务管理的情况。

2. 通过的Hibernate Dao中获取数据

这种方式view的定义只要指定class和url就可以了,reports.xml中的定义如下:
Xml代码 复制代码 收藏代码
  1. <bean id="customerReport" class="org.springframework.web.servlet.view.jasperreports.JasperReportsMultiFormatView">  
  2.     <property name="url" value="/pages/report/report1.jasper" />  
  3. </bean>  
<bean id="customerReport" class="org.springframework.web.servlet.view.jasperreports.JasperReportsMultiFormatView">
	<property name="url" value="/pages/report/report1.jasper" />
</bean>


这种方式是通过Hibernate Dao获取Collection类型的数据,然后保存在给View
的model中,Spring会自动寻找Collection类型的对象作为报表填充的数据。
Controller的代码如下:
Java代码 复制代码 收藏代码
  1. @RequestMapping(value = "/customer", method = RequestMethod.POST)   
  2. public ModelAndView customerReport(HttpServletRequest request) {   
  3.     Map<String, Object> model = new HashMap<String, Object>();   
  4.     List data = reportService.customerReport();   
  5.     model.put("data", data);   
  6.        
  7.     ...   
  8.        
  9.     return new ModelAndView("customerReport", model);   
  10. }  
@RequestMapping(value = "/customer", method = RequestMethod.POST)
public ModelAndView customerReport(HttpServletRequest request) {
	Map<String, Object> model = new HashMap<String, Object>();
	List data = reportService.customerReport();
	model.put("data", data);
	
	...
	
	return new ModelAndView("customerReport", model);
}


其中reportService通过Hibernate Dao获取数据,Dao中代码如下:
Java代码 复制代码 收藏代码
  1. @Override  
  2. public List customerReport() {   
  3.     Session session = sessionFactory.getCurrentSession();   
  4.        
  5.     return session.createCriteria(CustomerBaseInfo.class).list();   
  6. }  
@Override
public List customerReport() {
	Session session = sessionFactory.getCurrentSession();
	
	return session.createCriteria(CustomerBaseInfo.class).list();
}


此时,我们可以在service层定义Transaction,保证了事务管理。

但这种方式也有感觉不好的地方,如果我只是需要某个表的某几个字段,但这种
方法会把所有字段的数据都取出来,这是一种对系统资源的浪费,所以我又试
验了第三种方法:

3. 通过JdbcTemplate Dao获取数据

这种方式View的定义和Controller中的处理没什么变化,Controller中也是通过
service获取数据,但是service是通过一个JdbcTemplate的Dao获取的数据,这个
Dao的代码如下:
Java代码 复制代码 收藏代码
  1. public class ReportDaoImpl implements ReportDao {   
  2.   
  3.     private JdbcTemplate jdbcTemplate;   
  4.   
  5.     public void setDataSource(DataSource dataSource) {   
  6.         this.jdbcTemplate = new JdbcTemplate(dataSource);   
  7.     }   
  8.   
  9.     @Override  
  10.     public List jdbcCustomerReport() {   
  11.         return jdbcTemplate.queryForList("select name, listlaiyuan, yejie from customerbaseinfo");   
  12.     }   
  13. }  
public class ReportDaoImpl implements ReportDao {

	private JdbcTemplate jdbcTemplate;

	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	@Override
	public List jdbcCustomerReport() {
		return jdbcTemplate.queryForList("select name, listlaiyuan, yejie from customerbaseinfo");
	}
}


通过这种方式,我们可以直接通过SQL语句或者存储过程灵活地获取数据,而且
由于HibernateTransactionManager能够检查到DataSource发起的数据库访问,所以
我们可以与系统中的其他Hibernate Dao一起用HibernateTransactionManager来
管理事务。

以上就是我试验的三种方式,三种方式各有侧重,可以根据具体情况选用。

以下附加上事务管理的定义:
Xml代码 复制代码 收藏代码
  1. <bean id="transactionManager"  
  2.     class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  3.     <property name="sessionFactory" ref="sessionFactory" />  
  4. </bean>  
  5.   
  6. <tx:annotation-driven />  
<bean id="transactionManager"
	class="org.springframework.orm.hibernate3.HibernateTransactionManager">
	<property name="sessionFactory" ref="sessionFactory" />
</bean>

<tx:annotation-driven />


以及JdbcTemplate Dao的定义
Xml代码 复制代码 收藏代码
  1. <bean id="reportDao" class="daos.impl.ReportDaoImpl">  
  2.     <property name="dataSource" ref="dataSource" />  
  3. </bean>  
<bean id="reportDao" class="daos.impl.ReportDaoImpl">
	<property name="dataSource" ref="dataSource" />
</bean>


最后,希望各位大侠拍砖,呵呵
分享到:
评论

相关推荐

    jasperReport +spring 的使用

    ### jasperReport与Spring框架集成应用详解 #### 一、jasperReport简介及Spring环境配置 **jasperReport**是一款非常强大的报表工具,它能够基于Java环境生成多种格式的报表,如PDF、HTML、XLS(Excel)、CSV以及...

    springmvc 集成jasperReport.docx

    本文旨在详细介绍如何将Spring MVC框架与JasperReport报表工具进行有效集成的过程,并解决在此过程中可能遇到的问题。JasperReport是一款非常强大的报表生成工具,它支持多种数据源,如JDBC、XML等,并且可以输出PDF...

    springmvc集成jasperreport

    在Spring MVC框架中集成JasperReport,主要是为了利用JasperReport强大的报表生成能力,将数据库中的数据以美观、直观的方式展现出来。以下是对这个过程的详细步骤和知识点的阐述: 1. **配置Servlet映射**: 在`...

    JasperReport集成

    ### JasperReport与Spring集成 #### 一、JasperReport简介 JasperReport是一款开源的报表设计工具,它能够根据输入的数据源(如数据库查询结果、XML文档等)生成丰富的PDF、HTML、XLS等多种格式的报表。由于其高度...

    Struts2与Jasperreport报表结合

    Struts2提供了一种灵活的拦截器机制,可以方便地与其他框架集成。在与JasperReport结合时,通常会创建一个Struts2 Action,这个Action负责接收前端请求,调用业务服务获取报表数据,然后将数据传递给JasperReport...

    spring MVC Web应用中集成Jasper报表工具

    在Spring MVC Web应用程序中集成Jasper报表工具是一个常见的需求,以提供动态生成和展示各种复杂数据的报表。JasperReports是一款强大的开源报表库,能够帮助开发者创建、设计和展示多种格式的报表,如PDF、HTML、...

    JasperReport报表设计总结

    #### 三、JasperReport的集成与部署 在Web应用程序中集成JasperReport通常需要将相关库文件(如JasperReport库、iText库等)添加到项目的`WEB-INF/lib`目录下。例如,对于JasperReport 1.3.3版本,可能需要以下库...

    springboot整合JasperReport实现报表功能

    总的来说,SpringBoot与JasperReport的整合使得报表生成变得简单,它提供了灵活的设计工具和丰富的数据绑定能力,可以帮助开发者快速地实现复杂报表的展示需求。通过学习和掌握这一技术,你可以提升企业应用的报表...

    springmvc框架整合jasperreport和ireport简单易用框架清晰maven

    springmvc框架整合jasperreport和ireport简单易用,框架清晰,maven仓库

    Jasperreport资料

    JasperReport可以轻松地与Spring、Struts、Hibernate等Java框架集成,实现报表功能的无缝整合。此外,JasperServer提供了报表服务器功能,支持在线报表设计、权限管理、定时任务等功能,使得报表的管理和分享更为...

    spring项目jasperReportDemo演示

    本项目"spring项目jasperReportDemo演示"结合了Spring和JasperReport,提供了一个直观的示例,帮助开发者理解如何在Spring应用中集成并使用JasperReport来生成报表。 首先,我们来看`jasperDemo`这个压缩包中的项目...

    springmvc+jasperReport5.6.0

    Spring MVC与Spring框架其他组件无缝集成,如Spring JDBC、Spring ORM,可以方便地进行事务管理、数据访问以及AOP(面向切面编程)。 **JasperReport** JasperReport是用Java编写的一个开源报表库,能够生成PDF、...

    JasperReport实例导入可用

    其强大的报表引擎使得开发者能够灵活地设计和控制报表布局,同时提供了与 Java 应用程序、Web 应用程序和企业级框架(如 Spring)的无缝集成。 2. **项目结构** 在 `JasperReport_Prj` 这个压缩包中,通常包含以下...

    jasperreport 与ireport 的配置与使用

    **JasperReport与IReport配置与使用详解** 在Java开发领域,报表生成是不可或缺的一部分,JasperReport和IReport作为一套强大的开源报表工具,被广泛应用于J2EE项目中。本文将详细介绍JasperReport和IReport的配置...

    jasperreport 教程

    它提供了丰富的图形元素、数据绑定和模板设计功能,可以与各种数据库、Java 应用程序和框架(如 Spring)无缝集成。iReport 是 JasperReport 的设计工具,用于可视化地创建报表模板。 ### 2. JasperReport 设计基础...

    jasperReport详细教程及例子

    4. **集成应用**: 将JasperReport集成到Spring Boot、Struts2等Web框架中,提供报表服务。 ### 5. 进阶特性 - **样式和样式表**: 可以使用CSS样式表自定义报表外观。 - **条件样式**: 根据数据值动态改变单元格的...

    JasperReport+SSH

    【JasperReport+SSH】是一种常见的企业级应用开发框架组合,用于构建强大的数据报告和Web应用程序。这个组合包括了以下几个核心组件: 1. **JasperReport**:JasperReport是一款开源的报表工具,用于设计、生成和...

    jasperReport所需的jar文件

    6. **Spring框架集成**:spring-context-4.x.x.jar、spring-webmvc-4.x.x.jar等Spring框架的依赖库,使得JasperReport能够与SpringMVC无缝集成,方便地在Controller中处理报表请求,以及在Service层进行报表的生成和...

Global site tag (gtag.js) - Google Analytics