Understood. Thanks for the walk through; I think I understand what's going
on. I am going to read through the spec a bit more and verify though since
I don't know much of anything about EL :(

Thanks again!

On Mon, May 9, 2016 at 5:14 PM, Mark Thomas <ma...@apache.org> wrote:

> On 09/05/2016 20:45, Coty Sutherland wrote:
>
> <snip/>
>
> >     <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"; prefix="fmt"%>
> >     <fmt:setBundle basename="IDontExist" scope="session"
> > var="messageString" />
> >     <script type="text/javascript">
> >         var value = "${messageString.resourceBundle.keys}";
> >
> > I did a bit of debugging and I can see that the bundle is null which
> seems
> > expected (section 8.7 of the JSTL 1.2 spec states that if its null,
> empty,
> > or invalid a null resource bundle should be added to the context), but it
> > doesn't give any warnings or anything when you try and access it's
> > resourceBundle's keys. I tried to find the behavior definition in the JSP
> > spec also, but I don't see anything for this particular behavior. From
> the
> > JSP 2.1 spec, section 2.21.7 getValue(ELContext, Object, Object) shows
> that
> > getValue can return null, which it does. In the JasperELResolver class'
> > getValue method there is a tight loop that iterates over all of the
> > Resolver's resolvers to resolve the property and return it's value. When
> > you pass in the non-existent basename such as above, the resolver that
> > "resolves" the property ends up being the BeanELResolver. The context
> isn't
> > null and the base and property variables aren't null, so the resolver
> sets
> > the property as resolved (though I think that's wrong)
>
> That isn't what is happening.
>
> fmt:setBundle creates a LocalizationContext instance with a null
> ResourceBundle and places it in session scope with the name "messageString"
>
> All resolution is done with an instance of JasperELResolver. See JSP.2.9.
>
> First:
> base = null
> property = messageString
>
> This is handled by the ScopedAttributeELResolver and returns the
> LocalizationContext instance.
> It is left as an exercise for the reader to determine why it is correct
> that the previous 9 resolvers in the the JasperELResolver do not resolve
> this.
>
> Second:
> base = messageString (LocalizationContext)
> property = resourceBundle
>
> This is handled by the BeanELResolver and returns null.
> Again, why the BeanELResolver handles this is an exercise for the reader.
>
> Finally, we have
> base = null
> property = keys
>
> and section 1.6 of the EL spec explains how to handle that. Returning
> null is the correct thing to do.
>
> > So the question is, does this behavior seem correct?
>
> Yes.
>
>
> Long, painful experience with this code has taught me to be very, very
> cautious before changing anything. While I am certain there are some
> bugs in the code somewhere, I'm going to need a lot of convincing that
> any given behaviour is invalid. The most convincing evidence would be
> the simplest possible test case that demonstrates the problem along with
> a step by step explanation of the spec mandated behaviour and how Tomcat
> differs from that.
>
> Mark
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: dev-h...@tomcat.apache.org
>
>

Reply via email to