dev@jsftemplating.java.net

Re: jsftemplating if expressions

From: Ken Paulsen <Ken.Paulsen_at_Sun.COM>
Date: Tue, 12 Sep 2006 13:08:28 -0700

Hi Mike, see comments below...

Mike Wright wrote:
> Hi Ken,
>
> Thanks for fix the <!if> problem. I've made some progress:
>
>> <!if #{sessionScope.hasTypeColumn}>
>> "<br />has type
>> </!if>
>> "<br/>else
>> <!if !#{sessionScope.hasTypeColumn}>
>> "<br />has no type
>> </!if>
>
> produces:
>
>> has type
>> else
>
> on the page after the variable is set to $boolean{true}, and produces:
>
>> else
>> has no type
>
> on the pages when the variable is set to $boolean{false}. Good so far.
>
>
> However, when I try to do a string comparison, strange things happen.
> I've set a table type on three top-level pages, e.g.
>
>> setSessionAttribute(key="sharedTableType", value="deployments")
>
> (or "bindingsEngines" or "libraries"), but when I try to check this
> value:
>
>> <!if #{sessionScope.sharedTableType} == "deployments" >
>> "<br />TBD call listServiceAssemblies("domain")
>> </!if>
>
> I get nothing as if this always evaluates to false. If I add "<br
> />#{sessionScope.sharedTableType}" I get the expected String displayed
> (it is set).
> BTW, originally I tried a single "=" as you described in a previous
> e-mail, but that didn't work (I expect that this was a
> typo like the </if> typos, where only </!if> is expected). This is
> why running examples are much better than
> (untestable, typo-prone) e-mails. Anyway, at some point, some
> variation I tried resulted in a:
A single '=' is correct (my current parsing is limited to single
character operators). See attached example.

This example shows the use of '&' (logical AND), '!' (logical NOT), and
'=' (String equals). If you run it, you can follow the messages on the
screen to see the 3 different 'if' branches.
>> com.sun.el.parser.ParseException: Encountered "=" at line 1, column 32.
>> Was expecting one of:
>> "}"
>
> ...
>
>> "=="
>
> ...
>
> so I switched to using "==" (or is there some other syntax I should be
> using)?
>
> . If I try something like this (moving the closing curly brace outside
> the comparison):
>
>> <!if #{sessionScope.sharedTableType == "deployments"} >
>> "<br />TBD call listServiceAssemblies("domain")
>> </!if>
>
> Depending on the variable's contents, I get all sorts of information
> on the screen, that looks like javascript generated for the woodstock
> table component
> used above the <!if> in the .jsf file, or I get the rest of the page
> truncated and the server.log shows:
The #{...} is standard EL syntax. It must follow EL rules.
>> java.uti.regex.PatternSyntaxException:
>> Illegal repitition near index 0
>> #{sessionScope.sharedTableType
>> ^
>
> Trying to reverse engineer the <!if> expression syntax is taking up
> too much time. Can you please provide some more detailed examples or
> tests showing the syntax for <!if> expressions? It would be very
> helpful to commit some samples to the jsftemplating project. I would
> do it, if I had any working examples.
The Strings / boolean variables can be whatever you want using #{} or
${} expressions. The operators follow the example I have attached and
the (undecipherable) email messages. Here are some more boolean
equation examples (see also moreIfs.jsf, attached):

true
!false
foo=foo
33<100
1111\>9
13%5 = 3
13%5 = 3
(13%5 \> 1) | false
!(13%5 < 1) & true

These all evaluate to "true".

Feel free to post these! ;)

Ken

>
> Regards,
> Mike
>
>
>


<sun:page>
    <sun:html>
        <sun:head id="head" />
        <sun:body>
            <sun:form id="form">
                "<p>&nbsp;</p>
                <!if $attribute{in} & ! ($attribute{in} = abc) >
                    "<b>You typed: #{in}, try typing: abc</b>
                </if>
                <!if !$attribute{in}>
                    "<b>Type something and click 'Go!'</b>
                </if>
                <!if $attribute{in}=abc>
                    "<b>Congratulations! You did it!</b>
                </if>

                "<br /><br />
                <sun:textField id="in" value="#{requestScope.in}" />

                "<br /><br />
                <sun:hyperlink text="Go!" />
            </sun:form>
         </sun:body>
     </sun:html>
 </sun:page>


<sun:page>
    <sun:html>
        <sun:head id="head" />
        <sun:body>
            <sun:form id="form">
                "<br /><br />

                <!if true>
                    "true<br />
                </if>

                <!if !false>
                    "!false<br />
                </if>

                <!if (true & (!(true & false) | (!true & false))) | false>
                    "(true & (!(true & false) | (!true & false))) | false<br />
                </if>

                <!if foo=foo>
                    "foo=foo<br />
                </if>

                <!if 33<100>
                    "33<100<br />
                </if>

                # NOTE: \ is required before '>' so if isn't terminated early
                <!if 1111\>9>
                    "1111>9<br />
                </if>

                <!if 13%5 = 3>
                    "13%5 = 3<br />
                </if>

                <!if 13%5 = 3>
                    "13%5 = 3<br />
                </if>

                <!if (13%5 \> 1) | false>
                    "(13%5 > 1) | false<br />
                </if>

                <!if !(13%5 < 1) & true>
                    "!(13%5 < 1) & true<br />
                </if>

            </sun:form>
         </sun:body>
     </sun:html>
 </sun:page>