JavaServer Faces 提供了一种在 Web 应用程序页面中使用的表达式语言 (JSF EL),用来访问位于页面 Bean 以及其他与 Web 应用程序关联的 Bean(如会话 Bean 和应用程序 Bean)中的 JavaBeans 组件。在大多数情况下,IDE 都会为您指定正确的表达式,例如,当您将组件的
text
属性绑定到数据提供器或 JavaBean 属性时。
JavaServer Faces 表达式语言语法使用分隔符 #{}
,如以下内容所述。 JavaServer Faces 表达式既可以是值绑定表达式(用于将 UI 组件或其值绑定到外部数据源中),也可以是方法绑定表达式(用于引用支持 Bean 方法)。该表达式还可以接受混合的类型和计算语法,以及 2.0 表达式语言的运算符。
JavaServer Faces EL 表达式语法
JSF EL 可用于将 JavaBeans 绑定到组件属性,以简化组件从各种源访问数据的方式。JSF EL 表达式使用语法 #{expr};
值绑定表达式的语法与 JavaServer Pages 规范(版本 2.0)2.3 节至 2.9 节中定义的表达式语言表达式的语法类似,但是具有以下不同之处:
- 值绑定表达式的表达式分隔符是 #{ 和 },而不是
${ 和 }。
- 值绑定表达式不支持 JSP 表达式语言函数。
除了在分隔符方面存在区别外,这两种表达式类型在以下语义方面也有所不同:
- 在呈现期间,值绑定表达式由 JavaServer Faces 实现(通过调用 getValue 方法)进行计算,而不是由页面的编译代码进行计算。
- 即使没有出现页面,也可以采用编程方式计算值绑定表达式。
- 值绑定表达式计算通过当前 Web 应用程序的 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 标记属性上的表达式),并计算该表示式时,将返回计算的结果,计算方法如下:
设置值语义
在调用 ValueBinding 的 setValue 方法时(例如,在更新模型值期间输入字段的 text 属性绑定),值绑定语法的限制如上一部分中所述。实现必须执行以下处理才能计算 #{expra.value-b} 或 #{expr-a[value-b]} 格式的表达式:
- 将 expr-a 计算为 value-a。
- 如果 value-a 为空,则抛出 PropertyNotFoundException。
- 如果 value-b 为空,则抛出 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
- 整型:与 Java 中一样
- 浮点型:与 Java 中一样
- 字符串型:使用单引号和双引号;" 转义为 \", ' 转义为 \',而 \ 转义为 \\。
- 空: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 |
1.from Sun
http://developers.sun.com/docs/jscreator/help/2update1/jsp-jsfel/jsf_expression_language_intro.html
2. from Java Enterprise in a NutShell
http://book.itzero.com/read/others/0512/OReilly.Java.Enterprise.in.a.Nutshell.3rd.Edition.Nov.2005_html/0596101422/javaentnut3-CHP-5-SECT-4.html
分享到:
相关推荐
这些Bean可以通过JSF EL(Expression Language)在视图层中访问,也可以接收和返回数据。 ### JSF事件类型 JSF支持多种事件类型,这些事件可以在组件之间或应用程序级别触发。例如: - **组件级事件**:发生在特定...
4. **EL(Expression Language)**:EL是JSF中的一个表达式语言,用于从后台bean中获取和设置值,以及调用方法。例如,`#{bean.property}`表示访问名为`bean`的bean的`property`属性。 5. ** Managed Beans**:在...
5. **EL(Expression Language)**:JSF 1.2中的EL是一种强大的表达式语言,用于在视图和模型之间绑定数据,以及调用Bean的方法。它简化了数据绑定和表达式评估。 6. **FacesServlet**:JSF框架的关键Servlet,负责...
它们是JSF MVC架构中的“模型”部分,可以通过JSF EL(表达式语言)在视图层与组件进行数据绑定。 **4. Facelets** Facelets是JSF的默认视图描述语言,用来创建和管理页面布局。它允许开发者使用XML或XHTML语法创建...
在实际项目中,开发者通常会根据具体需求选择合适的集成方式,例如使用Spring的`DelegatingVariableResolver`实现JSF EL表达式对Spring Bean的访问,或者通过`ManagedProperty`注解将Spring Bean注入到JSF Managed ...
### JSF_EL_介绍:深入理解JavaServer Faces表达式语言 #### 1. JSF_EL 概览 JavaServer Faces (JSF) 是一个用于构建企业级Java Web应用的框架,它提供了丰富的组件库和事件驱动的编程模型。JSF_EL,即JSF表达式...
`@ValueBinding`注解允许将属性直接绑定到JSF EL表达式,简化了数据绑定的过程。例如,可以使用`@ValueBinding("#{bean.property}")`将Bean的属性与UI组件关联。 5. **资源和国际化** 使用`@ResourceBundle`注解...
6. **库文件**:虽然在描述中提到,为了减小文件大小,`lib`目录下的`.jar`包被删除了,但JSF应用程序通常依赖于这些库,如Servlet API、EL API、JSF实现(如MyFaces或Mojarra)和其他第三方库。如果在运行时遇到...
JSF还提供了表达式语言(EL,Expression Language),用于在视图和控制器之间绑定数据。 #### 1.2 第一个 JSF 程序 JSF的初学者通常从创建一个简单的"Hello, World"程序开始。这涉及创建一个JSF页面(通常为`....
自定义组件可以定义自己的属性,这些属性在JSF EL表达式中可以访问。例如,添加一个名为`myAttr`的属性: ```java @ManagedProperty(value="#{bean.myValue}") private String myAttr; // getter and setter `...
此外,JSF的表示语言(EL)和JSP的EL在写法上有区别,JSF使用`#{expression}`,而JSP使用`${expression}`。在JSF标签的属性设置中,只能使用JSF EL。 关于相对路径的问题,JSF中的路径是相对于Web应用的根目录。...
EL是JSF中的表达式语言,用于访问和操作Bean的属性。它可以嵌入在HTML标记中,实现数据的双向绑定。例如,`#{bean.property}`表示访问名为`bean`的Bean的`property`属性。EL还可以进行基本的运算和方法调用。 五、...
JSF支持多语言环境,开发者可以创建资源包(`.properties`文件)来存储不同语言的文本,然后在JSF页面上使用EL表达式来引用这些资源,实现界面的国际化。 ### 2. Managed Beans Managed Beans是JSF中的核心组件,...
3. **EL(Expression Language)**:JSF使用EL来绑定组件属性到后台bean的属性,使得数据的获取和设置更为方便。EL表达式可以在JSP页面中直接引用bean的属性。 4. **Faces-config.xml**:这是JSF的应用配置文件,...
Java代码中使用JSP/JSF表达式语言(EL,Expression Language)是Web开发中的一个核心概念,它允许开发者在页面上动态地访问和操作JavaBean或其他数据源的数据。EL提供了一种简洁的方式来读取和设置Java对象的属性,...
3. **EL(Expression Language)**:JSF中,EL用于访问后台Bean的属性和方法,提供一种简洁的方式来在JSP页面中绑定和操作数据。例如,`#{bean.property}` 可以获取或设置Bean的属性值。 4. **FacesContext**:它是...