2016-07-09 2 views
0

В приложении более 100 отчетов. Я хотел бы интегрировать их в большое веб-приложение.Отчеты о выходе сервлетов JasperReports

Я нашел эту идею здесь: http://jasperreports.sourceforge.net/sample.reference/webapp/index.html.

Итак, я хотел бы создать Servlet, который вернет форматы отчетов в формате pdf, html или xlsx. Я уже сделал это на примере для один Класс отчета. Кроме того, мой сервлет возвращает тип, который он получает из параметра.

Однако я не могу понять, как писать (с отображением и т. Д.) Для каждого класса отчетов. Как я могу избежать этого, используя те же сервлеты для разных отчетов (разные классы). В этом случае - 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

как насчет использования другого параметра для класса отчета? – Wilson

+0

@wilson вы могли бы привести пример? Я попытался, если (req.getParameter («class»). Равен ... затем один экземпляр() else another(). Но это не сработает. Если работа была выполнена правильно, но вывод был первым знаком для всех остальных – quento

ответ

2

Итак, я обнаружил, что все было легко, просто обновите страницу, так как ваш браузер может кэшировать страницу. Таким образом, вы можете получить различные экземпляры, используя разные значения одного и того же параметра, например:

if(req.getParameter("className").equals("A")) 
    classObject = new A(); 
    else 
    classObject = new B(); 

Этот пример работает отлично, и вы можете автоматизировать эти действия, создавая пример класса в соответствии с его именем, используя отражение.

Смежные вопросы