File APIs for Java Developers
Manipulate DOC, XLS, PPT, PDF and many others from your application.
http://aspose.com/file-tools
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

question of "include" in JSP spec 2.0

 
kenneth See
Greenhorn
Posts: 7
  • 0
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Dear all,

I have read the JSP spec 2.0 (section 5.4) about command "Include" but I cannot understand the difference between "relative to current JSP page" and "relative to current JSP files". Can anybody explain about this?
Can you also explain why we got those results in the following 4 cases? Many many thanks.

Kenneth

-------------------------------------------------
From the spec:
"The page attribute of both the jsp:include and the jsp:forward actions are
interpreted relative to the current JSP page, while the file attribute in an include directive is interpreted relative to the current JSP file. See below for some examples of combinations of this."

For an example of a more complex set of inclusions, consider the following
four situations built using four JSP files: A.jsp, C.jsp, dir/B.jsp and dir/C.jsp:

JavaServer Pages 2.0 Specification
Case1� A.jsp says <%@ include file=�dir/B.jsp�%> and dir/B.jsp says <%@ include file=�C.jsp�%>. In this case the relative specification C.jsp resolves to dir/C.jsp.

Case2� A.jsp says <jsp:include page=�dir/B.jsp�/> and dir/B.jsp says <jsp:include page=�C.jsp� />. In this case the relative specification C.jsp resolves to dir/C.jsp.

Case3� A.jsp says <jsp:include page=�dir/B.jsp�/> and dir/B.jsp says <%@ include file=�C.jsp� %>. In this case the relative specification C.jsp resolves to dir/C.jsp.

Case4� A.jsp says <%@ include file=�dir/B.jsp�%> and dir/B.jsp says <jsp:include page=�C.jsp�/>. In this case the relative specification C.jsp resolves to C.jsp.
 
Charles Lyons
Author
Ranch Hand
Posts: 836
  • 0
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
It's to do with static vs. runtime includes. The <jsp:include /> mechanism effectively uses a RequestDispatcher and its include() method at runtime, while the <%@ include ... %> directive copies another JSP's source code into the current JSP before it is compiled into a servlet.

So when they refer to "relative to JSP file", they mean relative to the location of the actual JSP file on the hard disk.

When they say "relative to JSP page" they are referring to the complete JSP compilation unit, which may contain other .jsp files statically copied and compiled in.

So in case 1 we're using all static inclusions and it does what we want: A.jsp statically includes /dir/B.jsp which statically includes C.jsp in the same directory---hence /dir/C.jsp. Overall we now have A.jsp as a single JSP with all the other JSPs statically compiled in. It does no runtime calls using a RequestDispatcher.

In case 4: A.jsp includes /dir/B.jsp by filesystem path. This produces the JSP file A.jsp which also has /dir/B.jsp statically compiled into it at the appropriate point (i.e. where the <%@ include ... %> occurs). The JSP page is still A.jsp, which effectively consists of two JSP files. The <jsp:include page="C.jsp" /> action is copied into A.jsp verbatim before compilation into the servlet. So now when it executes (at runtime, using RequestDispatcher) the path is relative to the current page which is A.jsp. So it will try to include C.jsp.

The rule is a JSP page is a complete compilation unit which may consist one or more JSP files. Static inclusion is relative to the file. Dynamic inclusion is relative to the entire JSP compilation unit ("page").

Hope that helps. Try to explain the other two cases (2 and 3) for yourself and post back if still you have a problem
 
Don't get me started about those stupid light bulbs.
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic