Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using PrintWriter and OutputStream

I am creating a project with struts and I have a problem using Jasper IReports. I want to export some info into a pdf file and I keep getting the java.lang.IllegalStateException: getOutputStream() has already been call... Exception due to openning a ServletOutputStream in my code when the page already opens a PrintWriter.

The code is in the model (so it is not in the jsp, it's in a java file), as it follows:

    public void handle(HttpServletResponse res, Connection connection, String path)throws Exception{
    ServletOutputStream out = null;
    try {

        JasperDesign jasperDesign = JRXmlLoader.load(path);
        JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
        byte[] bytes = JasperRunManager.runReportToPdf(jasperReport, null, connection);
        res.setContentType("application/pdf");
        res.setContentLength(bytes.length);
        out = res.getOutputStream();
        out.write(bytes, 0, bytes.length);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        out.flush();
        out.close();
    }

I have checked the connection, the path and the HttpServletResponse and are all working fine.

I'm very newbie with Jasper Reports as well as with coding stuff into PDF so you can -correctly- suposse that I have a minimal idea of what I am doing here and that, obviously my code is copy/pasted from somewhere through the net.

I have tried to use PrintWriter instead of OutputStream, transforming bytes into a String and using the PrintWriter.append(String) method (allthought is not String is CharSequence), but it doesn't extract the data into the PDF.

I have also tried to get the PrintWriter, close it to open the OutputStream (didn't work) or flush it (neither).

Any help with a solution to use any out that could show the data in a pdf would be great. Thanks a lot!

like image 289
Random Avatar asked Jan 15 '10 11:01

Random


People also ask

What is difference between PrintWriter and ServletOutputStream?

PrintWriter is a character-stream class whereas ServletOutputStream is a byte-stream class. We can use PrintWriter to write character based information such as character array and String to the response whereas we can use ServletOutputStream to write byte array data to the response.

Is PrintWriter and output stream?

OutputStreams are meant for binary data. Writers (including PrintWriter ) are meant for text data. You may not see the difference in your specific situation as you're calling PrintWriter.

What is difference between Servletouptputstream and PrintWriter?

For writing byte-oriented informations (such as image etc), we use ServletOutputStream class. It is a byte-stream class. On the other hand, PrintWriter class can only be used to write character based informations. It is a character-oriented class.

What is PrintWriter used for?

“PrintWriter is a class used to write any form of data e.g. int, float, double, String or Object in the form of text either on the console or in a file in Java.” For example, you may use the PrintWriter object to log data in a file or print it on the console.


1 Answers

Would be useful to see the stack trace.

You might try running a sanity check first though: Modify that code to simply write a static string (hello world) to the ServletOutputStream and set content type to text/html. As that should work fine:

public void handle(HttpServletResponse res, Connection connection, String path)throws Exception{
ServletOutputStream out = null;
try {
    byte[] bytes = "hello world".getBytes();
    res.setContentType("text/html");
    res.setContentLength(bytes.length);
    out = res.getOutputStream();
    out.write(bytes, 0, bytes.length);
} catch (Exception e) {
    e.printStackTrace();
} finally {
    out.flush();
    out.close();
}

HTH

like image 134
simonlord Avatar answered Sep 20 '22 11:09

simonlord