本主题介绍了 JavaServer Faces 1.1 表达式语言。可以将此表达式语言与 J2EE 1.4 和 J2EE 1.3 项目(使用 JavaServer Faces 1.1 组件)结合使用。如果使用 Java EE 5 项目,则组件是使用统一表达式语言的 JavaServer Faces 1.2 组件。要查看有关该语言的文章,请参见以下 Web 页:
要查看统一表达式语言的完整规范,您必须下载 JavaServer Pages (JSP) 2.1 规范。以下 Web 页讨论了 JSP 技术并提供了下载文件的链接:
本主题适用于那些想要输入其自己的值绑定表达式,而不是使用 IDE 创建这些表达式的高级用户。其中包含以下部分:
JavaServer Faces 提供了一种在 Web 应用程序页面中使用的表达式语言 (JSF EL),用来访问位于页面 Bean 以及其他与 Web 应用程序关联的 Bean(如会话 Bean 和应用程序 Bean)中的 JavaBeans 组件。在大多数情况下,IDE 都会为您指定正确的表达式,例如,当您将组件的 text 属性绑定到数据提供器或 JavaBean 属性时。
要绑定组件的任何属性,都可以先将组件添加到 Visual Web JSF 页,然后右键单击该组件并选择“属性绑定”。随后可以使用“属性绑定”对话框选择组件的属性,并选择要将组件属性绑定到的 JavaBeans 属性。
作为将组件绑定到数据库表的一个示例,以下代码示例将引用静态文本组件。下面说明了如何生成代码示例:
IDE 会自动将该数据库表的数据提供器对象添加到页面中,并将 text 属性绑定到数据提供器的 PERSON.PERSONID 字段。您会看到该组件的文本变为 123。
PERSON.NAME 字段,然后单击“确定”以更改 text 属性到相应字段的绑定。
JSP 编辑器中的生成代码如下所示:
<ui:staticText binding="#{Page1.staticText1}"
id="staticText1"
style="position: absolute; left: 216px; top: 192px"
text="#{Page1.personDataProvider.value['PERSON.NAME']}"/>
staticText。它使用限定符 ui: 来标识 staticText 组件的 XML 名称空间。ui: 限定符在页眉中定义为 xmlns:ui="http://www.sun.com/web/ui"。此名称空间指向一个定制标记库,该标记库用于呈现组件面板的“基本”、“组合”和“布局”类别中的 UI 组件。
在 JSP 代码中,您会看到在此行上还定义了其他两个限定符:
h: - 在页眉中定义为 xmlns:h="http://java.sun.com/jsf/html",此名称空间指向一个 JavaServer Faces 定制标记库,该标记库用于呈现最初位于组件面板“标准”类别中的 JavaServer Faces 引用实现组件。
f: - 在页眉中定义为 xmlns:f="http://java.sun.com/jsf/core",此名称空间指向一个 JavaServer Faces 定制标记库,该标记库用于表示事件处理程序、验证器和其他操作。
这两个限定符的 TLD 文档位于:
binding 属性将此组件连接到 Page1 页面 Bean 中的特定 JavaBeans 对象 staticText1。binding 属性和属性 id、style 和 text 是所有的 JavaServer Faces 标记库属性。最后三个属性 id、style 和 text 在 IDE 中表示为组件的属性,并且可以在组件的“属性”窗口中进行设置。
binding 和 text 属性使用 JavaServer Faces 表达式语言。在组件的“属性”窗口中,可以使用 JavaServer Faces 表达式语言来设置 value 属性。
JavaServer Faces 表达式语言语法使用分隔符 #{},如以下部分所述。JavaServer Faces 表达式既可以是值绑定表达式(用于将 UI 组件或其值绑定到外部数据源中),也可以是方法绑定表达式(用于引用支持 Bean 方法)。该表达式还可以接受混合的类型和计算语法,以及 2.0 表达式语言的运算符。
JSF EL 可用于将 JavaBeans 绑定到组件属性,以简化组件从各种源访问数据的方式。JSF EL 表达式使用语法 #{expr};
值绑定表达式的语法与 JavaServer Pages 规范(版本 2.0)2.3 节至 2.9 节中定义的表达式语言表达式的语法类似,但是具有以下不同之处:
#{ 和 },而不是${ 和 }。
除了在分隔符方面存在区别外,这两种表达式类型在以下语义方面也有所不同:
getValue 方法)进行计算,而不是由页面的编译代码进行计算。
Application 对象,利用已配置的 VariableResolver 和 PropertyResolver 对象的可用功能,应用程序可为其提供能够带来额外功能的插件替换类。
EditableValueHolder 组件(任何输入字段组件)的值属性,则该表达式可用于修改引用的值,而不是在请求处理生命周期的“更新模型值”阶段对其进行检索。
有效的值绑定表达式示例包含:
#{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}
Reporting Period: #{Report.fromDate} to #{Report.toDate}
对于要调用 setValue 方法的值绑定表达式(例如,在更新模型值期间输入字段的 text 属性绑定),其语法被限于使用以下任一格式,其中 expr-a 是用于计算某个对象的常规表达式,value-b 是一个标识符:
#{expr-a.value-b}
#{expr-a[value-b]]
#{value-b}
当调用 ValueBinding 实例的 getValue 方法(例如,在页面呈现期间计算 JSP 标记属性上的表达式),并计算该表达式时,将返回计算的结果,计算方法如下:
. 和 [] 运算符的处理方式。expr-a.expr-b 相当于 a["expr-b"];即,使用 expr-b 表达式构造值为标识符的字符串,然后将 [] 运算符与该值一起使用。
VariableResolver 实例计算表达式中最左侧的标识符,该实例是从此 Web 应用程序的 Application 实例中获得的。如果位于 . 或 [] 运算符左侧的值是 RowSet,则右侧的对象将被视为列名称。有关这些运算符的完整计算说明,请参见下一节。
PropertyResolver 实例计算表达式中 . 或 [...] 运算符的每个实例,PropertyResolver 实例是从此 Web 应用程序的 Application 实例中获得的。
使用 . 运算符来访问变量的属性,然后可以随意进行嵌套。
在调用 ValueBinding 的 setValue 方法时(例如,在更新模型值期间输入字段的 text 属性绑定),值绑定语法的限制如上一部分中所述。实现必须执行以下处理才能计算 #{expra.value-b} 或 #{expr-a[value-b]} 格式的表达式:
expr-a 计算为 value-a。
value-a 为 null,则抛出 PropertyNotFoundException。
value-b 为 null,则抛出 PropertyNotFoundException。
value-a 为映射,则调用 value-a.put(value-b, new-value)。
value-a 为 List 或数组:
value-b 强制为 int,从而在出现错误时抛出 ReferenceSyntaxException。
value-a.set(value-b, new-value) 或 Array.set(value-b, new-value)。
IndexOutOfBoundsException 或 ArrayIndexOutOfBoundsException,则还会抛出 PropertyNotFoundException。
EvaluationException。
value-a 是 JavaBeans 对象):
value-b 强制为 String。
value-b 是 value-a 的可编写属性(按照 JavaBeans 规范),则调用 setter 方法(传递 new-value)。如果出现异常,则抛出 ReferenceSyntaxException。
PropertyNotFoundException。
如果整个表达式包括一个标识符,则会应用以下规则:
ReferenceSyntaxException。
new-value 将替代相应的属性值。
new-value。
表达式语言定义一组隐式对象:
facesContext - 当前请求的 FacesContext 实例。
param - 将请求参数名称映射到单个值中。
paramValues - 将请求参数名称映射到值的数组中。
header - 将请求表头名称映射到单个值中。
headerValues - 将请求表头名称映射到值的数组中。
cookie - 将 cookie 名称映射到单个 cookie 中。
initParam - 将上下文初始化参数名称映射到单个值中。
允许访问各种范围的变量的对象:
requestScope - 将请求范围的变量名称映射到它们的值中。
sessionScope - 将会话范围的变量名称映射到它们的值中。
applicationScope - 将应用程序范围的变量名称映射到它们的值中。
当表达式按名称引用其中一个对象时,将返回相应的对象。隐式对象比同名属性的优先级要高。例如,即使 facesContext 属性包含一些其他值,#{facesContext} 也将返回 FacesContext 对象。
表达式语言定义了以下类型:
true 和 false
" 转义为 \";' 转义为 \';而 \ 转义为 \\。
null
除了在上述获取值语义及其后面的部分中讨论的 . 和 [] 运算符外,表达式语言还提供以下运算符:
+、-(二元)、*、/、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
? :
以下单词是为表达式语言而保留的,不能用作标识符:
and
|
false
|
le
|
not
|
div
|
ge
|
lt
|
null
|
empty
|
gt
|
mod
|
or
|
eq
|
instanceof
|
ne
|
true
|