Servlet llamando a un archivo .jasper

He tratado de diseñar un reporte en formato pdf para que pueda ser impreso sin complicaciones. Para lo cual he utilizada la herramienta IReport 2.0, Este es muy intuitivo y la logre hacer el reporte que quería. Pero ahora me queda la duda de como colcarlo en una aplicación web.
Pues por lo que se (Me corriges si estoy mal), es que el reporte esta compilado en un archivo .jasper, y se alimenta o se instancia como tal por un archivo .jrxml que es un archivo xml. Pues yo tengo el archivo .jasper y también el .jrxml,
Ahora lo que quiero es usar estos dos archivos en una aplicación web. Que al momento de llamar un servlet, este invoque al archivo .jasper y se genere el reporte. Pero no se como hacerlo. Ni tengo idea, ademas he leído otras fuentes pero esta algo confuso pues empiezan a hablar de ireport, y luego de jasperreport, también de itext, en fin hablan de todo un poco, pero no mucho en concreto. Yo se que todas estas tecnologías van de la mano, pero ahorita necesito concretar mi aplicación web.
Información de IDE
* Eclipse 2.x
* JBoss 3.x
* MySQL 5.x
* J2SDK 1.4
Algo más mientras instalaba el ireport, no se sucito ningún problema, pero al intentar abrirlo se quedaba estancado en la pantalla de inicio y mostraba un mensaje que decía: "Loading GUI ", esto lo solucione instalando el JRE 1.6, y después iniciaba sin ningún problema. Por lo que agradecería alguna información o recomendación si hay algún problema en tener esto (JDK 1.4 y JRE 1.6)

1 respuesta

Respuesta
1
Sobre la compatibildad de ireport con jre 1.6 o versiones anteriores depende de la versión de ireport. Pero en principio yo lo he usado con jre1.5 y jsdk 1.4 y no he tenido problemas.
Sobre lo de instanciar el report .jrxml no deberías tener problema. Para poder hacerlo necesitas tener las librerías de jasperreports en tu aplicación y llamarlo. Yo no lo uso con servlet pero te puedo pasar las librerías que tengo metidas en el programa y la linea de código en la que instancio los reports... (aunque no se si para servlet valdrá lo mismo)
Gracias por la respuesta, he tratado de avanzar un poco. Y ahora tengo el siguiente problema que es un poco más explicito.
Diseño del Servlet
1)Librerías, estas son las librerías que ocupo, usando jasperreports-3.7.1.jar
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperRunManager;
2)Metodo que instancia el .jrxml
try {
       ServletContext sc = getServletConfig().getServletContext();
       String jrxmlPath = "RPT/classic.jrxml";
       String jasperPath = "RPT/classic.jasper";
       InputStream is = sc.getResourceAsStream(jasperPath);
       if (is == null) {
              System.out.print("Veromoas algo por aca, sino se encuentran los archivos");
              String rp = sc.getRealPath(jrxmlPath);
              JasperCompileManager.compileReportToFile(rp);
              is = sc.getResourceAsStream(jasperPath);
        }
        ServletOutputStream sos = response.getOutputStream();
        JasperRunManager.runReportToPdfStream(is, sos, new HashMap(),
        new JREmptyDataSource());
        response.setContentType("application/pdf");
        sos.flush();
        sos.close();
}
catch (JRException e) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        e.printStackTrace(pw);
        response.setContentType("text/plain");
        response.getOutputStream().print(sw.toString());
}
3) El error que tengo y su traza
HTTP ERROR: 500 Lorg/apache/commons/logging/Log;
java.lang.NoClassDefFoundError: Lorg/apache/commons/logging/Log;
    at java.lang.Class.getDeclaredFields0(Native Method)
    at java.lang.Class.privateGetDeclaredFields(Class.java:1514)
    at java.lang.Class.getDeclaredField(Class.java:1206)
    at java.io.ObjectStreamClass.getDeclaredSUID(ObjectStreamClass.java:1474)
    at java.io.ObjectStreamClass.access$400(ObjectStreamClass.java:47)
    at java.io.ObjectStreamClass$3.run(ObjectStreamClass.java:335)
    at java.security.AccessController.doPrivileged(Native Method)
    at net.sf.jasperreports.engine.base.JRBaseReport.readObject(JRBaseReport.java:742)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:194)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:603)
    at net.sf.jasperreports.engine.JasperRunManager.runReportToPdfStream(JasperRunManager.java:370)
Agradeceria mucho tu ayuda, o que me indicaras como lo haces tu, para tratar de implementarlo en mi servlet.
Las librerías que yo tengo adjuntas al proyecto son
Commons-beanutils, commons-collection y commons-logging, jasperreports
? Esto es lo que declaro
JasperReport masterReport = null;
JasperReport subReport = null;
JasperPrint masterPrint = null;
public JRViewer viewer = null;
Así lo genero
masterReport = (JasperReport) JRLoader.loadObject(VariablesEjecucion.rutaListados + "//Procesos//listadoProvincias.jasper");
Map masterParams = new HashMap();
masterParams.put("codigo", condicion.toString());
masterParams.put("ordenamiento", this.ordenamiento);
masterPrint = JasperFillManager.fillReport(masterReport, masterParams, parmConexion);
Así lo muestro
this.viewer = new JRViewer(masterPrintRecibo);
De esta forma lo veo primero por pantalla, pero creo que se puede hacer que se imprima directamente.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas