3

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

4

2 回答 2

5

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

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

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

如果您事先不知道 bean 范围和/或未事先创建 bean,那么您需要创建一个执行 EL 的实用程序函数Application#evaluateExpressionGet(),以便可以使用如下方式:

actionListener="#{util:getBean(beanName).method}"
于 2012-08-28T13:07:23.007 回答
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名称来定义公共元素。

这种方法还使您能够消除重复的页面定义。

于 2013-10-20T13:54:59.697 回答