I am writing to this list after inquiries elsewhere have turned up no
adequate responses.  I hope it is the correct forum for the question, since
I am having trouble on Tomcat whereas I didn't on Resin and need to know how
the Tomcat container handles the HttpServletResponseWrapper.

I have a servlet which needs to write a JSP page's resultant HTML to a file
instead of sending it back to the browser. 

I do this by wrapping the response with HttpServletResponseWrapper, calling
RequestDispatcher and forward on the wrapped response, which runs the JSP
and writes the resultant HTML to a file, then forward control to a
thankyou.html page. 

This works with Resin. However, in Tomcat, when I wrap the response, I
"commit" the original response object and can not forward to a thank you
page. I catch a "java.lang.IllegalStateException: Cannot forward after
response has been committed". In my debug tests, the response is committed
during the RequestDispatchers forward method.

I need to avoid this.  The templates (1 and 2) are all JavaServer Pages
whose output (HTML) is intercepted and written to file by the
MyServletResponse wrapper. How do I do this without "committing" the
response object. I could find no way of duplicating or cloning the object
before passing it to MyServletResponse's constructor.  Nor could I close the
ServletOutputStreams.  Any ideas?  This worked wonderfully on Resin, but not
Tomcat 4.0.1.  I prefer to use Tomcat. 

If this cannot work, I need to know so I can move on.  If there is a better
way to handle it, I'm open to that as well.  Additionally it is ENTIRELY
reasonable to assume that I have implemented the wrapper incorrectly. 

Thank you,
Jay Wright

THE SERVLET CODE: 

            MyServletResponse wrapper1 = new MyServletResponse (response,
"1_content.txt"); 
            MyServletResponse wrapper2 = new MyServletResponse (response,
"2_content.txt"); 

            rd = request.getRequestDispatcher(template1); 
            rd.include(request, wrapper1); 
            wrapper1.close(); 

            rd = request.getRequestDispatcher(template2); 
            rd.include(request, wrapper2 ); 
            wrapper2 .close(); 

request.getRequestDispatcher(getScreenFlowManager().getTemplate(locale)).for
ward(request, response); 

MY WRAPPER CLASS: 

public class MyServletResponse extends HttpServletResponseWrapper { 

    private PrintWriter printWriter; 
    private ServletOutputStream servletOutputStream; 
     
/** 
* Constructor 
*/ 
    public MyServletResponse (HttpServletResponse response, String filename)
throws java.io.IOException { 
   super(response); 
      servletOutputStream = response.getOutputStream(); 
      File file = new File(filename); 
      String fileCreated = file.toString(); 
   printWriter = new PrintWriter(new BufferedWriter(new
FileWriter(fileCreated))); 
    } 

    public ServletOutputStream getOutputStream() throws java.io.IOException
{ 
   return servletOutputStream; 
    } 

    public void setOutputStream(ServletOutputStream sos) throws
java.io.IOException { 
        servletOutputStream = sos; 
    } 

    public PrintWriter getWriter() throws java.io.IOException { 
        return printWriter; 
    } 

    public void close() { 
        this.printWriter.close(); 
    } 
} 

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to