I agree, the frustration from unknowningly reusing a variable
and getting confused about whats going on in the page would probably
be worse than having the container give you an error telling you to
use a different name.
> -----Original Message-----
> From: Hans Bergsten [mailto:[EMAIL PROTECTED]]
> Sent: Tuesday, May 22, 2001 7:04 PM
> To: Eduardo Pelegri-Llopart
> Cc: [EMAIL PROTECTED]; [EMAIL PROTECTED]
> Subject: Re: (JSP) Re: AT_BEGIN, AT_END
>
>
> Eduardo Pelegri-Llopart wrote:
> >
> > Shawn is asking clarifications on some of the scoping rules.
> >
> > Let me start with his second question. He asks whether the
> following is
> > legal or illegal JSP:
> >
> > 1 | <% if (a == b) { %>
> > 2 | <x:tag>
> > 3 | <% } >
> > 4 |
> > 5 | ...
> > 6 |
> > 7 | <% if (a == b) { %>
> > 8 | </x:tag>
> > 9 | <% } %>
> >
> > Good point. I think the answer should be "illegal" but I don't see
> > where the spec specifically says so.
> >
> > I propose we add some verbiage about matching blocks in
> scripting code
> > to the spec (in this case, in lines 1 and 3, and then in 7
> and 9) and
> > specify that custom actions need to appear completely within them.
> > [...]
>
> I agree.
>
> > Shawn is also asking about the visibility for an example of
> the form:
> >
> > > > <x:b>
> > > > <x:a/>
> > > > </x:b>
> > > > <%= status %>
> >
> > where x:a is defining a scripting variable "status" as AT_BEGIN
> > (AT_END would do as well).
> >
> > There are two parts. One is the life of the object within the
> > pageContext object; the other is the scope of the scripting
> variable.
> > I.e. the first is part is, when can I do a
> page.getAttribute("status")
> > and get that object. The second is where can one use the "status"
> > scripting variable.
> >
> > The spec seems to suggest that the scope of the object in
> pageContext
> > is from the moment the start tag is invoked until the end of
> > the page. But the transformation in Section JSP.6.4, and
> the comment at
> > the end of that section (plus Shawn's observation about
> implementation
> > details) says that the scripting variable is actually scoped by the
> > <x:b> and </x:b>
> >
> > This is a bit strange, so one possibility would be to
> clarify the two
> > scopes should be the same, e.g. modify the semantics of AT_BEGIN and
> > AT_END so they are interpreted within the enclosed scope of the tag,
> > using some verbiage similar to that in 6.4.4. That would require
> > changes in Section 10.5.8 (page 200).
> >
> > This also requires implementation changes, i.e. the JSP
> container would
> > be responsible for removing the pageContext binding for
> "status" after
> > the end tag in x:b.
> >
> > I would appreciate opinions on this.
>
> I see two problems with going this way:
>
> 1) The container will likely have a hard time to deal with these two
> cases consistently:
>
> a)
> <foo:if ...>
> <x:a id="status" />
> </foo>
> <%= pageContext.getAttribute("status") %>
>
> b)
> <% if (...) { %>
> <x:a id="status" />
> <% } %>
> <%= pageContext.getAttribute("status") %>
>
> In a) it can remove "status" from the pageContext but it's
> not as easy
> for it to do so in b). To a JSP page author, these cases
> are the same
> though.
>
> 2) In general, explaining to a non-programmer the concept variable
> visibility and how the different interactions of custom actions and
> scripting elements affect where a variable can be used doesn't
> thrill me ;-) It's so much easier to say that "you can use
> it anywhere
> in the page after this custom action".
>
> Tom Reilly said in another mail in this thread:
> > The other solution is to modify things so that the scope of the
> > scripting variable matches the scope of the variable in the
> > pageContext. This has two ramifications:
> >
> > - the JSP engine has to lift the declaration of the variable out of
> > any scopes its in
> > - the scripting variable is available before its set, presumably
> > initialized to null (the bit about the compiler throwing errors on
> > uninitialized variables doesn't work when the value gets set inside
> > a conditional block as Shawn pointed out to me).
>
> This looks like a much better solution to me. But Tom also goes on to
> say, in yet another mail:
> > [...] the engine is smart about not declaring the same
> variable twice,
> > which is easy if all AT_END and AT_BEGIN variables are
> declared in the same
> > place).
>
> I would prefer if this is still controlled by the declare value in
> VariableInfo. In other words, if declare=true, both of Tom's
> examples would
> be invalid (needed to be reported by the container directly,
> not indirectly
> as a Java compilation error):
>
> 1)
> <tag id="foo"/>
> ...
> <tag id="foo"/>
>
> 2)
> <if ...>
> <tag id="foo"/>
> </if>
>
> <if ...>
> <tag id="foo"/>
> </if>
>
>
> Hans
> --
> Hans Bergsten [EMAIL PROTECTED]
> Gefion Software http://www.gefionsoftware.com
> Author of JavaServer Pages (O'Reilly), http://TheJSPBook.com
>