Controller

Anyframe Web에서 제공하는 Reporting 기능은 기본적으로 JasperReports 기능을 모두 제공하나 Spring MVC와 통합된 형태로 기능이 제공되고 있기 때문에 Spring MVC를 통해서 제공되지 않은 JasperReports 일부 기능이 있다. 이 때 개발자는 뷰 클래스를 확장하거나, Controller 클래스에 부가 작업을 해줘야 하는데 아래 두 경우의 경우 Anyframe Web에서 확장하여 제공하므로 개발자가 추가 작업을 할 필요가 없다.

HTML Reporting

이미지 파일을 html 내에서 디스플레이 해주기 위해서 Spring MVC에서 제공해주는 뷰 클래스를 확장하고, Controller 클래스에 부가 작업을 해줘야 한다.
Spring MVC에서 제공해주는 뷰 클래스를 확장한 것은 Anyframe Web을 통해 제공될 것이므로, 개발자는 신경쓸 필요가 없다.
그러나 Controller 클래스에 부가 작업을 해야 하는 것은 개발자가 개발할 Controller내에 request 정보를 Model 객체 내에 저장시켜주는 작업으로 아래에 보여지는 코드와 같이 작성하도록 한다.
  • JasperReportsMultiFormatView 확장 - renderReport 메소드 내에서 아래와 같이 request로부터 세션 객체를 얻어낸 후, 객체 내 어트리뷰트로 populatedReport 값을 저장한다. 이는 후에 HTML Reporting 시 이미지 파일을 디스플레이하기 위해 필요하다.(내용을 참고만 한다. 실제 개발자가 할 일은 없다.)
    protected void renderReport(JasperPrint populatedReport, Map model,\
    		HttpServletResponse response) throws Exception {
        // Check for request object and set image servlet
    	if (model.containsKey("requestObject")) {
    		HttpServletRequest request = (HttpServletRequest) model
    				.get("requestObject");
    		request.getSession().setAttribute(
    				ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,
    				populatedReport);
    }
  • Controller 추가 작업 - 위에서와 같이 model 객채 내에서 "requestObject" 값을 얻어오기 위해서는 Controller 클래스의 Model 객체에 request 객체를 저장해주는 작업이 필요하다. 사용자 목록 조회 결과 Reporting을 위한 ReportContoller 클래스의 예는 다음과 같다.
    public class ReportController extends MultiActionController {
        public ModelAndView viewReport(HttpServletRequest request,
                                       HttpServletResponse response) 
        throws Exception {
    	... 중략
          Map model = new HashMap();
          model.put("format", format);
          model.put("requestObject", request);
            
          return new ModelAndView("reportView", model);
        }
    }

Excel Reporting

Spring MVC에서 제공하는 뷰클래스를 기본으로 이용하면 Excel 파일 내에 이미지 파일이 보이지 않는다.
이는 Spring MVC에서 JasperReports와 통합하는 과정에 Excel 파일로 Output할 때 POI 라이브러리를 사용하였기 때문이다.

이를 JExcel API를 사용하는 것으로 변경하면 Excel 파일 내에 이미지 파일을 디스플레이하는 기능을 제공할 수 있다. (내용을 참고만 한다. 실제 개발자가 할 일은 없다.)
  • ExtendedJasperReportsJXlsView 클래스 생성 - 기존의 POI 라이브러리를 사용한 Exporter 대신 JExcelAPI를 사용한 Exporter를 사용하는 신규 ExtendedJasperReportsJXlsView 클래스를 생성한다.
    public class ExtendedJasperReportsJXlsView 
    	extends ExtendedAbstractJasperReportsSingleFormatView {
    
    	public ExtendedJasperReportsJXlsView() {
    		setContentType("application/vnd.ms-excel");
    	}
    
    	protected JRExporter createExporter() {
    		return new JExcelApiExporter();
    	}
    	 중략...
    }
  • JasperReportsMultiFormatView 클래스 확장 - 위에서 생성한 뷰 클래스를 사용하기 위해서는 JasperReportsMultiFormatView 클래스에 등록시켜줘야 한다. 아래 소스 코드를 보면 xls 확장자 요청 시 기존의 JasperReportsXlsView 클래스를 사용하지 않고 신규로 작성한 ExtendedJasperReportsJXlsView 클래스를 사용하고 있음을 확인할 수 있다.
    public ExtendedJasperReportsMultiFormatView() {
    	this.formatMappings = new HashMap(4);
    	this.formatMappings.put("csv", ExtendedJasperReportsCsvView.class);
    	this.formatMappings.put("html", ExtendedJasperReportsHtmlView.class);
    	this.formatMappings.put("pdf", ExtendedJasperReportsPdfView.class);
    	// this.formatMappings.put("xls", JasperReportsXlsView.class);
    	this.formatMappings.put("xls", ExtendedJasperReportsJXlsView.class);
    }