JSF Gossip: JSF Expression Language

From Gossip@caterpillar

JSF Gossip: JSF Expression Language

JSF Expression Language 搭配 JSF 标签来使用,是用来存取资料物件的一个简易语言。

JSF EL是以#开始,将变数或运算式放置在 { 与 } 之间,例如:

 #{someBeanName}

 
变数名称可以是faces-config.xml中定义的名称,如果是Bean的话,可以透过使用 '.' 运算子来存取它的属性,例如:

 ...
 <f:view>
    <h:outputText value="#{userBean.name}"/>
 </f:view>
 ...

 

在JSF标签的属性上," 与 " (或'与')之间如果含有EL,则会加以运算,您也可以这么使用它:

 ...
 <f:view>
    名称, 年龄:<h:outputText
                  value="#{userBean.name}, #{userBean.age}"/>
 </f:view>
 ...

 

一个执行的结果可能是这样显示的:

 名称, 年龄:Justin, 29

 

EL的变数名也可以程式执行过程中所宣告的名称,或是JSF EL预设的隐含物件,例如下面的程式使用param隐含物件来取得使用者输入的参数:

 <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
 <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
 <%@page contentType="text/html; charset=Big5"%>
     
 <html>
 <head>
 <title></title>
 </head>
 <body>
 <f:view>
    <b> 您好, <h:outputText value="#{param.name}"/> </b>
 </f:view>

 </body>
 </html>

 

param是JSF EL预设的隐含物件变数,它代表request所有参数的集合,实际是一个java.util.Map型态物件,JSF所提供的隐含物件,大致上对应于 JSP 隐含物件,不过JSF隐含物件移除了pageScope与pageContext,而增加了facesContext与view,它们分别对应于 javax.faces.context.FacesContext与javax.faces.component.UIViewRoot。

对于Map型态物件,我们可以使用 '.' 运算子指定key值来取出对应的value,也可以使用 [ 与 ] 来指定,例如:

 ...
 <f:view>
    <b> 您好, <h:outputText value="#{param['name']}"/> </b>
 </f:view>
 ...

 

在 [ 与 ] 之间,也可以放置其它的变数值,例如:

...
 <f:view>
    <h:outputText value="#{someBean.someMap[user.name]}"/>
 </f:view>
 ...

 

如果变数是List型态或阵列的话,则可以在 [] 中指定索引,例如:

 ....
 <f:view>
     <h:outputText value="#{someBean.someList[0]}"/>
     <h:outputText value="#{someBean.someArray[1]}"/>
     <h:outputText
           value="#{someBean.someListOrArray[user.age]}"/> 
 </f:view>
 ....

 

您也可以指定字面常数,对于true、false、字串、数字,JSF EL会尝试进行转换,例如:

 ....
 <h:outputText value="#{true}"/>
 ....

 <h:outputText value="#{'This is a test'}"/>
 ....

 

如果要输出字串,必须以单引号 ' 或双引数 " 括住,如此才不会被认为是变数名称。

在宣告变数名称时,要留意不可与JSF的保留字或关键字同名,例如不可取以下这些名称:

 true false null div mod and or not eq ne lt gt le ge instanceof empty

 
使用EL,您可以直接实行一些算术运算、逻辑运算与关系运算,其使用就如同在一般常见的程式语言中之运算。

算术运算子有:加法 (+), 减法 (-), 乘法 (*), 除法 (/ or div) 与余除 (% or mod) 。下面是算术运算的一些例子:

运算式 结果
#{1} 1
#{1 + 2} 3
#{1.2 + 2.3} 3.5
#{1.2E4 + 1.4} 12001.4
#{-4 - 2} -6
#{21 * 2} 42
#{3/4} 0.75
#{3 div 4} 0.75,除法
#{3/0} Infinity
#{10%4} 2
#{10 mod 4} 2,也是余除
#{(1==2) ? 3 : 4} 4


如同在Java语法一样 ( expression ? result1 : result2)是个三元运算,expression为true显示result1,false显示result2。

逻辑运算有:and(或&&)、or(或!!)、not(或!)。一些例子为:

运算式 结果
#{true and false} false
#{true or false} true
#{not true} false


关系运算有:小于Less-than (< or lt)、大于Greater-than (> or gt)、小于或等于Less-than-or-equal (<= or le)、大于或等于Greater-than-or-equal (>= or ge)、等于Equal (== or eq)、不等于Not Equal (!= or ne),由英文名称可以得到lt、gt等运算子之缩写词,以下是Tomcat的一些例子:

运算式 结果
#{1 < 2} true
#{1 lt 2} true
#{1 > (4/2)} false
#{1 > (4/2)} false
#{4.0 >= 3} true
#{4.0 ge 3} true
#{4 <= 3} false
#{4 le 3} false
#{100.0 == 100} true
#{100.0 eq 100} true
#{(10*10) != 100} false
#{(10*10) ne 100} false


左边是运算子的使用方式,右边的是运算结果,关系运算也可以用来比较字元或字串,按字典顺序来决定比较结果,例如:

运算式 结果
#{'a' < 'b'} true
#{'hip' > 'hit'} false
#{'4' > 3} true


EL运算子的执行优先顺序与Java运算子对应,如果有疑虑的话,也可以使用括号()来自行决定先后顺序。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值