Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 864
machineghost Avatar asked Aug 17 '11 19:08

machineghost


2 Answers

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}
like image 121
BalusC Avatar answered Sep 22 '22 22:09

BalusC


Looks like in WebLogic 10 at least, the implicit "application" object is available in tag files, and is instanceof ServletContext. Maybe use this, when it's really the ServletContext that one is after, and not necessarily the higher-level pageContext.

like image 31
mgaert Avatar answered Sep 26 '22 22:09

mgaert