viernes, 2 de octubre de 2009

Servlet para el envio de multiples reportes al cliente

Bueno en este post esta relacionado con el anterior en donde se envian los reportes al cliente para imprimirlos en su impresora, bueno pues el codigo que faltaba para la generacion de los reportes de jasper es lo que les voy a poner en este post y es lo siguiente :

/*Este metodo lo invocamos en doPost, doGet o ambos del servlet */
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Connection conection = null;
byte[] bytesReporte = null;
int in = 0;

try {
/*La clase HelpConnection devuelve la conexion jdbc para llenar el reporte*/
conection = HelpConnection.getConnection();

/*Aqui recibo unos ids que sera mi dato para llenar mi reporte,
* en mi caso tengo que llenar varios reportes de acuerdo a los id que recibo
* y de acuerdo a esos ids se generan n reportes */
String [] ids = request.getParameterValues("idusuario");

int numReportes = ids.length ;
/*Estos archivos temporales van a guardar los datos del reporte, lo queria hacer
* en memoria pero hubo algunos problemas. */
File files [] = new File [numReportes];
for(int i = 0; i < files.length; i++){
files[i] = getTempFile(i+"report","tmp");
}

String cs = File.separator;
String path = request.getSession().getServletContext().getRealPath("/");
/*La ruta de mi reporte*/
String rutaReporte = path + "reporte"+ cs + "user.jasper";
//JasperReport reporte = (JasperReport) JRLoader.loadObject(rutaReporte);
FileInputStream fileJasper = null;//new FileInputStream(rutaReporte);
JasperPrint jasperPrint = null;
HashMap paramReport = new HashMap();
JRXmlExporter exporter = new JRXmlExporter();
/*Se llenan los reportes y se guardan en los archivos temporales*/
for (int k = 0; k < numReportes; k++ ){
System.out.println("entro " + k);
fileJasper = new FileInputStream(rutaReporte);
paramReport.put("id", Integer.parseInt(ids[k]));
jasperPrint = JasperFillManager.fillReport(fileJasper, paramReport, conection);
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE, files[k] );
exporter.exportReport();

}

/*y aqui los envio al cliente*/
OutputStream outStream = response.getOutputStream();
DataOutputStream dataOut = new DataOutputStream(outStream);
//envio el numero de archivos a enviar
dataOut.writeInt(numReportes);

FileInputStream fileStrm = null;
BufferedInputStream bufferStrm = null;
byte fileBytes[] = null;
for (int k = 0; k < numReportes; k++ ){
//envio nombre del archivo
dataOut.writeUTF(files[k].getName());
//envio tamño del archivo
dataOut.writeLong(files[k].length());
//abrimos el archivo a enviar
fileStrm = new FileInputStream(files[k]);
bufferStrm = new BufferedInputStream(fileStrm);
//Envia el archivo
while ((in = bufferStrm.read()) != -1){
dataOut.write(in);
}

outStream.flush();
fileStrm.close();
bufferStrm.close();
}
outStream.close();
dataOut.close();
outStream = null;
bufferStrm = null;
fileStrm = null;
dataOut = null;
for(int i = 0; i < files.length; i++){
files[i].delete();
}

} catch (Exception e) {
e.printStackTrace();
} finally {
}
}

El codigo funciona para 1 o n archivos, espero publicar la version del applet para un solo archivo, evidentemente eso es mas facil

Saludos

2 comentarios:

kenia tee dijo...

This happens because Flash sends the data in a GET/POST hybrid format. If the data were being sent using a GET request, the variables would appear in a query string appended to the end of the URL. Flash uses a GET server request, but the Name/Value pairs containing the variables are sent in a second transmission using POST. Although this causes the servlet to trigger the doGet() method, the variables are still available in the server request.

Anónimo dijo...

Amigo podrías publicar las fuentes para ver su funcionamiento ¿?


un saludos gracias.