If I do:
<% pageContext.setAttribute("foo", "bar"); %>
<custom:myTag/>
it seems like I should be able to do:
<%= pageContext.getAttribute("foo") %>
inside of myTag.tag ... but of course I can't because the tag file doesn't have access to the pageContext (instead it has access to a jspContext ... which doesn't have the same attributes as the calling page's pageContext).
Now, you can access the pageContext via ELScript:
${pageContext}
but that doesn't help because ELScript has no way of passing arguments, so you can't do:
${pageContext.getAttribute("foo")}
However, the fact that ELscript can accesss the page context, and the fact that the tag can access all sorts of variables like jspContext, that there must be some way for a tag to access (in a scriptlet/Java logic way, not just in ELScript) an attribute from the calling JSP's pageContext.
Is there?
As to EL, the ${pageContext.getAttribute("foo")}
works in EL 2.2 only. Before that the right syntax is ${pageContext.foo}
or just ${foo}
. See also our EL wiki page.
However, the ${pageContext}
isn't shared between the parent JSP file and the JSP tag. Each has its own instance.
You could either set it as request attribute instead:
<% request.setAttribute("foo", "bar") %>
<custom:myTag />
with in the tag
<%= request.getAttribute("foo") %>
or, with EL
${requestScope.foo}
or
${foo}
Or, better, you could pass it as a fullworthy tag attribute
<custom:myTag foo="bar" />
with in the tag
<%@attribute name="foo" required="true" %>
${pageContext.foo}
or just
<%@attribute name="foo" required="true" %>
${foo}