注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

北漂的小羊

Java编程,开发者,程序员,软件开发,编程,代码。新浪微博号:IT国子监

 
 
 

日志

 
 
关于我

在这里是面向程序员的高品质IT技术学习社区,是程序员学习成长的地方。让我们更好地用技术改变世界。请关注新浪微博号: IT国子监(http://weibo.com/itguozijian)

网易考拉推荐

spring+jasperReport报表实例及异常说明  

2013-02-19 17:49:42|  分类: 报表工具 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、spring+jasperReport 实例


最近要用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>  


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

其中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. }  


这种方法代码很简单,但是有一个问题,就是生成报表时的数据库操作,不在 
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>  


这种方式是通过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. }  


其中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. }  


此时,我们可以在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. }  


通过这种方式,我们可以直接通过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 />  


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


二、异常列表


1.

spring+jasperReport生成PDF格式的报表时报

    java.lang.NoSuchMethodError: com.lowagie.text.pdf.PdfWriter.setRgbTransparencyBlending(Z)V异常

    原因:iText.jar文件过旧,将之改为2.1版就没事了。
2.
java.lang.NoClassDefFoundError: org/codehaus/groovy/control/CompilationFailedException异常
    原因:没有导入 groovy-all.jar 包,导入 groovy-all.jar 包就可以了。
3.

Excle 应用:


java.lang.NoClassDefFoundError: org/apache/poi/hssf/usermodel/HSSFCellStyle

出现上述错误提示加入 poi-3.2-FINAL-20081019.jar

4.

net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font :

pdfFontName   : STSong-Light

pdfEncoding   : UniGB-UCS2-H

isPdfEmbedded : false

出现上述错误提示加入

iTextAsian.jar

5.

java.lang.NoClassDefFoundError: org/apache/commons/digester/Digester

出现上述错误提示加入

commons-digester-1.7.jar   iReport/lib  功能简述:解析 xml 文件;

6.

java.lang.NoClassDefFoundError: org/apache/commons/collections/ArrayStack

出现上述错误提示加入

commons-beanutils-1.7.jar    iReport/lib

 7.

java.lang.NoClassDefFoundError: org/apache/commons/collections/ReferenceMap

出现上述错误提示加入

commons-collections-2.1.jar   iReport/lib

  评论这张
 
阅读(802)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016