最近一段时间spring和spiring mvc在web后端开发的地位如日中天,因此如果使用到了JasperReport,就很可能会考虑集成到spring mvc中来。本文简单介绍下将JasperReport集成到spring mvc中的步骤,希望能给大家提供帮助。
除了系统需要引入的开发包之外,关于JasperReport需要引入的包(版本自定或通过maven引入):
引入相关包之后,我们就可以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>