JSF一个页面上使用多个后端Bean

8

我已经阅读了一些内容,并进行了一些实践,但仍有一些问题,希望有人能够回答:

那么,在单个JSF页面中可以使用两个或多个后端Bean吗?

<h:intputText value="#{myFirstBean.firstProperty}" />
<h:intputText value="#{mySecondBean.secondProperty}" />

如果我能做到,为什么不去做呢?(我认为不应该做,因为没有人这样做)

如果我不能做到,为什么呢?

此外,我在某个地方读到过类似于“在页面加载时,框架将实例化后备bean,并在它是后续提交时填充它”。他们说“the”后备bean,但我不明白框架如何知道要实例化哪个后备bean。

3个回答

6
让我们先澄清几个术语:
- managed beans 是JavaBeans组件,您可以使用托管bean设施进行配置详见。 - backing beans 是与特定页面中使用的UI组件相关联的JavaServer Faces托管bean详见
因此,在单个JSF页面中可以使用两个或多个托管bean,但将与一个页面相关的UI组件绑定、监听器、逻辑等拆分为两个或多个后端bean仍然是可能的,但非常不可取,并且可能会导致很多问题和糟糕的代码。

5
Sun 公司对于 backing bean 的定义相对晦涩,我更倾向于这样描述:一个 backing bean 是一个与视图相关联的 Java(模型)类,而一个 managed bean 是该类的一个实例,它与特定的视图和作用域相关联。 - BalusC
1
确实。许多开发人员混淆这两个术语。我在这个类是为了jsf页面而创建时使用“backing bean”一词。对于其他bean(如数据模型bean),我使用“manage beans”这个术语。 - cetnar

4

为什么不呢?这是完全合法的事情。通常,为了良好的结构,一个页面应该与一个bean相关联,但是如果你想在每个页面上显示当前时间,你可以自由引用你的timeBean.currentTime,当然,在这里使用include/templating更可取。


我还在努力理解框架在处理GET请求时如何决定实例化哪些bean来显示页面。我认为问“何时”bean被实例化是正确的。我得假设是在首次访问时实例化的。 - Nir Levy
1
当在显示页面中使用时,框架将创建托管bean。当然,我们正在谈论尚不存在的请求作用域bean和会话bean。 - cetnar

2

已经有其他问题得到了解答。然而:

我在某处读到过类似于“在页面加载时,框架会实例化后台Bean,并在回发时填充它”。他们说的是后台Bean,但我不明白框架如何知道要实例化哪个后台Bean。

Bean是通过其名称进行解析的。例如,#{myFirstBean.firstProperty} 将查找名为“myFirstBean”的Bean(一个MyFirstBean类的实例)。您可以根据需要调整名称,如下所示:

@ManagedBean(name = "foo")
public class SomeClass { ... }

然后您可以通过#{foo.firstProperty}引用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接