Spring3 Web MVC 集成Jasper Report生成PDF例子

简介: Spring3 Web MVC 集成Jasper Report生成PDF例子

Spring3 Web MVC 集成JasperReport生成PDF例子


一:环境搭建与配置


1.      安装JDK6以上版本


2.      安装STS, 下载地址如下:http://www.springsource.org/downloads/sts-ggts


3.      下载并安装Tomcat7


4.      创建一个Dynamic Web Project项目,然后选择创建好的项目右键选择


Configuration->convert to Manve Project.


5.      添加web.xml文件,在WEB-INF目录下新建reports, pages, classes三个子目录


6.      新建index.jsp文件在webapp目录下。


7.      最终的项目目录结构如下:

1357399082_9667.png


二:Spring配置详解


在web.xml中配置Spring的DispatchServlet与Context Listener,配置如下:

1357399152_1171.png


在express-servlet.xml中配置spring view解析器

1357399179_3161.png


三:Jasper Report配置详解


在jasper-views.xml添加如下配置

1357399193_4642.png


四:Report内容与数据源


两个报表,演示了子报表的用法,同时还演示了如何想子报表传递数据源,以及参


数传递在报表中显示图像等技巧。需要特别说明的是如果要在报表中使用图像路径


图像必须位于WEB-INF/classes下面,因为JasperReport解析是按找类路径寻找。关


于报表的详细内容建议查看下载以后的源文件,此处不再细说。


五:Controller与注解


Spring3 Controller支持注解(annotation)方式,使用非常方便,生成PDF报表的


Controller代码如下:

package com.gloomyfish.express.controllers;
 
import java.util.HashMap;
import java.util.Map;
 
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JREmptyDataSource;
 
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
 
import com.gloomyfish.report.dao.MockDataFactory;
 
@Controller
public class JasperReportController {
  
  protected static Logger logger = Logger.getLogger("controller");
  
    /**
     * Retrieves the PDF report file
     * 
     * @return
     */
    @RequestMapping(value = "/getpdfReport", method = RequestMethod.GET)
    public ModelAndView doSalesReportPDF(ModelAndView modelAndView) 
     {
    logger.debug("Received request to download PDF report");
    
    // Retrieve our data from a mock data provider
    MockDataFactory dataprovider = new MockDataFactory();
    
    // Assign the datasource to an instance of JRDataSource
    // JRDataSource is the datasource that Jasper understands
    // This is basically a wrapper to Java's collection classes
    JRDataSource categoryData  = dataprovider.getCategoriesData();
 
    // parameterMap is the Model of our application
    Map<String,Object> parameterMap = new HashMap<String,Object>();
    
    // must have the empty data source!!!
    JREmptyDataSource emptyData = new JREmptyDataSource();
    parameterMap.put("datasource", emptyData);
    parameterMap.put("JasperfishSubReportDatasource", categoryData);
    parameterMap.put("JasperfishSummaryInfo", dataprovider.getSummaryInfo());
    
    // pdfReport is the View of our application
    // This is declared inside the /WEB-INF/jasper-views.xml
    modelAndView = new ModelAndView("pdfReport", parameterMap);
    
    // Return the View and the Model combined
    return modelAndView;
  }
}

Mock数据工厂代码如下:

package com.gloomyfish.report.dao;
 
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
 
public class MockDataFactory {
  
  public MockDataFactory()
  {
    System.out.println("create mock up data");
  }
  
  public GloomyFishSummaryInfoBean getSummaryInfo()
  {
    GloomyFishSummaryInfoBean summaryBean = new GloomyFishSummaryInfoBean();
    summaryBean.setBlogURL("http://blog.csdn.net/jia20003");
    summaryBean.setMajorDomain("J2SE, J2EE, WEB developer");
    summaryBean.setName("jia20003");
    summaryBean.setNickName("gloomyfish");
    summaryBean.setRegDate("2003-03-02");
    summaryBean.setWorkYears(8);
    return summaryBean;
  }
  
  public JRDataSource getCategoriesData()
  {
    List<ArticlesCategory> listData = new ArrayList<ArticlesCategory>();
    SimpleDateFormat sdf = new SimpleDateFormat("dd MMM yyyy, hh:mm:ss");
    Date createDte = new Date();
    ArticlesCategory category1 = new ArticlesCategory();
    ArticlesCategory category2 = new ArticlesCategory();
    ArticlesCategory category3 = new ArticlesCategory();
    ArticlesCategory category4 = new ArticlesCategory();
    ArticlesCategory category5 = new ArticlesCategory();
    ArticlesCategory category6 = new ArticlesCategory();
//    ArticlesCategory category7 = new ArticlesCategory();
//    ArticlesCategory category8 = new ArticlesCategory();
//    ArticlesCategory category9 = new ArticlesCategory();
//    ArticlesCategory categoryTen = new ArticlesCategory();
    category1.setCategoryName("Android Development");
    category1.setCount(6);
    category1.setCreateDate(sdf.format(createDte));
    category2.setCategoryName("Swing Desktop Development");
    category2.setCount(21);
    category2.setCreateDate(sdf.format(createDte));
    category3.setCategoryName("JAVA 2D Image Process");
    category3.setCount(56);
    category3.setCreateDate(sdf.format(createDte));
    category4.setCategoryName("J2EE");
    category4.setCount(8);
    category4.setCreateDate(sdf.format(createDte));
    category5.setCategoryName("HTML5");
    category5.setCount(4);
    category5.setCreateDate(sdf.format(createDte));
    category6.setCategoryName("Network Protocols Research");
    category6.setCount(4);
    category6.setCreateDate(sdf.format(createDte));
    category6.setCategoryName("ExtJS Learning");
    category6.setCount(2);
    category6.setCreateDate(sdf.format(createDte));
    listData.add(category1);
    listData.add(category2);
    listData.add(category3);
    listData.add(category4);
    listData.add(category5);
    listData.add(category6);
    JRBeanCollectionDataSource data = new JRBeanCollectionDataSource(listData);
    return data;
  }
 
}

