Wrox Home  
Search P2P Archive for: Go

  Return to Index  

servlets thread: RE: GURUS: How to write output buffered in response o- bject, to a fil e...


Message #1 by "Ricardo Garcia" <ricardo.garcia@h...> on Thu, 20 Feb 2003 16:26:53
Jay,

Here is an implementation of Richard's suggestion.

Hope it helps.

Ricardo Garcia
Ricardo.Garcia@h...

======================================================================

My servlet produces the JSP output via forwards. I created a method to 
handle the servlet forwards where I want to capture the JSP output.

======================================================================
private void forwardTo(String url, HttpServletRequest request, 
HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException
    {
        RequestDispatcher rqd = request.getRequestDispatcher(url);

        //this response will capture the result of the forward
        MyHttpServletResponseWrapper myResponse = new 
MyHttpServletResponseWrapper(response);
        myResponse.setOutputFile(_appFSPath + File.separator + 
latestPageServedLoc);

        rqd.forward(request,myResponse);
    }

======================================================================
I created the class MyHttpServletResponseWrapper, which intercepts the 
forwarded JSP method calls to the response object related to getting the 
writer (for output) and submitting the response to the client.
======================================================================

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

/**
 *
 * @author  rigarc
 *
 * Wrapper class to capture the pages generated by this servlet and 
associated JSP's
 *
 */
public class MyHttpServletResponseWrapper extends 
javax.servlet.http.HttpServletResponseWrapper {

    MyWriterWrapper _writerWrapper;
    String _outputFile;
    
    /** Creates a new instance of MyHttpServletResponseWrapper */
    public MyHttpServletResponseWrapper(HttpServletResponse response)
        throws java.lang.IllegalArgumentException
    {
//I need to create a wrapper around the response in order to capture the 
contents of the outputbuffer
        super(response);
        System.out.println("\n\tMyHttpServletResponseWrapper(): called");
        System.out.println("response is instance of " + response.getClass
());
    }

    public void setOutputFile(String outputFile){
        _outputFile = outputFile;
    }
    
    public ServletOutputStream getOutputStream()
        throws java.io.IOException
    {
        System.out.println
("\n\tMyHttpServletResponseWrapper.getOutputStream(): called");
        return super.getOutputStream();
    }

    public PrintWriter getWriter() throws IOException {
        System.out.println("\n\tMyHttpServletResponseWrapper.getWriter(): 
called");
        _writerWrapper = new MyWriterWrapper(super.getWriter());
        return _writerWrapper;
        //return super.getWriter();
    }
    
    public void flushBuffer()
        throws java.io.IOException
    {
        System.out.println("\n\tMyHttpServletResponseWrapper.flushBuffer
(): called");
        super.flushBuffer();

        writeResponseTextToFile();
    }
    
    /**
     * Writes the text of the response to a given file
     */
    private void writeResponseTextToFile(){
        try{
            if (this._outputFile != null){
                FileWriter fw = new FileWriter(_outputFile);
                fw.write(this._writerWrapper.getOutputStringBuffer
().toString());
                fw.close();
            }
        }
        catch (IOException ioe){
            ioe.printStackTrace();
        }
    }
}

======================================================================
I created the class MyWriterWrapper, which intercepts the forwarded JSP 
method calls to write the output to the client. This info is stored in a 
StringBuffer object. And can be retrieved later on for storing.
======================================================================

import java.io.*;

public class MyWriterWrapper extends java.io.PrintWriter {
    
    java.io.PrintWriter _printWriter;

    StringBuffer _outputBuffer;

    public MyWriterWrapper(Writer out) {
        super(out);
        if (out instanceof PrintWriter){
            System.out.println("MyWriterWrapper: _printWriter has been 
initiated");
            _printWriter = (PrintWriter)out;
            _outputBuffer = new StringBuffer();
        }
    }

    public void write(char[] buf, int off, int len) {
        super.write(buf,off,len);
        _outputBuffer.append(buf,off,len);
        System.out.println("\twriter 3");
    }
}
======================================================================

  Return to Index