Search code examples
javajspeljsp-tags

Can a JSP tag file access its calling JSP's PageContext?


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?


Solution

  • 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}