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

来源:互联网 发布:天安号事件 知乎 编辑:程序博客网 时间:2024/06/06 01:04

最近一段时间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,使用起来也是非常方便,这里就不再赘述。
2 0
原创粉丝点击