DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT <http://nagoya.apache.org/bugzilla/show_bug.cgi?id=21440>. ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=21440 <jsp:include> whose target performs a 'forward' does not behave as expected Summary: <jsp:include> whose target performs a 'forward' does not behave as expected Product: Tomcat 4 Version: 4.1.24 Platform: PC OS/Version: Windows NT/2K Status: NEW Severity: Normal Priority: Other Component: Jasper 2 AssignedTo: [EMAIL PROTECTED] ReportedBy: [EMAIL PROTECTED] CC: [EMAIL PROTECTED] It appears that tomcat does not behave properly when a JSP page invokes a <jsp:include> whose target performs a 'forward'. Details below. --- SETUP Foo.html <!-- An HTML page that simply outputs "FOO" --> FOO ForwardServlet.java: /** * A servlet that performs a RequestDispatcher.forward() * to "Foo.html". */ package tsc.servlet; import java.io.IOException; import javax.servlet.*; public class ForwardServlet extends GenericServlet { public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { ServletContext context = getServletContext(); String path="/Foo.html"; RequestDispatcher rd = context.getRequestDispatcher(path); rd.forward(req, res); } } Forward.jsp: <!-- A JSP page that performs a <jsp:forward> to "Foo.html". --> <jsp:forward page="Foo.html"/> --- TestCase 1 With the following example: TestCase1.jsp ------------- ***1*** <jsp:include page="/ForwardServlet"/> ***2*** <% System.out.println("TestCase1.jsp"); %> The expected result is that only "FOO" will be displayed on the resulting page, and "TestCase1.jsp" will be displayed on the console. Here is why: In JSP 5.4, it is stated that: "Inclusion is into the current value of out." ... "An included page only has access to the JspWriter object and it cannot set headers. This precludes invoking methods like setCookie. Attempts to invoke these methods will be ignored. The constraint is equivalent to the one imposed on the include method of the RequestDispatcher class." Although it would not hurt the spec to be a little more specific, the assumption here is that the RequestDispatcher.include() has to be called with a response object whose 'writer' is shared with the "including" page. Given that the target of the 'include' is a servlet that performs a RequestDispather.forward(), the following will happen (as per SRV 8.4): - output data in the response buffer is cleared - response content is sent and committed, and closed. > From the viewpoint of our original TestCase1.jsp page, this therefore means that: - "***1***" is added to the response output - "***1***" gets cleared from the response output - FOO is added to the response output - the response output is closed - '***2***' does not get added to the response output because it has already been closed - The 'System.out()' statement gets executed. If this example is run with Tomcat 4.1.24, the output is: ***1*** FOO and "TestCase1.jsp" is NOT displayed on the console. Not as expected. --- Moreover, with the following example: TestCase2.jsp ------------- ***1*** <jsp:include page="/ForwardServlet"/> ***2*** <% System.out.println("TestCase2-a.jsp"); %> <jsp:include page="/ForwardServlet"/> ***3*** <% System.out.println("TestCase2-b.jsp"); %> The expected result is that "TestCase2-a.jsp" will be displayed on the console and that an IllegalStateException will be thrown. [Exception should be thrown because the response has already been committed with the first forward (via the first include), and a forward cannot be done (via the second include) when a response has already been committed.] If this example is run with Tomcat 4.1.24, the output is: ***1*** FOO nothing is displayed on the console, and no exception is thrown. --- Also, in the above two test cases, if ForwardServlet is replaced by Forward.jsp as the target of the <jsp::include>'s: TestCase1 works as expected TestCase2 FOO "TestCase2-a.jsp" is displayed on the console IllegalStateException is not thrown --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]