EL(Expression Language),即所谓的表达式语言,前面我们已经见过一些表达式语言的例子,即所有位于#号之后的一对花括号之中的字符串("#{...}")。
EL表达式的主要用途是使你可以引用和更新LiteBean的属性,调用LiteBean的方法,或者执行简单的语句,而不用写完整的Java代码。在OperaMasks中,EL表达式通常用来关联UI构件属性至托管Bean或者应用中的模型对象,或用来关联UI构件的事件至后台Bean的监听方法。它们不是在应用被编译时求值,而是在每次表达式被使用时求值,这叫做延迟求值。
值表达式是OperaMasks应用中最常见的表达式应用。它允许用紧凑的方式在运行时动态地计算结果或设置Bean的属性。值表达式可以用来计算单个值(如托管Bean的属性),也可以用来计算表达式的值(最终计算结果来自多个来源)。
值表达式一般用来在Web页面中显示数据。此时需要对表达式求值,当要对一个EL表达式求值时,EL系统会把表达式分解为两个部分:基和属性,基是第一个圆点之前的部分,属性是第一个圆点之后的部分。基负责指示在哪里寻找实例,而属性则负责指示从基中取得的实例属性。在求解表达式过程中,如果属性中还包含圆点的话,就会被递归地划分为更小的基和属性。表达式求值时对属性的访问一般是调用它的get方法(boolean型变量是is方法),例如#{userBean.name.firstName}实际上调用的是userBean的getName().getFirstName()方法。
值表达式除了可以用来引用Bean的属性外还可用来以更新模型数据。将一个构件有value属性且这个属性可以在Web页面中编辑时(构件实现了EditableValueHolder接口),在回传时,页面的值可以被更新到模型Bean的属性。这个动作发生在请求处理生命周期的更新模型值阶段(关于请求处理生命周期的更多信息请参考第 12 章 请求处理生命周期),此过程中Bean中属性的set方法会被调用。例如:#{userBean.age}实际上调用的是userBean的setAge()方法。