启动运行在浏览器中访问地址为:http://localhost:8080/express/hello.html

六:Deploy与运行


全部代码完成以后,从IDE中运行Maven的clean与install命令,得到war包


将war拷贝到tomcat的webapps下面即可启动tomcat然后从浏览器访问。


点击[Get PDF Report]会自动在新窗口中打开生成的PDF报表文件。


程序运行打开主页面结果如下:

1357399535_2802.png



获取PDF报表在浏览器中打开以后效果如下:

1357399598_4462.png



七:常见问题


1.      必须在applicationContext.xml中导入jasper-views.xml资源否则报表不会被编译


         为jasper文件


2.      Web.xml的servlet名必须与spring的xxx-servlet.xml中的xxx一致


3.      Jasper-views.xml中声明的子报表路径参数与数据参数必须与报表文件jrxml中保


        持一致


4.      报表中field变量名必须与Java Class中的field变量名一一对应。



八:项目文件打包下载,解压缩作为Maven项目导入以后运行clean与 install命令。


下载地址:http://download.csdn.net/detail/jia20003/4963552


转载请注明-2013-01-05

相关文章
|
7月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
前端开发 Java 测试技术
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
本文介绍了 `@RequestParam` 注解的使用方法及其与 `@PathVariable` 的区别。`@RequestParam` 用于从请求中获取参数值(如 GET 请求的 URL 参数或 POST 请求的表单数据),而 `@PathVariable` 用于从 URL 模板中提取参数。文章通过示例代码详细说明了 `@RequestParam` 的常用属性,如 `required` 和 `defaultValue`,并展示了如何用实体类封装大量表单参数以简化处理流程。最后,结合 Postman 测试工具验证了接口的功能。
856 0
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestBody
`@RequestBody` 是 Spring 框架中的注解,用于将 HTTP 请求体中的 JSON 数据自动映射为 Java 对象。例如,前端通过 POST 请求发送包含 `username` 和 `password` 的 JSON 数据,后端可通过带有 `@RequestBody` 注解的方法参数接收并处理。此注解适用于传递复杂对象的场景,简化了数据解析过程。与表单提交不同,它主要用于接收 JSON 格式的实体数据。
1538 0
|
前端开发 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@PathVariable
`@PathVariable` 是 Spring Boot 中用于从 URL 中提取参数的注解,支持 RESTful 风格接口开发。例如,通过 `@GetMapping(&quot;/user/{id}&quot;)` 可以将 URL 中的 `{id}` 参数自动映射到方法参数中。若参数名不一致,可通过 `@PathVariable(&quot;自定义名&quot;)` 指定绑定关系。此外,还支持多参数占位符,如 `/user/{id}/{name}`,分别映射到方法中的多个参数。运行项目后,访问指定 URL 即可验证参数是否正确接收。
905 0
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestMapping
@RequestMapping 是 Spring MVC 中用于请求地址映射的注解,可作用于类或方法上。类级别定义控制器父路径,方法级别进一步指定处理逻辑。常用属性包括 value(请求地址)、method(请求类型,如 GET/POST 等,默认 GET)和 produces(返回内容类型)。例如:`@RequestMapping(value = &quot;/test&quot;, produces = &quot;application/json; charset=UTF-8&quot;)`。此外,针对不同请求方式还有简化注解,如 @GetMapping、@PostMapping 等。
855 0
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RestController
本文主要介绍 Spring Boot 中 MVC 开发常用的几个注解及其使用方式,包括 `@RestController`、`@RequestMapping`、`@PathVariable`、`@RequestParam` 和 `@RequestBody`。其中重点讲解了 `@RestController` 注解的构成与特点:它是 `@Controller` 和 `@ResponseBody` 的结合体,适用于返回 JSON 数据的场景。文章还指出,在需要模板渲染(如 Thymeleaf)而非前后端分离的情况下,应使用 `@Controller` 而非 `@RestController`
577 0
|
10月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
732 0
|
10月前
|
SQL Java 数据库连接
Spring、SpringMVC 与 MyBatis 核心知识点解析
我梳理的这些内容,涵盖了 Spring、SpringMVC 和 MyBatis 的核心知识点。 在 Spring 中,我了解到 IOC 是控制反转,把对象控制权交容器;DI 是依赖注入,有三种实现方式。Bean 有五种作用域,单例 bean 的线程安全问题及自动装配方式也清晰了。事务基于数据库和 AOP,有失效场景和七种传播行为。AOP 是面向切面编程,动态代理有 JDK 和 CGLIB 两种。 SpringMVC 的 11 步执行流程我烂熟于心,还有那些常用注解的用法。 MyBatis 里,#{} 和 ${} 的区别很关键,获取主键、处理字段与属性名不匹配的方法也掌握了。多表查询、动态
315 0
|
10月前
|
JSON 前端开发 Java
第05课:Spring Boot中的MVC支持
第05课:Spring Boot中的MVC支持
412 0
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
910 29

热门文章

最新文章