申请中有超过100份报告。我想将它们集成到大型Web应用程序中。
我在这里找到了这个想法:http://jasperreports.sourceforge.net/sample.reference/webapp/index.html。
所以,我想创建一个将返回pdf,html或xlsx格式报告的Servlet。我已经通过一个报告类的示例完成了该操作。而且,我的servlet返回它从参数接收的类型。
但是,我无法实现为每个报告类编写(使用映射等)。 如何通过为不同的报告(不同的类)使用相同的servlet来避免这种情况。在这种情况下 - MyDataExample。
这是:
public class ServletExample extends HttpServlet {
@Override
public void doGet(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, IOException {
MyDataExample masterData = new MyDataExample(new ReportParameters(Long.valueOf(req.getParameter("id")), 2, DatabaseConnection.getConnection(), null));
JasperPrint print = masterData.build();
req.getSession().setAttribute(BaseHttpServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, print);
String outputType = req.getParameter("outputType");
Exporter exporter;
switch (outputType) {
case "html":
try {
PrintWriter out = resp.getWriter();
resp.setContentType("text/html");
req.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, print);
exporter = new HtmlExporter();
exporter.setExporterInput(new SimpleExporterInput(print));
SimpleHtmlExporterOutput output = new SimpleHtmlExporterOutput(out);
output.setImageHandler(new WebHtmlResourceHandler("/reports/image?image={0}"));
exporter.setExporterOutput(output);
exporter.exportReport();
} catch (JRException e) {
e.printStackTrace();
}
break;
case "pdf":
resp.setContentType("application/pdf");
exporter = new JRPdfExporter(DefaultJasperReportsContext.getInstance());
exporter.setExporterInput(new SimpleExporterInput(print));
try (OutputStream outputStreams = resp.getOutputStream()) {
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(outputStreams));
exporter.exportReport();
} catch (JRException e) {
e.printStackTrace();
}
}
break;
case "xlsx":
resp.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
exporter = new JRXlsxExporter(DefaultJasperReportsContext.getInstance());
exporter.setExporterInput(new SimpleExporterInput(print));
try (OutputStream outputStream = resp.getOutputStream()) {
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(outputStream));
SimpleXlsReportConfiguration configuration = new SimpleXlsReportConfiguration();
configuration.setOnePagePerSheet(false);
configuration.setWhitePageBackground(false);
exporter.setConfiguration(configuration);
exporter.exportReport();
} catch (JRException e) {
e.printStackTrace();
}
break;
default:
throw new RuntimeException("Unknown type selected");
}
}
}
答案 0 :(得分:2)
所以,我发现一切都很简单,只需刷新页面,因为您的浏览器可以缓存页面。 因此,您可以通过使用相同参数的不同值来获得不同的实例,例如:
if(req.getParameter("className").equals("A"))
classObject = new A();
else
classObject = new B();
此示例工作正常,您也可以通过使用反射根据其名称创建类示例来自动执行此操作。