介绍JavaServer Faces 表达式语言(JSF EL)

没有回复
罗寒
User offline. Last seen 3 周 6 天 ago. Offline
加入: 01/24/2010

JSF EL简介

JSF中我们使用各种标签(Tag)来使用内建的或者自定义的组件,比如常用的h:outputText之类,你可以在faces- config.xml等配置文件中声明受管的JavaBean(Managed bean)。而JSF EL允许我们将Managed Bean的值绑定到组件的属性。

JSF EL和JSTL比较类似,但是它所用的是另外的函数和关键字,与JSTL使用${和}作为分隔符不同,JSF EL使用#{和}作为分隔符。

下面是一些有效的JSF EL的例子:

   #{Page1.name}
   #{Foo.bar}
   #{Foo[bar]}
   #{Foo[“bar”]}
   #{Foo[3]}
   #{Foo[3].bar}
   #{Foo.bar[3]}
   #{Customer.status == ‘VIP’}
   #{(Page1.City.farenheitTemp - 32) * 5 / 9}
   时间:从 #{Report.fromDate} 到 #{Report.toDate}

如果需要设置值(也就是向服务器提交值)那么只能用以下这些形式:

   用.分隔的表达式:#{expr-a.value-b}
   用[]分隔的表达式:#{expr-a[value-b]]
   只包含bean名字的表达式:#{value-b}

在JSF EL中,#{a.b}和{a[b]}的作用是相同的。这里的b不一定非得是JavaBean的一个属性,如果a是一个Map,那么#{a.b}的值相当于a.get("b")。如果a是一个List或者数组,那么b可以是一个数组的下标。

值得注意的是,在JavaBean中定义布尔型的get方法时候通常定义为isXXX()这样的签名,JSF EL是没有办法识别这样的getter的,你仍然需要定义一个getXXX()方法(返回值为boolean类型),这样JSF EL才能正确的得到对应的属性值

隐式对象

在JSF EL中可以使用这些隐式对象:

  • facesContext - 当前请求的 FacesContext 实例。

  • param - 相当于request.getParameter
  • paramValues - 相当于request.getParameterValues
  • header - 相当于request.getHeader
  • headerValues - 相当于request.getHeaders
  • cookie - 相当于request.getCookies
  • initParam - 相当于config.getInitParameters

下面这些变量允许你访问各种不同scope中储存的变量:

 

requestScope - 将request scope的变量名称映射到它们的值中。

sessionScope - 将session scope的变量名称映射到它们的值中。

applicationScope - 将application scope的变量名称映射到它们的值中。

举例来说,在JSP中,你可以这样写:

<%= request.getParameter("paramName") %>

在JSF中,你可能是这样写:

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

或者

<h:outputText value="#{param['paramName']}" />

数据类型

在JSF EL中有这些数据类型:

  • 布尔型:true或者false
  • 字符串型:使用单引号'或者双引号"进行分隔。格式类似java的String,可以使用\进行分隔。比如\"代表一个双引号。
  • 浮点型:和Java一样
  • 整型:和Java一样
  • 空:null

运算符

JSF EL中有这些运算符:

  • 算术运算符:+-(二元)*/div%mod-(一元)
  • 逻辑运算符:and&&or||not!
  • 关系运算符:==eq!=ne<lt>gt<=ge>=le。可以与其他值、或布尔型、字符串型、整型或浮点型相比较。
  • 空运算符:empty 运算符是可以用来确定值是否为 null 或空的前缀运算。
  • 条件运算符:A ?B : C。计算 BC,具体情况取决于 A 的计算结果。

运算符有不同的优先级。按从高到低,从左到右的顺序排列的运算符优先级如下所示:

  • [] .
  • ()  (更改运算符的优先级)
  • -(一元) not ! empty
  • * / div % mod
  • + -(二元)
  • < > <= >= lt gt le ge
  • == != eq ne
  • && and
  • || or
  • ? :

下面列出了一些运算符使用的例子:

 

运算式 结果
#{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
#{true and false} false
#{true or false} true
#{not true} false
#{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

 

关键字

下面列出了JSF EL的关键字,你不能用这些关键字作为bean的名字或者属性:

 

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