[综合]EL表达式(2)[复制链接] 满世界飞 版主 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类型。文本表达式不使用${}或#{}来分隔。 如果需要的文本表达式中包含保留字#{}或${},需要对这些字符进行转义,有如下的方法: 创建一个组合表达式,比如 ${’${’}exprA} #{’#{’}exprB} 复制代码 这两个表达式的结果是字符串#{exprA}和#{exprB} 使用转义符\$和\#,比如 \${exprA} \#{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} 如果名为Add的request参数为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 bean的lName属性的值。在回发的时候,设置customer bean的lName的值。 #{customer.calcTotal} customer bean的calcTotal方法的返回值