복붙노트

[SPRING] JasperReports를 Spring MVC와 함께 사용하는 방법?

SPRING

JasperReports를 Spring MVC와 함께 사용하는 방법?

PDF 보고서를 생성하기 위해 JasperReports (6.0.0)와 Spring MVC (4.1.3)의 사용을 조사했습니다. Spring은 JasperReports와 통합하여 PDF를 생성하는 "Spring specific"

나는 온라인에서 좋은 예를 찾고자 애써 왔으며, 나의 발견을 공유하기를 원했다.

"JasperReports를 Spring4와 어떻게 통합 할 수 있습니까?"와 관련된 방법 및 / 또는 개선 사항을 추가하십시오.

해결법

  1. ==============================

    1.내 연구를 기반으로, 다음 사용 방법을 발견했습니다. 이 방법은 덜 정면의 복잡성 / 구성과 관련된 가장 직접적인 (순진한) 접근법으로 시작하여 더 추상적이지만 더 많은 Spring /보다 복잡한 Spring 구성에 대한 의존성을 가지기 위해 진화합니다.

    내 연구를 기반으로, 다음 사용 방법을 발견했습니다. 이 방법은 덜 정면의 복잡성 / 구성과 관련된 가장 직접적인 (순진한) 접근법으로 시작하여 더 추상적이지만 더 많은 Spring /보다 복잡한 Spring 구성에 대한 의존성을 가지기 위해 진화합니다.

    서블릿 출력 스트림에 내용을 작성하기 만하면됩니다.

      @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);
      }
    

    주어진 JasperReportsPdfView 빈 :

    @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<String, Object> parameterMap = new HashMap<>();
      parameterMap.put("datasource", new JREmptyDataSource());
      modelAndView = new ModelAndView(helloReport, parameterMap);
      return modelAndView;
    }
    

    JasperReportsPdfView (또는보다 다양한 JasperReportsMultiFormatView)를 사용하려면 스프링 컨텍스트 지원에 대한 의존성이 필요합니다.

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

    새로운 View Resolver를 설정합니다.이 경우 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 값만 처리하며 뷰의 이름 매핑은 한 곳에서 일어날 수 있습니다.

    Zero-ordered 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 보고서를 Jsp 뷰가 InternalResourceViewResolver를 사용하여 어떻게 해결되는지와 매우 유사한 방식으로 해결하므로 위의 방법 3에서 xml 또는 properties 파일 접근법과 같이 명시 적 매핑 파일이 필요하지 않습니다.

    편집하다

    JasperReportsPdfView에 대한 javadocs는 더 이상 사용되지 않는 JRExporter API를 사용한다고 언급합니다. 사용할 더 나은 (최신) JasperReports 뷰가 있습니까? 아마도 Jrexporter를 사용하지 않는 것으로 보아 JasperReportsMultiFormatView를 선택하는 것이 더 나은 옵션 일 수 있습니다.

  2. from https://stackoverflow.com/questions/27532446/how-to-use-jasperreports-with-spring-mvc by cc-by-sa and MIT license