[Duda] Reporte con jasper report y java

Iniciado por rush, Abril 14, 2015, 04:40:54 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Abril 14, 2015, 04:40:54 PM Ultima modificación: Mayo 11, 2015, 08:46:55 AM por Expermicid
Que tal, estoy intentando hacer un reporte, pero no he tenido exito, soy nuevo usando esto de jasper report, intente usar itext pero se me hace demasiado complejo, con jasper report creo mi diseño y solo necesito desplegarlo ya sea desde un JSP o desde un servlet, para el despliegue lo tengo de la siguiente manera:


Mis archivos estan de la siguiente manera


y me manda el siguiente error al ejecutar:


No se a que se deba ese error, espero puedan ayudarme.

Saludos
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


Al parecer, el error es porque no le estás pasando la ruta correcta al constructor de File para que cargue el archivo. index.jsp está dentro de WebPages y tu carpeta reportes está dentro de WEB-INF.

Podrías hacer algo como:

Código: java
request.getContextPath()+"/WEB-INF/reportes/PDF.jasper"


La instrucción, request.getContextPath(), te devuelve el context path, y de ahí navegas hacia el destino.

Saludos.

Abril 14, 2015, 05:16:25 PM #2 Ultima modificación: Abril 14, 2015, 05:20:37 PM por rush
Tienes razon en que ese error es sobre la ruta, lo hice como lo pusiste y me manda lo siguiente:

CitarError:java.io.FileNotFoundException: \Jasper-Jasper-context-root\reports\PDF.jasper

lo que pasa es que no se encuentra en la carpeta Jasper-Jasper-Context-root, cuando se ejecuta mi servidor de esa manera cambian las cosas y no se por que, tambien intente hacerlo con

Citarapplication.getRealPath("reports/PDF.jasper")

y a la ruta a la que apunta es esta:

CitarC:\Users\rush\AppData\Roaming\JDeveloper\system11.1.2.1.38.60.81\o.j2ee\drs\Jasper\JasperWebApp.war\reports\PDF.jasper

pero esa tampoco es la ruta, me imagino que JasperWebApp.war es cuando hace el deploy de la aplicacion, la ruta original es esta:

CitarC:\JDeveloper\mywork\Jasper\Jasper\public_html\WEB-INF\report\PDF.jasper

y aunque le pase la ruta original:

CitarFile ReportFile = new File ("C:/JDeveloper/mywork/Jasper/Jasper/public_html/WEB-INF/report/report/PDF.jasper");

me manda lo siguiente

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


Abril 14, 2015, 05:56:22 PM #3 Ultima modificación: Abril 14, 2015, 06:04:03 PM por Gus Garsaky
El problema es que no estás usando una arquitectura correcta en tu aplicación, no estás respetando el patrón MVC.

Es importante seguir las buenas prácticas de programación. Nunca se debe mezclar lógica de negocio con vistas, en aplicaciones web es muy recomendable aplicar el patrón MVC. En éste caso, la capa de acceso a datos (DAO) debe estar aislada del resto de capas (vista y controladores). Solo deben ser llamadas desde el contrador y éste no debe saber cómo funcionan los DAO.

Aplicando MVC, el ejemplo anterior quedaría así:

Código: java
@Override
protectec void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     response.setHeader("Content-Disposition", "inline; filename=\"application.pdf\"");
     response.setContentType("application/pdf");

    String path ="C:\\Users\\Acer\\Documents\\NetBeansProjects\\tu_proyecto\\WebPages\\resources\\reports\\PDF.jrxml";

    try (Connection con = ConnectionUtils.getConnection()) {
        JasperPrint jasperPrint = JasperUtils.buildJasperPrint(path, con);
        // exportamos el archivo
        JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream());
    } catch(JRException e1) {
        e1.printStackTrace();
    } catch(SQLException e2) {
        e2.printStackTrace();
    }
}


Es conveniente que muevas tu folder reportes dentro de un folder resources dentro de WebPages.

Código: java
public class ConnectionUtils {
    private static final String HOST = "jdbc:mysql://localhost:3306/tu_bbdd";
    private static final String USER = "root";
    private static final String PASS = "";
    private static final String DRIVER = "com.mysql.jdbc.Driver";

    public static Connection getConnection() throws SQLException {
        Class.forName(DRIVER);
        return DriverManager.getConnection(HOST, USER, PASS);
    }
}


Código: java
public class JasperUtils {

    public static JasperPrint buildJasperPrint(String path, Connection con) {
        JasperReport jr = JasperCompileManager.compileReport(path);
        JasperPrint jasperPrint = JasperFillManager.fillReport(jr,  null, con);
        return jasperPrint;
    }
}


Edit: Para acceder al PDF, solo basta:

Código: html5
<a href="TuServlet">Ver PDF</a>


Importante es que debes de reemplazar "TuServlet" por la ruta de mapeo que le has especificado:

Código: java
@WebServlet(name="ReportServlet", urlPatterns={"/TuServlet"})
public class ReportServlet extends HttpServlet { ... }



Comentas cómo te fue. Saludos.


PD: ¿Por qué movieron el tema a 'dudas generales'? ¡Éste tema es exclusivamente Java!

Bueno pues antes que nada gracias por responder y tratar de ayudarme, después de tanto intentar y buscar, pues entendí un poco el funcionamiento, al parecer el .JRXML es una plantilla o tu diseño de reporte, el cual necesita ser compilado, para obtener nuestro reporte compilado .JASPER, y para ser desplegado se utiliza jasperprint, al final solo use este fragmento de codigo en un servlet:

Código: php
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setHeader("Content-Disposition", "inline; filename=\"application.pdf\"");
        response.setContentType("application/pdf");
                try{
                Connection conn = null;
                Class.forName("oracle.jdbc.driver.OracleDriver");
                        conn = DriverManager.getConnection("jdbc:oracle:thin:@XXXX", "XXXX", "XXXX");
                    File archivo = new File("C:/JDeveloper/mywork/jreports/jreports/public_html/reports/PDF.jasper");
                    JasperReport reporte = (JasperReport)JRLoader.loadObject(archivo);
                    JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, conn);
                    JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream());
                } catch (ClassNotFoundException e) {
                    System.out.println(e);
        } catch (SQLException e) {
            System.out.println(e);
        } catch (JRException e) {
            System.out.println(e);
        }
    }


y asi fue como se desplego mi diseño, y lo de la buena practica lo tomo en cuenta, solo que lo estaba haciendo asi por pruebas que hacia, pero creo que todo mi esfuerzo por entender el funcionamiento y utilizar jasper report pues no me servira por ahora ya que creo solo es un reporteador que imprime listas de datos, yo ando buscando algo para hacer un formato y pasarle parametros para llegar ese formato y mandarlo a PDF, entonces creo que optare por usar ITEXT :/

Gracias Gus Garsaky
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


Jasper tiene soporte para parámetros, queries y demás cosas; de hecho, Jasper usa internamente iTetx. Checka su documentación.


Saludos.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
y me manda el siguiente error al ejecutar:


No se a que se deba ese error, espero puedan ayudarme.

Saludos

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
El problema es que no estás usando una arquitectura correcta en tu aplicación, no estás respetando el patrón MVC.

Me gusta mucho que ayudas, pero ahí que ser objetivo compa.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

Sí,  tienes razón ~ Yoya ~, no venía al caso, pero igual es bueno que se lo haya comentado para que se vaya familiarizando con MVC (que seguro tocará más adelante Spring, JSF, Trapestry, entre otros).

Saludos.

PD: No sabía que estabas también por acá xD.