java如何jasper_java – 如何使用JasperReports与Spring MVC

根据我的研究,我发现了以下使用方法。该方法以最直接的(天真的)方法开始,涉及较少的前端复杂性/配置,并演变成更抽象,但更多依赖于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 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;

}

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

@Autowired @Qualifier("helloWorldReport2")

private JasperReportsPdfView helloReport;

@RequestMapping(value = "helloReport2", method = RequestMethod.GET)

public ModelAndView getRpt2(ModelAndView modelAndView) {

Map parameterMap = new HashMap<>();

parameterMap.put("datasource", new JREmptyDataSource());

modelAndView = new ModelAndView(helloReport, parameterMap);

return modelAndView;

}

请注意,使用JasperReportsPdfView(或更通用的JasperReportsMultiFormatView)需要依赖spring-context-support:

org.springframework

spring-context-support

4.1.3

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

配置一个新的视图解析器,在这种情况下,ResourceBundleViewResolver在InternalResourceViewResolver之前运行。这是基于正在设置的订单值(0在1之前发生):

@Bean

public ResourceBundleViewResolver getResourceBundleViewResolver() {

ResourceBundleViewResolver resolver = new ResourceBundleViewResolver();

resolver.setBasename("jasperreport-views");

resolver.setOrder(0);

return resolver;

}

@Bean

public 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.JasperReportsPdfView

helloReport3.url=classpath:/jasperreports/HelloWorld3.jasper

helloReport3.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);

}

我喜欢这种方法控制器保持“哑”,只处理String值,并且名称映射到视图可以发生在一个位置。

方法4:使用JasperReportsViewResolver

配置一个零排序的JasperReportViewResolver,而诀窍是使用setViewNames来告诉Spring你需要这个解析器来处理哪些逻辑视图名称(否则你最终会出现“无法从类路径资源加载JasperReports报告[jasperreports / index.jasper]”类型错误):

@Bean

public 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;

}

@Bean

public 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;

}

这是我的首选方法。控制器以非常类似的方式解析jasper报告,以使用InternalResourceViewResolver解析jsp视图,因此无需像上述方法#3中的xml或属性文件方法一样的显式映射文件。

编辑

javadocs for JasperReportsPdfView提到它使用不推荐使用的JRExporter API。有没有更好的(较新的)JasperReports视图使用?也许选择JasperReportsMultiFormatView是一个更好的选择,因为它似乎没有使用JRExporter。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值