栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Spring MVC中使用JasperReports?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Spring MVC中使用JasperReports?

根据我的研究,我发现了以下使用方法。这些方法从最直接的(天真的)方法开始,涉及较少的前期复杂性/配置,并逐渐演变为抽象的方法,但对Spring的依赖性更大/对Spring的配置更加复杂。

方法1:直接在控制器中使用JasperReports API

只需将内容写出到servlet输出流即可。

  @RequestMapping(value = "helloReport1", method = RequestMethod.GET)  @ResponseBody  public void getRpt1(HttpServletResponse response) throws JRException, IOException {    InputStream jasperStream = this.getClass().getResourceAsStream("/jasperreports/HelloWorld1.jasper");    Map<String,Object> params = new HashMap<>();    JasperReport jasperReport = (JasperReport) JRLoader.loadObject(jasperStream);    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, new JREmptyDataSource());    response.setContentType("application/x-pdf");    response.setHeader("Content-disposition", "inline; filename=helloWorldReport.pdf");    final OutputStream outStream = response.getOutputStream();    JasperExportManager.exportReportToPdfStream(jasperPrint, outStream);  }

方法2:将JasperReportPdf视图注入控制器

鉴于JasperReportsPdfView bean:

@Bean @Qualifier("helloWorldReport2")public JasperReportsPdfView getHelloWorldReport() {  JasperReportsPdfView v = new JasperReportsPdfView();  v.setUrl("classpath:jasperreports/HelloWorld2.jasper");  v.setReportDataKey("datasource");  return v;}

该视图可以注入或连接到Controller中以供使用:

@Autowired @Qualifier("helloWorldReport2")private JasperReportsPdfView helloReport;@RequestMapping(value = "helloReport2", method = RequestMethod.GET)public ModelAndView getRpt2(ModelAndView modelAndView) {  Map<String, Object> parameterMap = new HashMap<>();  parameterMap.put("datasource", new JREmptyDataSource());  modelAndView = new ModelAndView(helloReport, parameterMap);  return modelAndView;}

请注意,使用

JasperReportsPdfView
(或更通用
JasperReportsMultiFormatView
)需要依赖spring-
context-support:

<dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-context-support</artifactId>  <version>4.1.3</version></dependency>

方法3:使用XML或ResourceBundle视图解析器将逻辑视图名称映射到JasperReport视图

配置一个新的视图解析器,在这种情况下,

ResourceBundleViewResolver
将在之前运行
InternalResourceViewResolver
。这基于设置的订单值(0发生在1之前):

@Beanpublic ResourceBundleViewResolver getResourceBundleViewResolver() {  ResourceBundleViewResolver resolver = new ResourceBundleViewResolver();  resolver.setbasename("jasperreport-views");  resolver.setOrder(0);  return resolver;}@Beanpublic InternalResourceViewResolver getInternalResourceViewResolver() {  InternalResourceViewResolver resolver = new InternalResourceViewResolver();  resolver.setPrefix("/WEB-INF/views/");  resolver.setSuffix(".jsp");  resolver.setOrder(1);  return resolver;}

然后,在我们的类路径的根目录下,

jasperreport-views.properties
文件可以包含逻辑视图名称,以及与发送JasperReport相关的类和属性值(即url和reportDataKey)的配对:

helloReport3.(class)=org.springframework.web.servlet.view.jasperreports.JasperReportsPdfViewhelloReport3.url=classpath:/jasperreports/HelloWorld3.jasperhelloReport3.reportDataKey=myDataSourceKey

控制器代码如下所示:

@RequestMapping(value = "helloReport3", method = RequestMethod.GET)public ModelAndView getRpt3(ModelMap modelMap, ModelAndView modelAndView) {  modelMap.put("myDataSourceKey", new JREmptyDataSource());  return new ModelAndView("helloReport3", modelMap);}

我喜欢这种方法。控制器保持“哑”状态,仅处理字符串值,名称到视图的映射可以全部发生在一个位置。


方法4:使用JasperReportsViewResolver

配置零序

JasperReportViewResolver
,技巧是
setViewNames
用来告诉Spring您希望此解析器处理的逻辑视图名称(否则,您将得到“无法从类路径资源[jasperreports
/ index.jasper]加载JasperReports报告”类型错误):

@Beanpublic JasperReportsViewResolver getJasperReportsViewResolver() {  JasperReportsViewResolver resolver = new JasperReportsViewResolver();  resolver.setPrefix("classpath:/jasperreports/");  resolver.setSuffix(".jasper");  resolver.setReportDataKey("datasource");  resolver.setViewNames("rpt_*");  resolver.setViewClass(JasperReportsMultiFormatView.class);  resolver.setOrder(0);  return resolver;}@Beanpublic InternalResourceViewResolver getInternalResourceViewResolver() {  InternalResourceViewResolver resolver = new InternalResourceViewResolver();  resolver.setPrefix("/WEB-INF/views/");  resolver.setSuffix(".jsp");  resolver.setOrder(1);  return resolver;}

在控制器内部:

@RequestMapping(value = "helloReport4", method = RequestMethod.GET)public ModelAndView getRpt4(ModelMap modelMap, ModelAndView modelAndView) {  modelMap.put("datasource", getWidgets());  modelMap.put("format", "pdf");  modelAndView = new ModelAndView("rpt_HelloWorld", modelMap);  return modelAndView;}

这是我的首选方法。控制器以与使用jsp视图解析方式非常相似的方式解析jasper报告,

InternalResourceViewResolver
因此,与上述方法3中的xml或properties文件方法一样,不需要显式映射文件。

编辑

提及的Javadocs

JasperReportsPdfView
使用不推荐使用的
JRExporter
API。是否有更好的(较新的)JasperReports视图可以使用?也许选择s
JasperReportsMultiFormatView
是更好的选择,因为它似乎没有使用
JRExporter



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/368236.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号