如何将jasperreport集成到spring mvc中并展示报表内容

最近一段时间spring和spiring mvc在web后端开发的地位如日中天,因此如果使用到了JasperReport,就很可能会考虑集成到spring mvc中来。本文简单介绍下将JasperReport集成到spring mvc中的步骤,希望能给大家提供帮助。

除了系统需要引入的开发包之外,关于JasperReport需要引入的包(版本自定或通过maven引入):

jasperreports-6.1.0.jar
iTextAsian.jar
itext-2.1.7.jar

引入相关包之后,我们就可以coding了,本文介绍的是以javabean作为数据源的方式,所以至少我们得先有数据源:

1.创建报表数据源使用到的javabean

package com.yantu.reportform.entity;

import com.yantu.reportform.core.BaseEntity;

public class UserReport extends BaseEntity implements Serializable{
    private static final long serialVersionUID = -6213239684756951292L;
    private String reportname;
    private String today;
    private String remark;
    private String imageUrl;
    private PersonVO userBean;
    private PersonVO familyBean; 
    //...(setter and getter)
}


2.在web.xml中加入JasperReport的图片加载配置信息以及spring mvc的配置

<!-- Jasperreport Config Begin -->
<servlet>
  <servlet-name>JasperImageServlet</servlet-name>
  <servlet-class>net.sf.jasperreports.j2ee.servlets.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>JasperImageServlet</servlet-name>
  <url-pattern>/servlet/image</url-pattern>
</servlet-mapping>
<!-- Jasperreport Config End -->

<!-- Spring MVC Config Begin -->
<servlet>
  <servlet-name>dispatcherServlet</servlet-name>  
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath*:xml/spring-mvc.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>  
</servlet>  
<servlet-mapping>  
  <servlet-name>dispatcherServlet</servlet-name>  
  <!-- 使用rest风格的url -->
  <url-pattern>/</url-pattern>  
</servlet-mapping>  
<!-- Spring MVC Config End -->

<!-- 省略其余配置... -->


3.在classpath:/xml路径下创建spring mvc的配置文件spring-mvc.xml,并在其中添加JasperReport的视图解析器

<bean id="jasperReportResolver" class="org.springframework.web.servlet.view.XmlViewResolver"> 
  <property name="order" value="2"></property>
  <property name="location">
   <value>classpath:/xml/jasper-views.xml</value>
  </property>
</bean>


4.在对应的classpath:/xml路径下添加JasperReport的视图配置文件jasper-views.xml,并添加内容,注意图片URI必须与web.xml中对应,以及编码格式需要选择UTF-8,否则会出现中文乱码问题

<?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.0.xsd">

  <bean id="exporterParametersMap" class="org.springframework.beans.factory.config.MapFactoryBean">
    <property name="sourceMap">
      <map>
        <entry key="net.sf.jasperreports.engine.export.JRHtmlExporterParameter.IMAGES_URI" value="/yantu/servlet/image?image=" />
        <entry key="net.sf.jasperreports.engine.export.JRHtmlExporterParameter.CHARACTER_ENCODING" value="UTF-8" />
      </map>
    </property>
  </bean>  

  <bean id="user" class="org.springframework.web.servlet.view.jasperreports.JasperReportsHtmlView">
    <property name="url" value="/resources/jasper/user.jasper" />
    <property name="reportDataKey" value="userDataSource" />
    <property name="exporterParameters" ref="exporterParametersMap"></property>
  </bean>

</beans>


5.将ireport生成并编译完成的jasper文件拷贝到对应的url下,这里对应的jasper路径是:“/resources/jasper/user.jasper”,需要注意的是在编译之前,user.jrxml中field里的字段名和字段类型必须和javabean中的字段对应,否则无法显示,在确认无误之后再编译生成user.jsaper文件。


6.在对应Controller编辑显示报表方法 

@RequestMapping(value = "/showReport",method = RequestMethod.GET)
public ModelAndView showReport(PersonVO userBean,ModelMap model,HttpServletRequest request,HttpSession session) throws IOException {
    //准备数据源参数
    List<UserReport> reports = new ArrayList<UserReport>(); 
    UserReport report = new UserReport();
    //获取参数
    String reportname = "这是用户报表";
    String remark="这是测试报表的备注内容";
    PersonVO familyBean = null;
    if(StringUtils.hasText(userBean.getFamilyId())){
        familyBean = userService.queryPersonVO(userBean.getFamilyId());
    }
    //装载数据
    report.setReportName(reportname);
    report.setToday(DateUtils.toShortDateString(new Date()));
    report.setRemark(remark);
    report.setImageUrl(ServletUtils.getBasePath(request)+"/user/photo/"+userBean.getId());
    report.setUserBean(userBean);
    report.setFamilyBean(familyBean);
    reports.add(report);
    //JRBeanCollectionDataSource继承JRAbstractBeanDataSource类,而JRAbstractBeanDataSource是一个抽象类它间接的实现了JRDataSource这个接口,
    //JRBeanCollectionDataSource通过构造注入collection类型的参数,这里我们用的是list结构
    JRDataSource jrDataSource = new JRBeanCollectionDataSource(reports);  
    //这里选择html格式,当然也有pdf格式,只是jasperreports对应的解析器不同
    model.addAttribute("format","html");
    //对应配置文件bean的reportDataKey属性
    model.addAttribute("userDataSource",jrDataSource);
    //对应配置文件中bean的name
    return new ModelAndView("user",model);
}

这里我们暂时忽略其中调用到的工具类以及其他外部引用信息。需要注意的是如果格式选用pdf,那么在配置文件里面,报表输出格式就应该改为“org.springframework.web.servlet.view.jasperreports.JasperReportsPdfView”,但对于pdf格式一定要注意中文乱码问题。


7.在jsp页面显示报表内容,这里我们使用到了iframe,需要在jsp中添加以下内容

<div style="text-align:center" class="printStatementDiv">   
 <iframe name="printIframe" frameborder=0 scrolling=no width="640px" height="750px" src="<%=request.getContextPath()%>/user/showReport?id=${userBean.id}"></iframe>
</div>

至此报表已经可以以html的形式展现在浏览器上了,至于导出,在net.sf.jasperreports.engine.export包下有相应的导出工具,如JRPdfExporter,JRHtmlExporter,JExcelApiExporter,JRXmlExporter,JRRtfExporter,使用起来也是非常方便,这里就不再赘述。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值