O Baioni perguntou como se faz para gerar um report do Jasper e enviar pelo servlet.
Aqui tá o código que eu fiz já faz um tempo pra fazer isso, sem os métodos auxiliares.
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException
{
try {
String rootDir = getServletContext().getRealPath("/reports");
Map parameters = loadParameters(request);
// needed for subreports:
parameters.put("rootDir", rootDir);
String reportFilename = rootDir + File.separator + request.getParameter("report_file");
File reportFile = new File(reportFilename);
log("Using file "" + reportFilename + ""...");
if (!reportFile.exists()) {
showFileNotFound(parameters, response);
return;
}
Connection conn = (Connection) request.getSession().getAttribute("conn");
if (conn == null) {
showNotConnected(parameters, response);
return;
}
log("Connected to the database");
byte[] buffer = JasperRunManager.runReportToPdf(
reportFilename,
parameters,
conn
);
log("report generated, sending to user");
response.setContentType("application/pdf");
response.setContentLength(buffer.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(buffer, 0, buffer.length);
ouputStream.flush();
ouputStream.close();
}
catch (Exception e) {
log("Caught exception", e);
String webmaster = getServletContext().getInitParameter("webmaster");
if (webmaster != null) {
Mailer.errorMail(e, webmaster);
}
throw new ServletException(e);
}
As partes importantes são a que gera o report e a que envia o conteúdo pela web:
byte[] buffer = JasperRunManager.runReportToPdf(
reportFilename,
parameters,
conn
);
Aqui os parâmetros são o nome do report, que eu construí a partir de algumas coisas pré-definidas da aplicação, um Map com os parâmetros do report (aqueles definidos no XML. Vc precisa respeitar nome da chave e classe do valor) e, nesse caso, uma conexão com o BD. Existem outros métodos com o mesmo nome e outros parâmetros nessa classe, vc pode verificar.
response.setContentType("application/pdf");
response.setContentLength(buffer.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(buffer, 0, buffer.length);
ouputStream.flush();
O content-type é bastante importante pro usuário, pq senão ele pode ver só umas sujeiras na tela. Escreva o buffer e envie… : )
[]s