介绍JavaServer Faces 表达式语言(JSF EL)
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。计算 B 或 C,具体情况取决于 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 |
