EL中bean的动态选择

时间:2012-08-28 12:58:18

标签: java jsf el

有没有办法在运行时指定EL中使用的托管bean而不是设计时?例如。 actionListener="#{myBean.method}"使得myBean部分可以具有不同的值,具体取决于调用代码的JSF页面(条件是使用的任何对象而不是myBean都是从实现“方法”的公共父派生的)。

2 个答案:

答案 0 :(得分:5)

如果您事先知道bean范围并且已经预先创建了bean,那么是的,可以使用以下语法:

actionListener="#{requestScope[beanName].method}"

其中#{requestScope}表示请求范围映射(相同的映射可用于视图,会话和应用程序范围),#{beanName}表示包含托管bean名称的变量。

如果您事先不知道bean范围和/或事先没有创建bean,那么您需要创建一个实用{EL}函数来执行Application#evaluateExpressionGet(),这样就可以了使用如下的东西:

actionListener="#{util:getBean(beanName).method}"

答案 1 :(得分:0)

如果您的问题涉及为具有共同元素的多个子类生成一组页面,您还可以使用页面组合来实现此目的。

例如,如果Resident和NonResident是Person的子类的托管bean:

例如。在'non-resident.xhtml'

<ui:define name="body">
    <ui:param name="Controller" value="#{NonResident}"/>
    <ui:include src="anyone.xhtml"/>
</ui:define>

和'resident.xhtml'

<ui:define name="body">
    <ui:param name="Controller" value="#{Resident}"/>
    <ui:include src="anyone.xhtml"/>
</ui:define>

然后'anyone.xhtml'可以使用'Controller'为bean名称定义公共元素。

此方法还可以消除重复的页面定义。