Ejemplo de Controller con JasperReports

Un ejemplo de AbstractController que retorna un reporte de JasperReports:

package pe.edu.cibertec.javadeveloper.proyectoweb.web;

import java.sql.Connection;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

/**
 *
 * @author Instructor
 */
public class ReporteController extends AbstractController {

    private DataSource dataSource;

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse res) throws Exception {
        Connection connection = null;
        ServletOutputStream out = null;
        try {
            connection = dataSource.getConnection();
            HttpServletRequestWrapper srw = new HttpServletRequestWrapper(req);
            String path = srw.getRealPath("") + "\\reportes\\clientes.jrxml";
            JasperDesign jasperDesign = JRXmlLoader.load(path);
            JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
            byte[] bytes = JasperRunManager.runReportToPdf(jasperReport, null, connection);
            res.setContentType("application/pdf");
            res.setContentLength(bytes.length);
            out = res.getOutputStream();
            out.write(bytes, 0, bytes.length);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            connection.close();
            out.flush();
            out.close();
        }
        return null;
    }
}