方法表达式的写法与值表达式类似,但是不是用来接收和设置托管Bean的属性。方法表达式是用来调用托管Bean的公共非静态方法。方法表达式语法是值表达式语法的子集,只能使用访问类型的操作符(圆点操作符.和方括号操作符[])遍历对象层次结构来访问公共非静态方法,其它的算术、关系、逻辑、条件、空值操作符对方法表达式不适用。
例如下面的代码点击按钮后会执行testBean的buttomClick()方法。
<w:button label="提交" action="#{testBean.buttomClick}" />注意:不能向EL方法表达式传递参数。方法表达式的参数取决于使用方法表达式的上下文环境。具体细节参考下表:
表 14.3. 各接口(构件)方法表达式参数细节
| 接口类型 | 标签属性 | 参数 | 说明 |
| ActionSource(ActionSource2) | action | 无 | 激活构件时调用的方法,其结果会引起导航 |
| ActionSource(ActionSource2) | actionListener | ActionEvent | 激活构件时调用的方法 |
| EditableValueHolder | valueChangeListener | ValueChangeEvent | 检测到某个构件的值发生变化时被调用 |
| f:view标签特有 | beforePhase | PhaseEvent | 请求处理生命周期的2-6阶段执行之前被调用 |
| f:view标签特有 | afterPhase | PhaseEvent | 请求处理生命周期的2-6阶段执行之后被调用 |
需要注意的是:ActionSource构件的action属性有点特殊,但既可以接受方法表达式也可以接受字符串。当指定的是字符串时,EL系统会创建一个特殊的EL方法表达式,它只会导航,不会执行其它方法。