Went back and looked spec a little closer thanks to some pointers
from Shawn.
Section 6.4.4 says:
"Their visibility is affected by other constructs, for example scriptlets."
and later ...
"Note that the value of the scope attribute does not affect the visibility
of the variables within the generated program"
Which seems to indicate that there's nothing wrong with the approach
I mentioned of declaring AT_BEGIN and AT_END variables at the top
of the page but that it isn't guaranteed to work in all engines.
Less than ideal situation.
Section 7.6.1 advocates using a defineObject tag to workaround the problem.
I think we can do better. Forcing JSP users to think about
scopes and JSP tag library authors to introduce defineObjects
tags seems to me to make JSP unnecessarily cumbersome to use.
A better solution would be a to make a PAGE_WIDE scope available
to tag authors. In fact I would question the utility of AT_BEGIN
and AT_END if such a scope existed. With these lexical scoping
exceptions the only way to make sense of AT_END and AT_BEGIN
is to think about the underlying generated code which JSP users
shouldn't have to do.
> -----Original Message-----
> From: Tom Reilly [mailto:[EMAIL PROTECTED]]
> Sent: Tuesday, May 22, 2001 10:50 AM
> To: 'Craig R. McClanahan'; [EMAIL PROTECTED]
> Cc: [EMAIL PROTECTED]; [EMAIL PROTECTED]
> Subject: RE: AT_BEGIN, AT_END
>
>
> Yep this is a nasty one. JRun has this problem too but we
> are fixing it.
>
> The spec only says where these variables are available, not where they
> are declared. So I would call it a bug in Jasper (and JRun).
> AT_END and
> AT_BEGIN variables should be declared at the top of _jspService
> (or as member variables for STM JSPs). Trying to use the variables
> before they have been assigned will result in a compiler error if
> they weren't assigned an initial value (which they shouldn't).
>
> Clarifications like this should be collected in a "interpreting JSP
> semantics
> for the Java scripting language" section.
>
> Otherwise you end up with constructs like this:
>
> <x:b>
> <x:a/>
> </x:b>
> <% String status2 = pageContext.getAttribute("status"); %>
>
> > -----Original Message-----
> > From: Craig R. McClanahan [mailto:[EMAIL PROTECTED]]
> > Sent: Monday, May 21, 2001 7:15 PM
> > To: [EMAIL PROTECTED]
> > Cc: [EMAIL PROTECTED]; [EMAIL PROTECTED]
> > Subject: Re: AT_BEGIN, AT_END
> >
> >
> > Hi Shawn,
> >
> > This looks to me like it really is a bug in Tomcat, based on the
> > description of how AT_BEGIN and AT_END are supposed to work
> > (for example,
> > on p. 200 of JSP 1.2 PFD2). The "status" variable exposed by
> > the <x:a>
> > tag should really be visible where you have it accessed.
> >
> > However, the question of "how early is too early" is an interesting
> > one. I've cc'd the JSR-053 expert group (responsible for the JSP
> > spec) for more feedback on that question.
> >
> > Craig McClanahan
> >
> >
> >
> > On Mon, 21 May 2001, Shawn Bayern wrote:
> >
> > > This may not really be the best place to raise this
> > question, but it's
> > > related to tag development and may affect the way tags
> > should be designed.
> > >
> > > The JSP (1.2 PFD2) spec calls for AT_BEGIN and AT_END to
> provide for
> > > availability of scripting variables from the appropriate
> > point "until the
> > > end of the page."
> > >
> > > I don't see any way of accomplishing that without also making the
> > > variables accessible earlier on the page as well. A
> > scripting-variable
> > > declaration approximately adjacent to the calls to
> doStartTag() and
> > > doEndTag() -- which is where Jasper locates the declaration
> > in the last
> > > version I checked -- might be contained within a Java '{
> > ... }' block as
> > > the result either of a scriptlet or of a block that the
> > translator adds
> > > because of a stack of tags. Thus, the declaration would
> > have only the
> > > narrow lexical "block" scope necessitated by the Java
> > language, and it
> > > would not be available outside the containing block.
> > >
> > > To make it concrete... In the version of Jasper I tested
> with (with
> > > Tomcat 4.0 b3), if <x:a> produces an AT_BEGIN scripting
> > variable called
> > > 'status', it will not be accessible when it's used in the
> following
> > > example:
> > >
> > > <x:b>
> > > <x:a/>
> > > </x:b>
> > > <%= status %>
> > >
> > > That may just be a bug in Jasper, or it may follow the
> > intent of the spec.
> > > (I'm not sure -- I can't find anything in the spec that
> specifically
> > > supports or refutes this example, other than the language
> > that describes
> > > AT_BEGIN as making a scripting variable available "until
> > the end of the
> > > page." This makes me thing it's a bug.)
> > >
> > > If this is a bug, though, then the problem is that any fix
> > would require
> > > the translator to declare a variable before any sub-block
> > present on the
> > > page, and this would make scripting variables available too
> > early. (The
> > > spec doesn't seem to rule that out -- i.e., maybe there's
> > no such thing as
> > > "too early" -- but I could be wrong.)
> > >
> > > Does anyone know how other container handle similar
> > situations? Any other
> > > thoughts? I might just be missing something obvious.
> > >
> > > Shawn
> > >
> > >
> >
>