I thought I should not be the only one with this issue, but I searched the tomcat-user 
and tomcat-dev mailing lists and could not find a good answer. There are some changes 
made between tomcat4.0.4 and tomcat4.1.18 and I can see the exact discussions on the 
tomcat-dev list (under the thread "Costin: reverted the fix"), but I did not see an 
answer to as how this should work. Forgive me if I missed some obvious answers. Here 
is my issue
 
I have a Servlet 2.3 filter that encodes all jsp output. It works fine in tomcat 4.0.4 
and not any more if I move to tomcat 4.1.18 (I did not try earlier 4.1.x versions 
though, I tried 4.1.29 and the problem remains). My filter does this in a very typical 
way:
 
* before calling filterchain.doFilter it creates a response wrapper
* the response wrapper will return a outpustream/writer wrapper for wrapped 
servlet/jsp to use
* after filterchain.doFilter returns, the filter gets data out and do the encoding. 
then it writes the encoded data to the 'real' response (the response passed to it)
 
The problem is the implementation of PageContextImpl.release() has changed. Previously 
it will call flush() but now it calls flushBuffer(). the latter does not flush data to 
my OutputStream/Writer wrapper so when the filterchain.doFilter returns from the jsp 
service, I could not get the result of the jsp. I could not get handle of the 
JspWriter that was used in the jsp page to force a flush since that is not in my 
scope. 
 
I could surely add a 
 
out.flush() 
 
in every jsp i wrote, but that seems too ugly to me, and it does not feel quite right 
either.
 
Here is the comment put into PageContextImp.release()
 
"
                // Do not flush the buffer even if we're not included (i.e.
                // we are the main page. The servlet will flush it and close
                // the stream.
"
 
However, since my fitler don't reference the jsp servlet I don't see how I could force 
the flush and close the stream. I see a followup email talking about 
 
* automatically generating out.flush at the end of the java code for a jsp
* implement a partial flush
 
And I could not see anything following up that.
 
I read the Sun servlet spec, and I could not see a clear definition on this. It seems 
with the wrapper, the sense of 'commit' is not what it meant to be previously: in this 
case, I do want the data to be flushed (committed) but it has nothing to do with 
flushing data to the end user.
 
I tried some popular CompressionFilter implementations and they fail on tomcat4.1.18 
for the same reasons. So what is the recommendation?
 
Thanks a lot
 
Vincent


---------------------------------
Do you Yahoo!?
Free Pop-Up Blocker - Get it now

Reply via email to