Jasperreports 5.0.4与Spring MVC 3

来源:互联网 发布:美女网络直播间 编辑:程序博客网 时间:2024/05/29 05:53
因项目需要,研究了下Jasperreports 5.0.4与Spring MVC 3的集成方法。在查资料的时候网上有个类似的集成方案,但是并非最新版本,而且他的代码居然都是写在JSP上的,都用Spring mvc了,还写在jsp上,太扯淡(Spring本身提供了对jasperreports的支持)。

    以下为spring mvc原先的视图解析器配置:


1<bean
2    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
3    <propertyname="order"value="1"/>
4    <propertyname="prefix"value="/jsp/"/>
5    <propertyname="suffix"value=".jsp"/>
6</bean>

    在此基础上添加jasperreports视图解析器的配置信息:


01<beanid="jasperReportsViewResolver"class="org.springframework.web.servlet.view.jasperreports.JasperReportsViewResolver">
02    <propertyname="order"value="0"/>   <!-- 视图渲染优先级,此处为0,优先于渲染JSP -->
03    <propertyname="viewClass"value="me.digdata.report.view.DigDataJasperReportsView"/><!-- 自定义视图渲染类,继承于JasperReportsMultiFormatView -->
04    <propertyname="prefix"value="/WEB-INF/classes/report/"/>   <!-- 报表模板路径 -->
05    <propertyname="suffix"value=".jasper"/><!-- 模板后缀 -->
06    <propertyname="viewNames"value="*-report"/><!-- 试图渲染所有以"-report"结尾的视图名(viewName) -->
07    <propertyname="cache"value="true"/><!-- 缓存模板(false时,每次请求都会重新加载模板,建议debug模板时设置为false) -->
08    <propertyname="jdbcDataSource"ref="dataSource"/>   <!-- 指定数据源 -->
09    <propertyname="exporterParameters"<!-- 渲染时的相关参数 -->
10        <map>
11            <entrykey="net.sf.jasperreports.engine.export.JRHtmlExporterParameter.IMAGES_URI"value="images/"/> <!-- HTML时的白色背景图片(px)路径 -->
12            <entrykey="net.sf.jasperreports.engine.export.JRHtmlExporterParameter.CHARACTER_ENCODING"value="UTF-8"/>
13        </map>
14    </property>
15</bean>

    其中,me.digdata.report.view.DigDataJasperReportsView代码如下:


01public classDigDataJasperReportsView extendsJasperReportsMultiFormatView {
02    publicstatic final String ATTACHEMT_FILE_NAME_KEY = "attachmentFileName"//格式不为html时的下载文件名
03     
04    @Override
05    protectedvoid renderReport(JasperPrint populatedReport,
06            Map<String, Object> model, HttpServletResponse response)
07            throwsException {
08        // TODO Auto-generated method stub
09        Object format = model.get(DEFAULT_FORMAT_KEY);
10        if(format==null){
11            thrownew IllegalArgumentException("model中未找到指定的输出格式(format:html、pdf、xls、csv)");
12        }
13        if(!format.equals("html")){
14            Object attachmentFileName = model.get(ATTACHEMT_FILE_NAME_KEY);
15            if(attachmentFileName==null){
16                thrownew IllegalArgumentException("model中未指定输出文件名(attachmentFileName)");
17            }
18            Properties contentDispositionMappings = getContentDispositionMappings();
19            contentDispositionMappings.put(format.toString(),"attachment; filename="+attachmentFileName+"."+format);
20        }
21        super.renderReport(populatedReport, model, response);
22    }
23}

    于是,可像正常的调用Controller里的方法一样,实现HTML、PDF、EXCEL、CSV等报表功能,类似代码如下(Controller里的某个方法):


01/**
02 * 显示html、下载pdf、xls、cvs等报表<br>
03 * 请求链接必须带有reportName参数,用以指定模板名<br>
04 * 请求链接必须带有format参数,用以指定生成的格式(html、pdf、xls、csv)
05 * @param reportEntity 报表相关参数
06 * @param format
07 * @return
08 */
09@RequestMapping(value ="/show_report.html")
10public ModelAndView showReport(ReportEntity reportEntity){
11    ModelAndView mv =new ModelAndView();
12    Date now =new Date();
13    mv.setViewName(reportEntity.getReportName());  //要调用的jasperreports的模板文件名(不包括后缀),该文件名必须以-report结尾
14    mv.addObject(DigDataJasperReportsView.DEFAULT_FORMAT_KEY, reportEntity.getFormat());   //显示格式:html、pdf、xls、csv
15    mv.addObject(DigDataJasperReportsView.ATTACHEMT_FILE_NAME_KEY, Tools.date2Str(now,"yyyyMMddHHmmss"));//当为pdf、xls、csv时的附件名
16    Map<String,Object> params = convertParams(reportEntity);
17    mv.addAllObjects(params);
18    returnmv;
19}

    其中,ReportEntity代码如下:


01public classReportEntity {
02    privateString reportName;  //要调用的jasperreports的模板文件名(不包括后缀),该文件名必须以-report结尾
03    privateString format;  //显示格式:html、pdf、xls、csv
04    publicString getReportName() {
05        returnreportName;
06    }
07    publicvoid setReportName(String reportName) {
08        this.reportName = reportName;
09    }
10    publicString getFormat() {
11        returnformat;
12    }
13    publicvoid setFormat(String format) {
14        this.format = format;
15    }
16}

    放上基于maven构建的项目demo源码:下载链接

    为解决中文字体在PDF不显示问题,需要将源码包中的iTextAsian-1.0.jar安装到本地maven仓库中,maven命令如下:mvn install:install-file -Dfile=iTextAsian-1.0.jar -DgroupId=com.lowagie.text -DartifactId=iTextAsian -Dversion=1.0 -Dpackaging=jar

    由于本demo采用了h2数据库,所有项目启动正常后,请在地址栏输入:http://localhost:8080/report/console,其中,JDBC URL:一栏输入jdbc:h2:~/report,点连接后,将源码包下的src\main\resources\schema.sql demo数据导入进去。

    运行demo效果如下:report20130424141600.jpg