How to show a report of JasperReport (ireport) in a pdf JSP JAVA

0

You will see I have a problem, I must from a button in a jsp, send to call a report that I made in jasperreport above and be displayed in a pdf window to the user.

When you click on the button, you must send a signal to the servlet and servlet to decide if it shows the report to the user, then return the response to the jsp and show the user the report, but nevertheless, I can not make it show ... please help ... my code goes like this:

FORM AND JSP BUTTON:

  <!-- este es mi form que se conecta con el servlet Direccion1-->
 <form name="FormReporte" action="Direccion1" method="POST">
        <p style="color:#ffffff">

            Generar Reporte de Pacientes: <br><input type="submit" name="btnreportes" value="GENERAR" class="button1"/>
 <!-- este de acá es mi boton que al darle envía la informacion al servlet-->
        </p>
    </form>

ON THE SERVLET: I practically only validate if a String value is returned, return an answer:

 //si el boton se pulsa
         } else if (request.getParameter("btnreportes")!=null){
           String respuesta = request.getParameter("btnreportes");//obtiene el value del boton

           request.setAttribute("resreporte",respuesta);//lo coloca en resreporte
         rd=request.getRequestDispatcher("medpacientes.jsp");//manda la respuesta al jsp
         rd.forward(request, response); //termina la instruccion de envio
 }

Returned in the jsp (where the button was):

  <%
      if(request.getAttribute("resreporte")!=null)//si la respuesta del servlet es diferente de vacía
      {
          //creo mi reporte al usuario, pero es lo que no me deja, siempre me tira error http 500 server

            File reportfile = new File(application.getRealPath("RPacientes.jasper"));
            Map parameter = new HashMap();

            byte[] bytes = JasperRunManager.runReportToPdf(reportfile.getPath(),parameter, con);

            response.setContentType("application/pdf");
            response.setContentLength(bytes.length);
            ServletOutputStream outputstream = response.getOutputStream();
            outputstream.write(bytes,0, bytes.length);
            outputstream.flush();
            outputstream.close();


      }
  %>

Please ask for your help if something is wrong, in advance Thank you!

Edited:

I have moved this to the servlet but application.getRealPath gives error.

 File reportfile = new File(application.getRealPath("RPacientes.jasper"));
            Map parameter = new HashMap();

            byte[] bytes = JasperRunManager.runReportToPdf(reportfile.getPath(), parameter, con);

            response.setContentType("application/pdf");
            response.setContentLength(bytes.length);
            ServletOutputStream outputstream = response.getOutputStream();
            outputstream.write(bytes, 0, bytes.length);
            outputstream.flush();
            outputstream.close();
            return;

I have the following libraries set:

 import java.io.IOException;
 import java.io.PrintWriter;
 import java.sql.SQLException;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import net.sf.jasperreports.engine.JRException;
 import java.util.*;
 import java.io.*;
 import javax.servlet.ServletOutputStream;
 import net.sf.jasperreports.engine.*;
 import net.sf.jasperreports.view.JasperViewer;
 import javax.servlet.ServletResponse;
 import java.sql.Connection; 
 import java.sql.DriverManager;
 import java.sql.SQLException;
 import javax.swing.JInternalFrame;
 import net.sf.jasperreports.engine.JRException;
 import net.sf.jasperreports.engine.JasperFillManager;
 import net.sf.jasperreports.engine.JasperPrint;
 import net.sf.jasperreports.engine.JasperReport;
 import net.sf.jasperreports.engine.util.JRLoader;
 import net.sf.jasperreports.view.JasperViewer;
 import javax.servlet.ServletContext;

APART I must clarify the order where I have located the files will see:

EDITED 3:

THIS PASSES WHEN I GIVE THE BUTTON TO GENERATE A REPORT, WHEN I HAVE THE CODE IN THE SERVLET

    
asked by Kenny99A 26.10.2018 в 09:13
source

1 answer

1

It would be simpler to do it directly in the Servlet. I mean, something like this:

            // si el boton se pulsa
        } else if (request.getParameter("btnreportes") != null) {
//          String respuesta = request.getParameter("btnreportes");// obtiene el value del boton
//          request.setAttribute("resreporte", respuesta);// lo coloca en resreporte
//          rd = request.getRequestDispatcher("medpacientes.jsp");// manda la respuesta al jsp
//          rd.forward(request, response); // termina la instruccion de envio

            File reportfile = new File(application.getRealPath("RPacientes.jasper"));
            Map parameter = new HashMap();

            byte[] bytes = JasperRunManager.runReportToPdf(reportfile.getPath(), parameter, con);

            response.setContentType("application/pdf");
            response.setContentLength(bytes.length);
            ServletOutputStream outputstream = response.getOutputStream();
            outputstream.write(bytes, 0, bytes.length);
            outputstream.flush();
            outputstream.close();
            return;
        }
    }

In this case you should not invoke rd.forward(request, response); if you do not return directly to the view with return .

Try this and tell us.

    
answered by 26.10.2018 в 09:22