最近机缘巧合,霉运当头,糊里糊涂答应别人做一个简单的报表,结果是焦头烂额,缺觉少睡。。。。。。只怪以前结合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的特有类)。  
 
  |