有没有办法在运行时指定EL中使用的托管bean而不是设计时?例如。
actionListener="#{myBean.method}"
使得myBean
部分可以具有不同的值,具体取决于调用代码的JSF页面(条件是使用的任何对象而不是myBean都是从实现“方法”的公共父派生的)。
答案 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名称定义公共元素。
此方法还可以消除重复的页面定义。