[综合]EL表达式(2)

[综合]EL表达式(2)[复制链接]

  

Rank: 25

1
发表于 2011-3-27 12:40 | 只看该作者 | 倒序浏览 | 打印
定义标签属性类型
    在前面的章节中解释过了,所有的表达式都可以使用在标签属性中。表达式是什么类型、是立即求值还是延迟求值,这些都是有标签的type属性决定的。这个属性是在定义标签的Page Description Language中定义的。
    如果要创建一个客户标签,对PDL中的每个标签,都需要定义该标签能够接受什么类型的表达式。表6-1显示了接受EL表达式的tag属性的类型,给出了它们接受的表达式的联系,还提供了必须添加到PDL中的属性的类型定义。在动态属性中可以使用#{}语法,这表明属性接受运行时动态计算的值。相似的,可以在延迟属性中使用${}。

表格 6-1: 标签属性类型


                        

属性类型

               
                        

表达式例子

               
                        

类型属性定义

               
                        

Dynamic

               
                        

"literal"

               
                        

<rtexprvalue>true</rtexprvalue>

               
                        

${literal}

               
                        

<rtexprvalue>true</rtexprvalue>

               
                        

Deferred Value

               
                        

"literal"

               
                        

<deferred-value>

                        

    <type>java.lang.String</type>

                        

<deferred-value>

               
                        

#{customer.age}

               
                        

<deferred-value>

                        

    <type>int</type>

                        

<deferred-value>

               
                        

Deferred method

               
                        

"literal"

               
                        

<deferred-method>

                        

    <method-signature>

                        

        java.lang.String                        submit()

                        

    </method-signature>

                        

</deferred-method>

               
                        

#{customer.calcTotal}

               
                        

<deferred-method>

                        

    <method-signature>

                        

        double                        calcTotal(int, double)

                        

    </method-signature>

                        

</deferred-method>

               

    除了表6-1中显示的标签属性类型外,还可以定义属性既接受动态的也接受延迟的表达式。在这种情况下,标签属性的定义中既包含设置为true的rtexprvalue定义,也包含deffered-value或deferred-method定义。

文本表达式
    文本表达式直接被解析为表达式的文本,是String类型。文本表达式不使用${}或#{}来分隔。
    如果需要的文本表达式中包含保留字#{}或${},需要对这些字符进行转义,有如下的方法:
    创建一个组合表达式,比如
  1. ${’${’}exprA}
  2. #{’#{’}exprB}
复制代码
    这两个表达式的结果是字符串#{exprA}和#{exprB}
使用转义符\$和\#,比如
  1. \${exprA}
  2. \#{exprB}
复制代码
    这两个表达式的结果也是#{exprA}和#{exprB}
    当文本表达式被求值的时候,也可以被转换成其他的类型。表6-2列出了不同的文本表达式的例子和它们期望的结果值的类型:
表格 6-2: 文本表达式
                        

表达式

               
                        

期望类型

               
                        

结果

               
                        

Hi

               
                        

String

               
                        

Hi

               
                        

true

               
                        

Boolean

               
                        

Boolean.TRUE

               
                        

42

               
                        

int

               
                        

42

               
    文本表达式可以立即求值,也可以延迟求值;可以是是值表达式,也可以是方法表达式。文本表达式什么时候被求值取决于在哪里被使用。如果使用文本表达式的标签属性定义为接受延迟表达式,并且文本表达式是值表达式的时候,那么文本表达式在生命周期的哪一点求值接取决于其他的因素,如表达式在哪里被使用或引用了什么。
    在文本表达式是方法表达式的情况下,被引用的方法会被调用,返回一个字符串文本。例如,guessnunmber应用程序中的commandButton标签中,我们使用了文本方法表达式作为输出来告诉JavaServerFaces导航系统下一个要显示的页面是什么。

运算符
    除了在“值表达式和方法表达式”中讨论过的运算符.和[]之外,EL还提供了下面的一些运算符,这些运算符只能应用于rvalue的表达式:
  • 算术运算符:+,-(二元运算),*,/和div,%,mod,-(一元运算)
  • 逻辑运算符:and,&&,or,||,not,!
  • 关系运算符:==,eq,!=,ne,<,lt,>,gt,<=,ge,>=,le。可以用来和其他的值做比较或和Boolean、字符串、整数或浮点数做比较。
  • Empty;Empty运算符是一个前缀运算符,用来决定一个值是否是null或空。
  • 条件运算符:A?B:C。根据A的值决定返回B或C的值。
运算符的优先级从高到低的顺序是:
  • [].
  • ()用来改变运算符的优先级
  • -(一元运算)not ! empty
  • * / div % mod
  • + -(二元运算)
  • < > <= >= lt gt le gt
  • == != eq ne
  • && and
  • || or
  • ? :

保留字
下面是EL的保留字,不能用作标识符:
anr or not eq ne lt gt le ge true false null instanceof empty div mod

EL表达式的例子
表6-3包含了一些EL表达式的例子和它们的结果:
表格 6-3: EL表达式例子
                        

EL表达式

               
                        

结果

               
                        

${1>(4/2)}

               
                        

false

               
                        

${4.0>=3}

               
                        

true

               
                        

${100.0 == 100}

               
                        

true

               
                        

${(10*10) ne                        100}

               
                        

false

               
                        

${'a' < 'b'}

               
                        

true

               
                        

${'hip' gt                        'hit'}

               
                        

false

               
                        

${4 > 3}

               
                        

true

               
                        

${1.2E4+1.4}

               
                        

12001.4

               
                        

${3 div 4}

               
                        

0.75

               
                        

${10 mod 4}

               
                        

2

               
                        

${! empty                        param.Add}

               
                        

如果名为Addrequest参数为null或空字符串,返回false

               
                        

${pageContext.request.contextPath}

               
                        

context path

               
                        

${sessionScope.cart.numberOfItems}

               
                        

session作用域内名为cart的对象的numberOfItems属性的值

               
                        

${param['mycom.productId']}

               
                        

名为mycom.productId的请求参数的值

               
                        

${hearder[“host”]}

               
                        

host

               
                        

${department[deptName]}

               
                        

departments                        map中名为deptName的项的值

               
                        

${requestScope['javax.servlet.forward.servlet_path']}

               
                        

request作用域中名为javax.servlet.forward.servlet_path属性的值

               
                        

#{customer.lName}

               
                        

在初始请求中,获取customer                        beanlName属性的值。在回发的时候,设置customer                        beanlName的值。

               
                        

#{customer.calcTotal}

               
                        

customer                        beancalcTotal方法的返回值

               

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值