Christopher Schultz schrieb am 01.12.2008 um 14:15:31 (-0500): > Michael Ludwig wrote:
Hi Chris, thanks for your reply. Sorry for not getting back earlier. > Is this the filter you wrote in your other thread? Yes. > Maybe you are not printing your output at the right time. Or maybe you > aren't flushing buffers at the right time. See below. > > I can also make the included HTML page display correctly despite > > the filter by resorting to res.getOutputStream() instead of > > res.getWriter() in my servlet code. But it should work either way, > > shouldn't it? > > That is definitely odd. The source code of DefaultServlet, which serves static HTML, explains this behaviour. > > public ServletOutputStream getOutputStream() throws IOException { > > // getResponse().getOutputStream(); > > return this.stream; > > } > > > > public PrintWriter getWriter() throws IOException { > > // getResponse().getWriter(); > > return this.writer; > > } > > > > You see there are calls to the underlying response object, which are > > commented out. When I comment these lines back in, everything works > > fine. No need to flush the buffer before the include, to resort to > > SOS instead of PW, or to JSP instead of HTML. > > Then you should definitely do this ;) Yes, these calls are needed. > > So these calls on the underlying object seem to have something to do > > with the behaviour observed. Can anyone explain what's going on? > > I'll bet that since the response hasn't had the writer/outputstream > choice made, the DefaultServlet makes a random decision. If your > wrapper response has made a different choice, things can get fouled > up. This is the relevant chunk from serveResource() in DefaultServlet (which serves static HTML, among other things): try { ostream = response.getOutputStream(); } catch (IllegalStateException e) { // If it fails, we try to get a Writer instead if we're // trying to serve a text file if ( (contentType == null) || (contentType.startsWith("text")) || (contentType.endsWith("xml")) ) { writer = response.getWriter(); } else { throw e; } } A filter intercepting the response and deviating it in its own buffers has to make sure the call to getOutputStream() fails when it has already issued a PrintWriter. Michael Ludwig --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org