JasperReport在Spring上的应用

类别:Java 点击:0 评论:0 推荐:

                     
  最近机缘巧合,霉运当头,糊里糊涂答应别人做一个简单的报表,结果是焦头烂额,缺觉少睡。。。。。。只怪以前结合struts、JasperReport做过报表,而最近看了几天Spring,技痒难耐。唉,长叹一声先,然后做点痛定思痛的安慰性的总结(或许我该先去提高智商)。
  嘿嘿,人类总是喜欢炫耀嘛,所以先说我的JasperReport在Spring上应用的方法,其次呢,说一下和普通的web应用的不同(包括struts),最后呢,当然是去补觉了(想看我家丑的朋友,不要太失望啊),吼吼!!
  我们知道,Spring内置了对多种输出格式的支持,如pdf,xls等,而报表通常也要求生产多种格式,那么他们结合,岂不是天造地设、王八绿豆??反正我这么认为。
  由于每种格式的方法差不多,下面我只说pdf的过程。
  开发web应用,当然是先要有个web.xml嘛,这里定义Spring的入口org.springframework.web.servlet.DispatcherServlet
    <servlet>
  <servlet-name>testReport</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <load-on-startup>1</load-on-startup>
  </servlet>
然后设定它处理的范围
 <servlet-mapping>
  <servlet-name>countries</servlet-name>
  <url-pattern>*.htm</url-pattern>
 </servlet-mapping>

 <servlet-mapping>
  <servlet-name>countries</servlet-name>
  <url-pattern>*.pdf</url-pattern>
 </servlet-mapping>

这里的*.pdf是不能少的。如果想先提交到 XXX.htm,然后返回pdf,就会提示下载XXX.htm。
  Spring对pdf的支持是通过AbstractPdfView,用户要继承这个类自己写pdf的内容,但JasperReport已经有生成pdf的功能了,而我们想要的,只是借助它的MVC框架,在需要时,返回给客户想要的pdf页面,所以,我们直接继承AbstractView(下边是一个通用程序具体代码)
 
public class IamPdfView extends AbstractView {

 private Log logger = LogFactory.getLog(this.getClass());

 public IamPdfView() {
  setContentType("application/pdf");
 }

 /*
  * @see org.springframework.web.servlet.view.AbstractView#renderMergedOutputModel(java.util.Map,
  *      javax.servlet.http.HttpServletRequest,
  *      javax.servlet.http.HttpServletResponse)
  */
 protected void renderMergedOutputModel(Map model,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {

  JReportParam jReportParam = (JReportParam)model.get("jReportParam");

  byte[] bytes = null;

  try {
   bytes = JasperRunManager.runReportToPdf(jReportParam
     .getJasperFilePath(), jReportParam.getParameters(),
     jReportParam.getDataSet());
  } catch (JRException e) {
   logger.info("zzzzzzzzzzzzzzzzz!IamPdfView Exception e:" + e);
  }

  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  baos.write(bytes);
  
  response.setContentLength(baos.size());
  response.setContentType(getContentType());
  ServletOutputStream out = response.getOutputStream();
  baos.writeTo(out);
  out.flush();
  out.close();

 }

}
其中 JReportParam 是对报表参数的一个简单封装。
  Spring提供了很多viewResolver,我选用的是org.springframework.web.servlet.view.ResourceBundleViewResolver,因为可以将页面相关信息写作配置文件中,如
  pdfView.class=com.iam.testreport.report.view.IamPdfView
  这样,当 return new ModelAndView("pdfView"...)时,就可以调用com.iam.testreport.report.view.IamPdfView了。
 
  下面说一下和普通的web应用的不同(包括struts),其实就一点,就是Spring比他们多了viewResolver,而它的DEFAULT_CONTENT_TYPE = "text/html; charset=ISO-8859-1";所以我们需要扩展AbstractView或影射报表servlet为 name.pdf(这种方法不用扩展Spring的特有类)。

本文地址:http://com.8s8s.com/it/it12733.htm