I have attached patches for two files which I believe fixes the problem I have described below. These are patches to the files from HEAD which would not address Tomcat 4.x but could be applied to the TOMCAT_4 branch also.
Basically, the change I have made is to pass the application variable from the compiled JSP to the JspRuntimeLibrary.include(...) method and use it, if not null, to obtain a RequestDispatcher, otherwise use the request as before. -----Original Message----- From: Holtfreter, Gregory Sent: Tuesday, November 04, 2003 1:03 PM To: [EMAIL PROTECTED] Subject: jsp:include bug in 4.1.27 I am currently porting webapps to Tomcat(4.1.27) from WL and believe I may have found a bug with the implementation of the jsp:include action tag. The problem I found is that when using the jsp:include tag in a page which resides in a context which differs from the request's initial context the page being included is not found. (The crossContext attribute of the Context element has been set to true.) An example may better explain this: WebappOne one.jsp source: WebappOne/one.jsp<br> <% config.getServletContext().getContext("/WebappTwo").getRequestDispatcher("/two.jsp").include(request,response); %> WebappTwo two.jsp source: WebappTwo/two.jsp<br> <jsp:include page="/three.jsp" flush="true"/> three.jsp source: WebappTwo/three.jsp The text inside of WebappTwo/three.jsp will not be included in WebappTwo/two.jsp output when requesting WebappOne/one.jsp. However, if we move WebappTwo/three.jsp to WebappOne the output is included in the output of WebappTwo/two.jsp. I think that the cause of this is that JspRuntimeLibrary.include(...) uses the request to obtain a RequestDispatcher and the request is pointing to the initial context: RequestDispatcher rd = request.getRequestDispatcher(resourcePath); rd.include(request, new ServletResponseWrapperInclude(response, out)); The JSP 1.2 spec seems to say that jsp:include should be relative to the current page: "A <jsp:include .../> element provides for the inclusion of static and dynamic resources in the same context as the current page." Thanks, Greg Holtfreter Software Engineer Encyclopaedia Britannica --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
Index: jasper2/src/share/org/apache/jasper/compiler/Generator.java =================================================================== RCS file: /home/cvspublic/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v retrieving revision 1.214 diff -u -r1.214 Generator.java --- jasper2/src/share/org/apache/jasper/compiler/Generator.java 20 Oct 2003 21:07:46 -0000 1.214 +++ jasper2/src/share/org/apache/jasper/compiler/Generator.java 5 Nov 2003 17:35:59 -0000 @@ -934,7 +934,7 @@ } out.printin( - "org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, " + "org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, application, " + pageParam); printParams(n, pageParam, page.isLiteral()); out.println(", out, " + isFlush + ");");
Index: jasper2/src/share/org/apache/jasper/runtime/JspRuntimeLibrary.java =================================================================== RCS file: /home/cvspublic/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/runtime/JspRuntimeLibrary.java,v retrieving revision 1.25 diff -u -r1.25 JspRuntimeLibrary.java --- jasper2/src/share/org/apache/jasper/runtime/JspRuntimeLibrary.java 4 Nov 2003 19:28:49 -0000 1.25 +++ jasper2/src/share/org/apache/jasper/runtime/JspRuntimeLibrary.java 5 Nov 2003 17:34:11 -0000 @@ -75,6 +75,7 @@ import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; +import javax.servlet.ServletContext; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; @@ -965,7 +966,6 @@ } - /** * Perform a RequestDispatcher.include() operation, with optional flushing * of the response beforehand. @@ -973,14 +973,26 @@ * @param request The servlet request we are processing * @param response The servlet response we are processing * @param relativePath The relative path of the resource to be included - * @param out The Writer to whom we are currently writing + * @param out The JspWriter to whom we are currently writing * @param flush Should we flush before the include is processed? * * @exception IOException if thrown by the included servlet * @exception ServletException if thrown by the included servlet */ - public static void include(ServletRequest request, - ServletResponse response, + public static void include(HttpServletRequest request, + HttpServletResponse response, + String relativePath, + JspWriter out, + boolean flush) + throws IOException, ServletException { + + include(request, response, null, relativePath, out, flush); + + } + + public static void include(HttpServletRequest request, + HttpServletResponse response, + ServletContext servletContext, String relativePath, JspWriter out, boolean flush) @@ -997,7 +1009,13 @@ // replicate Jasper's previous behavior String resourcePath = getContextRelativePath(request, relativePath); - RequestDispatcher rd = request.getRequestDispatcher(resourcePath); + RequestDispatcher rd = null; + + if(servletContext == null) { + rd = request.getRequestDispatcher(resourcePath); + } else { + rd = servletContext.getRequestDispatcher(resourcePath); + } rd.include(request, new ServletResponseWrapperInclude(response, out));
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]