是的,你无法通过使用EL表达式向Managed Bean传递参数,至少目前不行,JSF1.2不行。
不对吧,你也许会说,因为EL表达式:#{securityContext.userInRole['admin']}是可以工作的。
这不就是向向一个Managed Bean(securityContext)的方法(userInRole)传递了一个参数值('admin')吗?
且慢!事情不是你看上去的那样!
EL表达式分两种,一种是ValueExpression,一种是MethodExpression。
1. ValueExpression
ValueExpression是绑定到Managed Bean的属性上的。
ValueExpression的解析原理是从左到右、按先后的部分解析,表达式的后面的部分是作为前面部分的属性。
比如,#{securityContext.userInRole['admin']}其实是和#{securityContext.userInRole.admin}等价的。
其含义都是:查找 #{securityContext.userInRole}对象的admin属性,由于#{securityContext.userInRole}是一个Map类型的对象,因此获取其admin属性,就是在Map中查找key='admin'的value值。
现在,你应该注意到'admin'是被[]包围的,而不是(),所以这不是方法调用,而是获取Map对象中的key='admin'的value值。
2. MethodExpression
MethodExpression是绑定到Managed Bean的方法上的。
MethodExpression的解析原理也是从左到右、按先后的部分解析,表达式的后面的部分是作为前面部分的方法的上下文环境。
但是目前不支持使用EL表达式向Managed Bean传递参数。
难道说,就没有办法向Managed Bean传递参数了吗?当然不是,我们可以不使用EL,通过其它方式也能达到目的。
3. 使用其它方式向Managed Bean传递参数
基本思路都是参数绑定到Managed Bean的某个属性,也就是说,方法的定义中不包括参数,但是可以在方法体中获取参数值。
(1)直接把参数绑定到Managed Bean的某个属性
比如,在页面中使用#{myBackingBean.firstname},在Managed Bean中定义firstname属性,以及getter和setter方法。
(2)把变量值放到Memory Scope中,然后在Managed Bean中获取,详见《使用Managed Bean访问各个Scope变量》。
(3)通过ADF Binding保存变量,然后在Managed Bean中获取,详见《ADF工具类:JSFUtil.java 源代码》和《ADF工具类:ADFUtil.java 源代码》。
(4)通过在faces-config.xml或adfc-config.xml中的Managed Bean的定义传递参数。
<managed-bean>
<managed-bean-name>userbean</managed-bean-name>
<managed-bean-class>com.oracle.sample.User</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>userType</property-name>
<value>#{reference['USER_TYPES'].['EMPLOYEE']}</value>
</managed-property>
</managed-bean>
当然,我承认,如果EL表达式能够支持,是最简洁一种实现方式。
参考文献:
1. https://blogs.oracle.com/jdevotnharvest/entry/passing_parameters_to_managed_bean_method_using_el
2. https://forums.oracle.com/forums/thread.jspa?messageID=3963557
3. https://forums.oracle.com/forums/thread.jspa?threadID=1039258
没有评论:
发表评论