servlets thread: RE: GURUS: How to write output buffered in response o- bject, to a fil e...
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");
}
}
======================================================================